面向对象设计原则

一些软件设计的原则
面向对象设计原则和创建SOLID应用的5个方法

迪米特法则

定义:

一个对象应该对其它对象保持最少的了解 从而降低类之间的耦合

具体来说对于对象 ‘O’ 中一个方法’M’,M应该只能够访问以下对象中的方法:

  1. 对象O
  2. 与O直接相关的Component Object
  3. 由方法M创建或者实例化的对象
  4. 作为方法M的参数的对象
    例子:demeter

SOLID 原则

单一职责 (SRP)

一个类发生变化的原因不应该超过一个。这意味着代码中每个类,或者类似的结构只有一个功能。
QQ截图20160413142903

里氏替换原则 (LSP)

子类必须能够替换成它们的基类。即:子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。另外,不应该在代码中出现if/else之类对子类类型进行判断的条件。里氏替换原则LSP是使代码符合开闭原则的一个重要保证。正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下就可以扩展。
A. Derived types must be completely substitutable for their base types
B. This principle is just an extension of the Open Close Principle
C. Making sure that new derived classes are extending the base classes without
changing their behavior

QQ截图20160413145728

正方形不是矩形的例子

接口隔离原则 (ISP)

接口隔离原则(Interface Segregation Principle)指出客户不应该被强迫依赖于他们不使用的接口。当我们使用非内聚的接口时,ISP指导我们创建多个较小的内聚度高的接口。

当你应用ISP时,类和他们的依赖使用紧密集中的接口通信,最大限度地减少了对未使用成员的依赖,并相应地降低耦合度。小接口更容易实现,提升了灵活性和重用的可能性。由于很少的类共享这些接口,为响应接口的变化而需要变化的类数量降低,增加了鲁棒性。

A. Clients should not be forced to depend upon interfaces that they don’t use

QQ截图20160413153256

QQ截图20160413153318

依赖反转原则 (DIP)

依赖反转原则(Dependency Inversion Principle,DIP)指出高层次模块不应该依赖于低层次模块;他们应该依赖于抽象。第二,抽象不应该依赖于细节;细节依赖于抽象。方法是将类孤立在依赖于抽象形成的边界后面。如果在那些抽象后面所有的细节发生变化,那我们的类仍然安全。这有助于保持低耦合,使设计更容易改变。
A. High-level modules should not depend on low-level modules. Both should
depend on abstractions
B. Abstractions should not depend on details. Details should depend on
abstractions

QQ截图20160413154556

QQ截图20160413154612

QQ截图20160413155306

QQ截图20160413155326

开闭原则(OCP)

关于开发封闭原则,其核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

A. Software entities like classes, modules and functions should be open for
extensionbut closedformodifications
B. The design and writing of the code should be done in a way that new
nctionality should be added with minimum changes in the existing code
C. The design should be done in a way to allow the adding of new functionality as
new classes, keeping as much as possible existing code unchanged

QQ截图20160413160021

QQ截图20160413160030

其它原则

参考第一个链接一些软件设计的原则
* Common Closure Principle(CCP)– 共同封闭原则
* Common Reuse Principle (CRP) – 共同重用原则
* Hollywood Principle – 好莱坞原则
* High Cohesion & Low/Loose coupling & – 高内聚, 低耦合
* Convention over Configuration(CoC)– 惯例优于配置原则
* Separation of Concerns (SoC) – 关注点分离
* Design by Contract (DbC) – 契约式设计
* Acyclic Dependencies Principle (ADP) – 无环依赖原则
* Don’t Repeat Yourself (DRY)
* Keep It Simple, Stupid (KISS)
* Program to an interface, not an implementation
* Command-Query Separation (CQS) – 命令-查询分离原则
* You Ain’t Gonna Need It (YAGNI)