接口的作用 面向对象设计

问题描述

接口的作用 面向对象设计

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

解决方案

面向对象设计之接口分离原则

解决方案二:

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

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

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

解决方案三:

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

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

解决方案四:

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

时间: 2024-10-31 21:17:21

接口的作用 面向对象设计的相关文章

《.NET程序员面试秘笈》----面试题9 举例描述接口的作用

面试题9 举例描述接口的作用 .NET程序员面试秘笈[考点]接口类型的理解,接口在程序中的意义. [出现频率] [解答] 接口在程序设计中的作用为充当类或结构的功能界面,接口的属性.方法等属于抽象描述必须通过类或结构的实现才能使用.接口是使用者只知道接口有些什么功能,却不知道功能如何实现.由谁实现,这给程序的设计留下了很大的灵活性.例如某个项目由多个功能模块组成,每个模块由一个程序员完成,程序员只需编写完模块功能的实现后,留下该模块的接口供其他人使用.其他人在程序中只需直接使用接口的功能,而不必

《设计模式》学习笔记1——七大面向对象设计原则

前言 根据这一次的学习计划,系统学习设计模式之前,先系统学习和理解设计原则.面向对象设计原则有如下几类. 原则一:单一职责原则 这是面向对象最简单的原则,对于定义,引用书中所说: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因 这里最重要的地方,我个人觉得应该是一个功能领域这一句. 设计的前提是思考,只有进行了思考才能谈得上设计,所以实际设计过程中最重要的还

《面向对象设计实践指南:Ruby语言描述》目录—导读

内容提要 面向对象设计实践指南:Ruby语言描述 本书是对"如何编写更易维护.更易管理.更讨人喜爱且功能更为强大的Ruby应用程序"的全面指导.为帮助读者解决Ruby代码难以更改和不易扩展的问题,作者在书中运用了多种功能强大和实用的面向对象设计技术,并借助大量简单实用的Ruby示例对这些技术进行全面解释. 全书共9章,主要包含的内容有:如何使用面向对象编程技术编写更易于维护和扩展的Ruby代码,单个Ruby类所应包含的内容,避免将应该保持独立的对象交织在一起,在多个对象之间定义灵活的接

Java程序员应当知道的10个面向对象设计原则

(设计原则)底线是永远追求高内聚.低耦合的编码或设计. Apache 和 Sun的开源代码是学习Java和OOPS设计原则的良好范例.它们向我们展示了,设计原则在Java编程中是如何使用的.Java JDK 使用了一些设计原则:BorderFactory类中的工厂模式.Runtime类中的单例模式.java.io 类中的装饰器模式.顺便说一句,如果您真的对Java编码原则感兴趣,请阅读Joshua Bloch 的Effective Java,他编写过Java API.我个人最喜欢的关于面向对象设

程序员应知道这十大面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式, 而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不

《面向对象设计实践指南:Ruby语言描述》—第1章 1.3节设计行为

1.3 设计行为 面向对象设计实践指南:Ruby语言描述 随着常见设计原则和模式的出现与传播,所有的OOD问题可能都已被解决.既然基础的规则都已知道,那么设计面向对象的软件还会有多难呢? 事实证明,它非常难.如果将软件理解为可定制的家具,那么原则和模式便像是木工的工具.了解软件在完成后会是什么样子,并不能让它自我构建成那个样子.应用程序之所以存在,是因为有程序员使用了这些工具.最终的结果可能是,它要么成为一个漂亮的橱柜,要么成为一张摇摇晃晃的椅子.具体是哪一种结果,则取决于程序员使用设计工具的经

《面向对象设计实践指南:Ruby语言描述》—第1章 1.1节设计赞歌

第1章 面向对象设计 面向对象设计实践指南:Ruby语言描述 世界是过程式的.时间不停在向前流动,而事件也一个接一个地逝去.你每天早上的过程或许就是:起床.刷牙.煮咖啡.穿衣,然后上班.这些活动都可以使用过程软件来建模.因为了解事件的顺序,所以你可以编写代码来完成每一件事情,然后仔细地将这些事情一个接一个地串在一起. 世界也是面向对象的.与你互动的对象可能包括有你的老伴和猫,或者是车库里的旧汽车和一大堆的自行车零件,又或者是你的那颗扑通跳动的心脏,以及用来保持健康的锻炼计划.在这些对象中,每一个

《面向对象设计实践指南:Ruby语言描述》—第1章 1.2节设计工具

1.2 设计工具 面向对象设计实践指南:Ruby语言描述 设计可不是遵循一套固定规则就完事的动作.它是每次沿着一条分支前进的旅行,在这条路径上早期的选择关闭了某些选择,同时又会打开其他新的选择.在设计过程中,你会徘徊于各种错综复杂的需求中,这里的每个关键时刻都代表着一个决策点,它会对将来产生影响. 像雕塑家有凿子和文稿一样,面向对象的设计师也有自己的工具-原则和模式. 1.2.1 设计原则 SOLID原则首先由Michael Feathers提出,再由Robert Martin进行了推广.它代表

《面向对象设计实践指南:Ruby语言描述》—第1章 1.5节小结

1.5 小结 面向对象设计实践指南:Ruby语言描述 如果某个应用程序存活了很长时间(也就是说,如果它成功了),那么它最大的问题将是如何应对变化.通过代码编排有效地应对变化是设计的事情.最常见的设计要素是原则和模式.不幸的是,即使正确地运用了原则,并且也恰当地使用了模式,也无法保证能够很好地创建出易于更改的应用程序. OO度量能暴露出应用程序在遵循OO设计原则方面的情况.糟糕的度量值强烈地表明将来可能会遭遇困难:不过,好的度量值也发挥不了太大的作用.一个做法有问题的设计也可能产生出很高的度量值,