当前位置:  开发笔记 > 编程语言 > 正文

为什么大多数系统架构师都坚持首先对接口进行编程?

如何解决《为什么大多数系统架构师都坚持首先对接口进行编程?》经验,为你挑选了5个好方法。

我读到的几乎所有Java书都谈到了使用接口作为共享对象之间的状态和行为的方式,当第一次"构造"似乎没有共享关系时.

但是,每当我看到架构师设计一个应用程序时,他们首先要做的就是开始编程接口.怎么会?您如何知道该界面中将出现的对象之间的所有关系?如果您已经了解这些关系,那么为什么不只是扩展一个抽象类?



1> Brian Warsha..:

对接口进行编程意味着尊重使用该接口创建的"契约".因此,如果您的IPoweredByMotor接口有一个start()方法,那么实现该接口的未来类,无论是它们MotorizedWheelChair,Automobile还是SmoothieMaker在实现该接口的方法时,都会为您的系统增加灵活性,因为一段代码可以启动许多不同类型的电机.事情,因为所有一段代码需要知道的是他们的回应start().他们如何开始并不重要,只要他们必须开始.


值得指出的是,界面不是合同.合同是行为规范:组件x保证它将在方案z中执行y.接口保证一无所获.要获得与验证行为相关的接口的描述,必须使用类.

2> Jonathan..:

好问题.我将把你推荐给Effective Java中的Josh Bloch,他写道(第16项)为什么更喜欢使用接口而不是抽象类.顺便说一句,如果你还没有这本书,我强烈推荐它!以下是他所说的内容摘要:

    可以轻松地对现有类进行改装以实现新接口.您需要做的就是实现接口并添加所需的方法.现有的类无法轻松改装以扩展新的抽象类.

    接口是定义混合的理想选择.混合接口允许类声明其他可选行为(例如,Comparable).它允许将可选功能与主要功能混合在一起.抽象类不能定义混合 - 一个类不能扩展多个父类.

    接口允许非分层框架.如果您的类具有许多接口的功能,则可以全部实现它们.如果没有接口,则必须为每个属性组合创建一个带有类的膨胀类层次结构,从而导致组合爆炸.

    接口可实现安全的功能增强.您可以使用Decorator模式创建包装类,这是一种强大而灵活的设计.包装器类实现并包含相同的接口,将一些功能转发给现有方法,同时向其他方法添加专门的行为.你不能用抽象方法做到这一点 - 你必须使用继承,这更脆弱.

抽象类提供基本实现的优势如何?您可以为每个接口提供抽象骨架实现类.这结合了接口和抽象类的优点.骨架实现提供实现帮助,而不会强加抽象类在用作类型定义时强制施加的严格约束.例如,Collections Framework使用接口定义类型,并为每个接口提供骨架实现.



3> John Vasilef..:

接口编程提供了几个好处:

    GoF类型模式必需,例如访客模式

    允许替代实施.例如,对于抽象正在使用的数据库引擎的单个接口可能存在多个数据访问对象实现(AccountDaoMySQL和AccountDaoOracle都可以实现AccountDao)

    Class可以实现多个接口.Java不允许具体类的多重继承.

    摘要实现细节.接口可能只包含公共API方法,隐藏实现细节.好处包括清晰记录的公共API和记录良好的合同.

    现代依赖注入框架(如http://www.springframework.org/)大量使用.

    在Java中,接口可用于创建动态代理 - http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Proxy.html.这可以非常有效地用于诸如Spring之类的框架来执行面向方面编程.方面可以为类添加非常有用的功能,而无需直接向这些类添加Java代码.此功能的示例包括日志记录,审计,性能监视,事务划分等 .http://static.springframework.org/spring/docs/2.5.x/reference/aop.html.

    模拟实现,单元测试 - 当依赖类是接口的实现时,可以编写也可以实现这些接口的模拟类.模拟类可用于促进单元测试.



4> Bjorn Reppen..:

我认为抽象类主要被开发人员抛弃的原因之一可能是误解.

当四人帮写道:

编程到接口而不是实现.

没有java或C#接口这样的东西.他们谈论的是面向对象的界面概念,每个类都有.Erich Gamma在这次采访中提到了这一点.

我认为,在没有思考的情况下机械地遵循所有规则和原则会导致难以阅读,导航,理解和维护代码库.记住:最简单的事情可能会奏效.



5> Jonathan All..:

怎么会?

因为这就是所有书籍所说的.与GoF模式一样,许多人认为它普遍适用,并且从未考虑它是否真的是正确的设计.

您如何知道该界面中将出现的对象之间的所有关系?

你没有,这是一个问题.

如果您已经了解这些关系,那么为什么不只是扩展一个抽象类?

不扩展抽象类的原因:

    你有完全不同的实现,并且制作一个像样的基类太难了.

    你需要为其他东西烧掉你唯一的基类.

如果两者都不适用,请继续使用抽象类.它会为你节省很多时间.

你没问过的问题:

使用界面的缺点是什么?

你无法改变它们.与抽象类不同,界面是一成不变的.一旦你有一个使用它,扩展它将打破代码,期间.

我真的需要吗?

大多数时候,没有.在构建任何对象层次结构之前要认真思考.像Java这样的语言的一个大问题是,它使得创建大规模,复杂的对象层次结构变得非常容易.

考虑LameDuck继承自Duck的经典示例.听起来很简单,不是吗?

好吧,直到你需要表明鸭子已经受伤并且现在是跛脚.或者表明跛脚鸭已经愈合并且可以再次行走.Java不允许您更改对象类型,因此使用子类型来指示跛足实际上不起作用.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有