2 hehuang139 hehuang139 于 2015.07.26 22:42 提问

接口的作用 面向对象设计

不好意思,也许我这个问题很低级,但是困恼自己好久,今天鼓起勇气问下大家,希望各位oo大神能不吝赐教
如题,有一个和接口非常相似的存在:抽象类,它们都是对职责的抽象,区分2者还是比较简单的,抽象类表示是is-a,表示一个类型,是类型的抽象,而接口是行为的抽象。
一个抽象类的方法并不能用来用来定义一个类型,举个例子:猫会叫,但是会叫的不一定是猫,比如说闹钟也会叫。既然如此,那一个行为到底是该定义在抽象类中,还是应该定义在接口中。比如说刚才的例子,叫这个行为到底应该定义在猫中,还是应该定义在ISayable接口中?问题在推广下,何时该把类中的行为抽出来定义成一个接口,也就是何时该使用接口?个人意见这里面一定有业务层面的考虑,没有一个决定的标准,比如说如果只有一个猫这种抽象,没有闹钟这个抽象就没有必要用专门定义一个ISayable接口
经常有接口的滥用,个人认为接口的滥用更多的是凡是都用接口,比如现在的service+impl设计模式,明明只有一个实现类,一定要都定义一个接口
目前自己的开发经验是这样的:从重构的观点去看接口的定义,一开始是没有任何接口的,只有无所的类,在需求不断变更中,发现共性的行为及行为的不同实现,在抽取成接口。也就是说在承认自己水平不够的情况下(无法一下子考虑行为的抽象),不建议一开始就定义接口,而是随着需求的变化中去添加接口

4个回答

CSDNXIAOD
CSDNXIAOD   2015.07.26 22:52
已采纳

面向对象设计之接口分离原则
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

hehuang139
hehuang139 思路是有建设性的,是不是从对象协作的角度去看这个问题,一次交互的最小功能集应该划分成一个新的接口。不错,确实是可以这样考虑
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.07.26 22:55

你说的没有错。分层的目的最终是为了层的替换,但是培训班往往为了分层而教你分层。所以机械地把代码抽象成接口,再创建唯一的实例。

这离真正的软件设计相去甚远甚至背道而驰。

你自己总结的很好,定义接口并不是只有优点没有缺点的。一旦你定义了接口,那么这个接口中的方法必须被实现,无论它有没有意义。所以根本不懂软件设计的人草率地定义一个接口,会给项目带来很大的问题。后续的开发者无法轻易修改接口,因为你要修改接口意味着你必须保证它的全部实现的代码都必须追回来修改。

hehuang139
hehuang139 苦恼
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.26 23:37

接口的使用,你自己总结的是一种使用的场合。
还有一种场合就是接口用在模块之间。
比如c++中,我喜欢把接口指针封装在一个dll的导出函数的参数中。外部调用者通过这个方法得到一个接口类指针,然后调用接口的方法得到各种功能,这样dll只需要导出一个方法。

还有一个好处就是这样以后我的接口有了新方法,它只需要更新接口类的头文件就可以使用。

Evankaka
Evankaka   Ds   Rxr 2015.07.27 12:34

公司的项目都是定义成接口类的,抽象类还是比较少。接口的定义肯定一般都要提前想好。比如dao层的接口,基本上都是一样的,就可以结合范型来用

hehuang139
hehuang139 dao 的应用非常的明确,存在很强的复用,所以使用接口没有问题。如果不谈dao这种场景,只是一般的业务抽象,何时该将共性行为抽成接口,个人认为这是需要斟酌的;抽的太多,导致接口太多,太少则可能导致抽象类的职责过于臃肿,这个平衡很难把握。在这里提这个问题的目的也是为了探讨在实际编程开发中的一种最佳实践。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片