汇总面向对象设计的一些基本原则: 1. 优先使用(对象)组合,而非(类)继承。Favor Composition Over Inheritance。 组合:是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。组合将功能委托给所组合的一个对象,从而获得新功能。有些时候也称之为“聚合”(aggregation)或“包容”(containment)。 继承:是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度上破坏了封装性,子类与父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。 2. 针对接口编程,而非(接口的)实现。Program To An Interface, Not An Implementation。 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口 接口是一个对象在对其它的对象进行调用时所知道的方法集合。一个对象可以有多个接口,类型是对象的一个特定的接口。不同的对象可以具有相同的类型,而且一个对象可以具有多个不同的类型。一个对象仅能通过其接口才会被其它对象所了解。 实现继承(类继承):一个对象的实现是根据另一个对象的实现来定义的。 接口继承(子类型化):描述了一个对象可在什么时候被用来替代另一个对象。 优点:Client不必知道其使用对象的具体所属类。一个对象可以很容易地被(实现了相同接口的)的另一个对象所替换。对象间的连接不必硬绑定(hardwire)到一个具体类的对象上,因此增加了灵活性。松散藕合(loosens coupling)。增加了重用的可能性。提高了(对象)组合的机率,因为被包含对象可以是任何实现了一个指定接口的类。 3. 开放-封闭法则(OCP):模块应对扩展开放,而对修改关闭。 模块应尽量在不修改原代码的情况下进行扩展。Software Entities Should Be Open For Extension,But Closed For Modification。此原则是由"Bertrand Meyer"提出的。 开放-封闭法则认为我们应该试图去设计出永远也不需要改变的模块。我们可以添加新代码来扩展系统的行为。我们不能对已有的代码进行修改。在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。符合OCP的模块需满足两个标准:可扩展,即“对扩展是开放的”(Open For Extension)-模块的行为可以被扩展,以需要满足新的需求。可更改,即“对更改是封闭的”(Closed for Modification)-模块的源代码是允许进行改动的。OCP简介(OCP--Open-Closed Principle): Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。 软件实体应当对扩展开放,对修改关闭,即软件实体应当在不修改(在.Net当中可能通过代理模式来达到这个目的)的前提下扩展。 Open for extension:当新需求出现的时候,可以通过扩展现有模型达到目的。 Close for modification:对已有的二进制代码,如dll,jar等,则不允许做任何修改4. Liskov替换法则(LSP):子类应当可以替换父类并可以出现在父类能够出现的任何地方。Function That Use Referennces To Base(Super) Classes Must Be Able To Use Objects Of Derived(Sub) Classes Without Knowing It 。为了保持LSP(并与开放-封闭法则一起),所有子类必须符合使用其基类的client所期望的行为。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。5. 依赖原则 (the Dependency Inversion Principle DIP):在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。6. 接口分离原则(the Interface Segregation Principle ISP):采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。7. 单一职责原则(SRP):一个类应该仅有一个引起它变化的原因。 封装变化:使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
汇总面向对象设计的一些基本原则
最新推荐文章于 2023-08-10 16:25:48 发布