`
lonelybug
  • 浏览: 11772 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

解释一下,为什么需要接口而不直接实现类。

阅读更多
看了这里的一些帖子和很多地方的帖子,很多人都在问为什么非要interface或者abstract class,然后还要在写一个实现类,而其实,我就市要做一个很简单的功能!?

对,如果你制作一个简单的功能,我同意你可以直接使用spring hibernate等框架来写,他们本身的好处也是干这个的。

但是,中国人有句老话,叫做杞人忧天,很多的时候,你有没有内心问自己,这个系统,我设计的,如果老板要改动,我可以在很短的时间内做到改变么?

当你问自己这个问题的时候,你就已经把直接写实现类的做法怀疑了。

面向接口的原则,不是只出现在程序员或者说IT界,接口设计是人类对一个问题或者一个物体的概括理解能力的表现。我们日常生活中处处有接口。

在我作一个简单的说明之前,我要补充以下,系统框架中,除了层的概念,还有一个叫做boundary,每一个layer(层)是由不同的boundary(box)组成。

举例一二三,比如,简单的说,发电厂就是实现类(implementation class),每个发电厂都是独立的boundary,而发电厂就是统称为一个layer,也许还不明白,比如,我们平时说,发电厂,没人关心你家的电来自于那个发电厂,而关心的是你家的插座有没有电,所以三项插座,二项插座至十发电厂给用户的最终接口。发电厂之间也是通过一个特殊的工业接口来互相访问,所以,这也是为什么说,有时候有的发电厂在夏天负担过重,就可以把负担分给其他的电场供应。反过来,如果让老百姓天天关心的是发电厂,而不是插座,那你觉得这样的城市电力设计是不是很糟糕呢?

在举个例子,比如果.....,嗯,好,就说汽车,汽车都见过吧,四个轮子,一个方向盘,但是,你们有没有发现,有时候你们的汽车上面的音响系统坏掉或者要升级的时候,只需要取下中间面板上面的那个独立的音响播放器,然后买一个新的,由汽车维修给你们撞上就可以了,不管是飞利浦,boss还是简单的radio的和卡带的,你们从来不会在买一个汽车音响的时候关心他能不能安在汽车上,而是可以完全关心颜色,款式,品牌这些问题上,如果,反过来设计,每一个汽车品牌都直接实现自己的独立设计,不遵循工业接口,那你觉得这样的汽车音响会有很多选择么?

最后在举一个我们每天息息相关的例子,门,每天人们通过不同的门,进入或者走出不同的地方,而门就是那个地方或者建筑物的接口,如果说,我们反过来,每个大厦或者建筑物都直接应用自己喜欢的实现进出的方式,那你们觉得每天的生活会不会有点太麻烦?

我举例子只是来简单的解释一下,接口不是一个繁琐的过程,而是每个工业,甚至是每天生活中,我们必须应用到的东西,所以,如果看待现在的文明社会用程序员的方式的话,那么就是一种接口世界,现实生活中很多人叫做标准或者协议,由看得见摸得找的,也有看不见摸不着的接口。

很多人可能想对我举的例子进行进一步的反驳,其实没有必要,如果你要跟我探讨每一个例子来映射程序中的接口问题,那就是在抬杠,抬杠很浪费时间,所以,我不会跟你探讨例子的问题,那就是个例子,而这个例子是每天确实发生的,使用的。

希望能解释明白一点在程序设计中接口编程的优势所在。
分享到:
评论
81 楼 lcllcl987 2008-10-08  
悲哀的看到关于interface的帖子再次成为焦点.
估计相当多的兄台在开发中:
1:不做单元测试.
2:模块间的开发不需分工,协同作业.
3:不关心最佳实践.
4:不关注现有系统的扩展性.
80 楼 抛出异常的爱 2008-10-08  
jacklondon 写道
bojianpc 写道
WhisperXD 写道
接口其实更多的用于抽象和规约
比如协同工作期间,订立接口有助于双方相互间调用的规范。
同时也有助于自顶向下的思考。
在内部实现中,接口实现多态也有不少用处,不过也不是每一个地方都要用。
实现好了,需要的时候简单重构一下,就能获得接口的相关特性。
同意

严重不同意!!!
双方相互间调用的规范是靠文档,而不是靠“接口”。当我们用 java String 类的时候,是否有人关心 String 是否是接口?没有吧?当我们调用 windows/linux API 函数的时候,我们只要看文档就明白怎么调用,要“接口”做什么用?
我发现大家都很会忽悠!

javadoc靠注释生成成API
PS:
接口可以约束实现......
减少冗余参数.....
开闭原则(就是说很多方法不用设成private了反正用的时候看不见......)
引用
1. private 方法怎么测试?
   public 方法都覆盖到了就行了。

79 楼 killjim 2008-10-08  
这个问题。。
其实现在的开发中很多业务开发对于接口并不是十分的了解,只是项目开始时规定了怎么去用比如SS:AC,FB,IA,接口实现,业务层。这是开发前规定好的,你不这么做代码评审时会被KO的。
一些业务上的代码运用接口其实没什么必要。
78 楼 bojianpc 2008-10-08  
WhisperXD 写道
接口其实更多的用于抽象和规约
比如协同工作期间,订立接口有助于双方相互间调用的规范。
同时也有助于自顶向下的思考。
在内部实现中,接口实现多态也有不少用处,不过也不是每一个地方都要用。
实现好了,需要的时候简单重构一下,就能获得接口的相关特性。
同意
77 楼 ladofwind 2008-10-08  
照LZ意思,PC各大厂商也可以全把板卡焊在一起,互相不兼容,还要什么PCI,IDE接口干嘛?
76 楼 lean1252 2008-10-08  
我感觉用接口,利于代码重构,也易于维护。:-)
75 楼 Julien 2008-10-07  
跟这位axeon大神无关,我想说的是,接口这玩意本身也是有依赖性的,两个一摸一样的的接口只要声明的名称不同认定的就是不同的接口,这样两个包相互不需要管理对方存在特性就能彼此合作的松耦合还是做不到,接口自身仍旧还是包的一部分。
而且现在反射好用了之后,类的桎梏基本上也可以打破了,两个完全没有接口和类继承体系关系的对象可以靠(可配置的)属性(和过程?)名称来相互通信,伪ducktype勉强可以成立,世界已经大同了,接口先辈您就微笑着看着俺们建设社会主义吧……
74 楼 。。。 2008-10-07  
jansel 写道
不管是SSH还是别的IOC框架,这些框架大家只要按照一定个约束去Coding就可以了。

我是深受上百万行代码难以维护的害了,那些代码里面基本上充斥的都是静态方法,类之间的依赖大家都没有办法想象。

所以才会去用框架去解决这些问题,对于自己的产品来说,维护我现在放在第一位了。开发效率低不要紧(纯粹的JSP+JAVABean开发是很快,但是维护也难,关键是不容易建立一套约束的东东)

如果从维护角度考虑,我宁愿去分层,层与层直接会用接口实现。


像我现在做的,dao-manager-service-action搞了这么多层,到头来业务逻辑还有写到存储过程里的。维护起来那叫一个要命,还要在这基础上开发新版本。我已经有闪人的打算了。
73 楼 。。。 2008-10-07  
jacky2007 写道
很多时候定义接口的跟写实现类的并非同一人....


虽然很喜欢Interface,不过....

说实话,非常厌恶这种开发方式。
72 楼 cc0128 2008-10-07  
jsp+javabean开发飞快啊~
出问题就爽了
71 楼 daquan198163 2008-10-07  
lonelybug 写道

但是,中国人有句老话,叫做杞人忧天,很多的时候,你有没有内心问自己,这个系统,我设计的,如果老板要改动,我可以在很短的时间内做到改变么?

你这成语用的,真是……南辕北辙,我反复推敲半天才看出来,原来楼主是在提倡用接口!
70 楼 daquan198163 2008-10-07  
记得当初大家盛赞Spring的功德时,经常提的一条是“极大降低了面向借口编程的成本”,我猜测就是这句话导致接口泛滥现象
其实没有接口一样DI,需要接口的唯一理由应该就是“有多个实现策略”
或许Mock测试也算一个理由,但那也是以前的事了,现在easymock可以mock具体类了
69 楼 liusong1111 2008-10-07  
其实我是来吵架的:
axeon 写道
除非是逻辑复杂的应用,否则都不需要搞一个接口什么的。
试问,现在80%的web应用中,有几个真的有非要接口不行的?

如同spring的依赖注入,学术价值远高于实用价值。

java本身是不错的,就是因为这些劳什子不实用的玩意,被搞的一团糟。


抛出异常的爱 写道
啊,原来作web应用是没有逻辑的.....那写软件干什么?


寻找出路的苍蝇 写道
ls的ls,你做过web应用?你用过spring?


Ethan 写道

楼上的这位可能对Spring是个啥还没弄清楚就在这里胡邹了!所谓的逻辑何来复杂?何来简单?我看是你从根本上没有一个对于设计以及java编程的深刻认识,才会发表这样的言论。只要是严格按照设计的思路按照面向对象的概念来写东西,不用想一定是按照接口编程的思想来实现。
顺便再踩一脚,假如你所经历的应用都按照你的思路开发的话,两个字:垃圾!


liusong1111 写道
"复杂逻辑"和"没有逻辑"是不一样的,看来某些人自己就不讲逻辑。


axeon 写道
嘿嘿,各位息怒。

我搞java开发的时候,你们还不知道在哪里呢?

业务逻辑的复杂是一回事儿,技术实现的复杂是另外一回事儿。
如果业务本来就足够复杂了,再加上复杂的技术实现,等于复杂*复杂,会做的更好?

再说了,一个接口会包含多个实现么?我想大部分时候一个接口都只有一个实现类吧?
复杂业务逻辑就必须搞个接口,证明自己?

为什么你们听到我的话会跳起来?
从心理上说,你们实在无法接受把复杂问题简单化处理,这样做技术太没面子了!都不好意思跟人打招呼,只是你们的思维惯势。
从技术上说,你们也就搞过java,技术的积淀浅薄。就连spring的这些好处,也都是别人吹给你听的!你们根本就不能真正明白spring为什么这么做,利弊都在哪里。你们跳不出java的圈子,所以根本就不能真正理解java。

知道么?
心理素质差+技术水平次,就是你们做出如此反应的根本原因。

实在抱歉啊!


calmness 写道

呵呵,用资历来砸人可不是明智的做法。



robbin 写道

四、不要过多摆资历,从某种意义上来说,摆资历是露怯的表现。



选择性无视啊!
68 楼 jansel 2008-10-07  
不管是SSH还是别的IOC框架,这些框架大家只要按照一定个约束去Coding就可以了。

我是深受上百万行代码难以维护的害了,那些代码里面基本上充斥的都是静态方法,类之间的依赖大家都没有办法想象。

所以才会去用框架去解决这些问题,对于自己的产品来说,维护我现在放在第一位了。开发效率低不要紧(纯粹的JSP+JAVABean开发是很快,但是维护也难,关键是不容易建立一套约束的东东)

如果从维护角度考虑,我宁愿去分层,层与层直接会用接口实现。
67 楼 daquan198163 2008-10-07  
竟然8页了,没时间全部看过,直接针对主贴说了:
这是一个不小的话题,如果不限定范围是很难讨论的,鉴于论坛里大多是做应用开发的,所以讨论的范围应该限定在——“应用开发需要那么多的接口吗?”
我的感觉是基本不需要,需要接口和不需要接口的场合估计连2/8开都不到
可能大家经常跟JDBC、J2EE打交道,所以产生了接口很多的错觉,其实那恰好不属于应用的范畴,他们用接口、抽象类是合理的,但不代表我们也需要(那么多)
J2EE就好比房子的水电煤设施,我们开发的应用好比电视、洗衣机、冰箱
由于我经常搬家,所以感触颇深,如果房子的水电基础设施不是实现了同一个接口的话,那搬一次家就相当于失一次火啊!
66 楼 robbin 2008-10-07  
Ruby on Rails之所以不需要依赖注入,主要的原因在于Rails框架已经自动的把你需要的所有的东西统统给你注入进来了。或者可以这样说,Rails框架本身就是一个无所不包的IoC容器。反过来说,如果你不遵循Rails框架的规范,非要自己搞一套,那么自己注入依赖就会是一件非常麻烦的事情。

65 楼 otom31 2008-10-07  
这篇文章写的不错,有同感,有位兄台 在说 80% 的WEB应用不需要接口,完全可以忽略,只能说他做的工作是在忽悠人,或者自己对开发根本没有深刻体会!!太浮躁了!!!
64 楼 Readonly 2008-10-07  
2008北京奥运都开完了,竟然还有人讨论IoC/DI/Interface
偶不禁怀疑是有人在写2003的穿越文

Java就是八股文,与其隔三岔五地讨论DI/Interface是否有必要,还不如去研究为什么Ruby/JavaScript/Python这些语言不需要接口,不需要DI
63 楼 KKFC 2008-10-07  
Steve Yegge最近的一个帖子触动了开发社区的神经。Steve主张将代码数量保持在一个绝对的最小值,是软件开发中最重要的事情。依他的看法,即便仅仅出于缩减代码行数的理由,你或许也该牺牲一些设计模式和避免一些重构。如果问题域太大,做不到这一点——那么你可以换到另一种编程语言。

这个帖子的背景是Steve曾经用Java写了一个在线游戏,现在已经达到了500,000行代码,他无法再自己一个人维护这么大的代码库。因此不久前他把游戏撤了下来,现正用JavaScript重写。

不久之前InfoQ总结过对依赖注入的争论,Steve把DI也归入了代码肿胀的类别:
引用

   像依赖注入这类流行的新Java设计模式,Ruby、Python、Perl和JavaScript程序员可能从未听过。即便听过,他们也很可能(正确地)断定自己不需要它。依赖注入是一种极其精妙的基础架构,它在某些方面令Java更加动态,而那些方面正是更高级语言的本质所在。而且,用不着猜,DI会让你的Java代码库变得更大。

    用Java就要忍受它变大。活着就要生长。Java就像是俄罗斯方块游戏,没有哪一块能完全填满其他块造成的缺口,而不造成新的缺口,因此你只能无休止地叠下去。

http://www.infoq.com/cn/news/2007/12/does-lines-of-code-kill
62 楼 axeon 2008-10-07  
方法总是有的,但是ssh本身和ssh所倡导的解决方案,诸如接口和分层,这个大大降低了开发效率和可维护性。ssh本身的效率问题,也是个大问题。

给我的感觉ssh并没有解决实际问题,这是我对ssh不感兴趣的最大原因。

一个ssh项目,无论从开发,还是后期维护,还是系统运维上来说,都相当不符合当前技术发展的要求。

对于ioc/di,我想现在仍然是有争议的技术。新概念、技术的提出者总是高调的,不同意见者相对低调一些,这也是新技术容易推行的原因,但是不能代表总是对的。

当然,robbin你说的也是有道理的。

相关推荐

    调用接口怎么知道使用的是哪个实现类.doc

    调用接口怎么知道使用的是哪个实现类 Java通过接口调用方法的时候,怎么知道调用的是哪个实现类 当调用接口中的方法时,如何判定用的是哪个实现类 一个接口有多个实现类,怎么知道调用了哪个实现类

    ArcGIS Engine 9.1类,接口一览表

    一个实现类一般实现了相当多的接口,为了避免所实现的接口出现方法重名,另外对这些方法有好的分类,故把实现类对象赋值给接口类型的对象,而不是直接用类来创建对象。由于创建的对象是某个接口类型的,则这个对象就...

    Android代码-用于多module间通信的接口化框架,不需要显示注册,不用关心初始化的先后顺序,不用担心实现类的不存在引起的崩溃

    通过控制反转实现module间服务提供、Activity跳转,Activity支持参数自动处理传递的参数,不需要繁琐的注解标注 多接口支持。优点在于不必要暴露所有接口,只需将需要的接口暴露,比如一个服务可能支持多个功能,但是...

    (1)定义4个接口:UserDao、BoardDao、TopicDao、ReplyDao (2)编写UserDao接口的实现类UserDaoImp1

    需求说明 (1)定义接口:UserDao、TopicDao (2)声明接口的方法 ...(2)常量可以使用接口名直接调用:接口名.常量名 (3)char sex=gender==1?’女’:’男’;//条件运算符,作用等用如下条件语句:

    java实现接口返回数据实体类属性大写变成小写

    接口中我使用了缓存,以及在返回数据时候用了响应实体包装了, 没有直接返回数据库映射实体类。 怀疑问题点: 响应实体包装实体类中的字段有误,全部写成了小写字母? 缓存在出入库的时候会自动转化大小写。 问题...

    接口开发、springboot、接口转发、前端直接调用图床API时我们发现会报错,编写一个后端接口进行代理即可解决,已实现的例子

    前端直接调用图床API接口报错,利用后端接口进行文件转发实现接口反向代理 使用Spring Boot内置的`RestTemplate`来实现。以下是一个基于`RestTemplate`转发文件上传请求到目标服务的示例 主要运用了以下技术: 1. ...

    基于接口实现的信号滤波器 v1.0

    很多初学者对C#接口的作用不了解,于是我写了“基于接口实现的信号滤波器示例”源码,供大家参考理解注意事项:开发环境为Visual Studio 2010,使用.net 3.5开发更新内容: 1、采用2种方式生成接口:一是新建实现...

    接口和抽象类的区别(面向对象)

    接口与抽象类的区别 抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。 动物类要有呼吸方法。...总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

    基于C#的异步代码的生成器项目源码,可在接口,类,结构体上工作

    对于接口,他需要实现类实现所有方法,所以必须在接口和实现类中都添加标签。其次,在实现类中,必须指定Deep属性标签,用于深度搜索接口。该值是int类型,表示深度层次。然后他会自动补充异步方法。 3.3 扩展实例...

    kuaidi100通用型接口,已封装查询,直接传参即可,另实现收费版的数据排版功能

    封装了一个kuaid100的代码,...KuaidiReader:为信息格式化处理类,为满足深层次需求,将免费版返回的html格式内容直接格式化去除对应自己需要的数据,可以直接后台完成后,传参到前台排版成自己网站前台想要的格式。

    dot Net中抽象类与接口的区别

    详细介绍了dot Net中抽象类与接口的区别 3.1 相同点 • 都不能被直接实例化,都可以通过继承实现其抽象方法。 • 都是面向抽象编程的技术基础,实现了诸多的设计模式。 3.2 不同点 • 接口支持多...

    java包与接口实验报告

    包与接口实验报告 实验 包与接口 【实验目的】 1. 了解Java 中包(package)、接口(interface)的作用。...接口解决了Java 不支持多重继承的问题,可以通过实现多个接口达到与多重继承相同的功能。

    抽象类、接口、委托、类和结构.pdf

    实现接口的任何类或结构都必须实现其所有成员。 接口可以选择性地定义其部分或全部成员的默认实现。 接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。 一个类或结构可以实现多个接口。 一个类可以...

    Java中抽象类和接口的区别与作用详解

    abstract class,只可以包含抽象方法,也包括一些常量的定义,丝毫不带半点实现细节,它只提供接口,可以有数据成员,默认是、同时也必须是static & final型,可以通过Interface name直接访问。Interface可以实现...

    动态实现接口

    很好的 动态实现接口 ,自定义类加载器,动态编译,是接口能直接运行

    基于接口实现的信号滤波器示例源码 SUMSignalFilterBased.rar

     1、高通滤波器(类SignalFilterPassHigh,实现了接口ISignalFilter的所有方法)和低通滤波器(类SignalFilterPassLow,实现了接口ISignalFilter的所有方法)都有滤波功能(接口ISignalFilter定义了滤波器的功能:...

    ThinkPHP实现支付宝接口功能

    分享个ThinkPHP 3.2.3最新版本整理支付宝类,支付宝接口相信很多人都开发过,但要在框架中自己去整合还是需要时间的,为了减少大家的时间,我把个整合好的支付宝类分享给大家。 注:ThinkPHP使用最新版本才能使用哈...

    微信接口C#.net

     微信公众号支付是基于微信公众号而开发的支付接口,在已有的公众号里可以添加ASP的公众号支付,微信中生成订单后,可以直接调出微信钱包直接支付,非常方便,同样支持自动更新订单状态,刷卡支付则适用于商场类的...

    NetBeans中实现java的一个接口

    NetBeans中实现java的一个接口,主要写一个接口使得任何类都可以直接操作界面上的控件!

    C#中实现判断某个类是否实现了某个接口

    有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候。 简单来说,可以使用Type.IsAssignableFrom方法: typeof(IFoo).IsAssignableFrom(bar.GetType()...

Global site tag (gtag.js) - Google Analytics