OO的五大原则是指SRP、OCP、LSP、DIP、ISP
SRP(Single Responsibility Principle 单一职责原则)
对象的功能应该单一

OCP(Open Close Principle 开闭原则)
以增加对象的方式来完成对需求的扩展,而非修改原有对象。

LSP(Liskov Substitution Principle 里氏替换原则)
“老鼠的儿子会打洞”,子类应该具备父类的特征。

DIP(Dependence Inversion Principle 反向依赖原则)
不应该依赖“客户”的东西,后端提供方法不应该依赖前端对象。

ISP(Interface Segregation Principle 接口分隔原则)
尽量提供有针对性符合功能特点的简单接口,而不是包含很多方法的大而总接口。


OOP: Object Oriented Programming,面向对象的程序设计

头五项原则是关于类设计的,它们是:

1、SRP,单一职责原则,一个类应该有且只有一个改变的理由。

定义:类的单一职责是说一个类应该只做一件事情,如果类中某个方法或属性与它所要完成的职责无关或是为了完成另外的职责那么这样的设计就不符合类的单一职责。

优点:有助于我们分析和编码的思路的清晰;使我们的编码、测试和维护变得简单;将一个个复杂的问题简单化以后,易于代码的重用;易于系统的扩展。

缺点:降低了类的内聚性增强了类的耦合性,另外一个很客观的问题是当我们使用这个类时把我们原本不需要的功能也带到了我们的代码中,从而使文件变大,增加内存开销。

2、OCP(Open Closed Principle),开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为。

开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。

核心的思想:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。


3、LSP(The Liskov Substitution Principle),Liskov替换原则,派生类要与其基类自相容。

其主要机制是抽象和多态。支持抽象和多态的关键机制是继承。


4、DIP(Dependence Inversion Principle),依赖倒置原则,依赖于抽象而不是实现。

核心:高层模块不应该直接依赖于低层模块,所有的模块都要依赖于抽象。也就是说:容易变化的东西一定要依赖于不容 易变化的东西,因为抽象的东西最不容易变化,具体的东西容易变化,所以具体应该依赖于抽象。


5、ISP(Interface Segregation Principle ),接口隔离原则,客户只要关注它们所需的接口。

定义:从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的。 使用多个专门的接口比使用单一的总接口要好。

另外的六项是关于包的设计原则。头三项包原则是关于包内聚性的,它们会告诉我们该把什么划分到包中:

6、REP(Release Reuse Equivalency Principle ),重用发布等价原则,重用的粒度就是发布的粒度。


7、CCP(The Common Closure Principle ),共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的。


8、CRP,共同重用原则,一个包中的所有类应该是共同重用的。

  最后的三项原则是关于包之间的耦合性原则的,并且论述了评价系统中包结构优良与否的评判标准。

9、ADP(The Acyclic Dependencies Principle ),无环依赖原则,在包的依赖关系图中不允许存在环。


10、SDP(The Stable Dependencies Principle ),稳定依赖原则,朝着稳定的方向进行依赖。


11、SAP(The Stable Abstractions Principle ),稳定抽象原则,包的抽象程度应该和其稳定程度一致。


头五项原则是关于类设计的,它们是:

  ◆ SRP,单一职责原则,一个类应该有且只有一个改变的理由。
  ◆ OCP,开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为。
  ◆ LSP,Liskov替换原则,派生类要与其基类自相容。
  ◆ DIP,依赖倒置原则,依赖于抽象而不是实现。
  ◆ ISP,接口隔离原则,客户只要关注它们所需的接口。

  另外的六项是关于包的设计原则。在本文中,包是指一个二进制的可发布文件,比如.jar文件、或dll文件,而不是Java包或是C++的命名空间(译注3)。

  头三项包原则是关于包内聚性的,它们会告诉我们该把什么划分到包中:

  ◆ REP,重用发布等价原则,重用的粒度就是发布的粒度。
  ◆ CCP,共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的。
  ◆ CRP,共同重用原则,一个包中的所有类应该是共同重用的。

  最后的三项原则是关于包之间的耦合性原则的,并且论述了评价系统中包结构优良与否的评判标准。

  ◆ ADP,无环依赖原则,在包的依赖关系图中不允许存在环。
  ◆ SDP,稳定依赖原则,朝着稳定的方向进行依赖。
  ◆ SAP,稳定抽象原则,包的抽象程度应该和其稳定程度一致。


这些原则着重于OOD中的依赖管理方面,而淡化抽象与建模方面。这并不是说OO在抽象方面不够强大,或是OO不适合构建模型。当然有很多人都在使用OO的这些部分,只是这些原则集中关注于依赖管理。

  依赖管理是我们每个人都要面对的问题,每当我们在屏幕面前打开那些彼此纠结又令人作呕的代码,我们就会遭受不良的依赖管理所带来的恶果。不良的依赖管理导致代码难以改变,易被破坏,而且不可重用。从另一方面来说,如果依赖经过了良性的管理,代码就可以保持灵活性、健壮性和重用性。所以依赖管理和这些相关原则是程序员们渴求的让软件保持优良架构的基石。

(1)SRP 单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。
职责即为"变化的原因".

(2)OCP 开放封闭原则
软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。
对于扩展是开放的,对于更改是封闭的.
关键是抽象.将一个功能的通用部分和实现细节部分清晰的分离开来.
开发人员应该仅仅对程序中呈现出频繁变化的那些部分作出抽象.拒绝不成熟的抽象和抽象本身一样重要.

(3)LSP Liskov替换原则
子类型必须能替换掉他们的基本类型

(4)DIP 依赖倒置原则
抽象不应该依赖于细节。细节应该依赖于抽象。
Hollywood原则: "Don't call us, we'll call you".程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。
任何变量都不应该持有一个指向具体类的指针或引用。
任何类都不应该从具体类派生。
任何方法都不应该覆写他的任何基类中的已经实现了的方法。

(5)ISP 接口隔离原则
不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于他所在的类层次结构。
多个面向特定用户的接口胜于一个通用接口。

(6)REP 重用发布等价原则
重用的粒度就是发布的粒度.

(7)CCP 共同重用原则
一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
相互之间没有紧密联系的类不应该在同一个包中。

(8)CRP 共同封闭原则
包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响.

(9)ADP 无依赖原则
在包的依赖关系中不允许存在环.
细节不应该被依赖.

(10)SDP 稳定依赖原则
朝着稳定的方向进行依赖.
应该把封装系统高层设计的软件(比如抽象类)放进稳定的包中,不稳定的包中应该只包含那些很可能会改变的软件(比如具体类)。

(11)SAP 稳定抽象原则
包的抽象程度应该和其他稳定程度一致.
一个稳定的包应该也是抽象的,一个不稳定的包应该是抽象的.

(12)DAP(Default Abstraction Principle)缺省抽象原则
在接口和实现接口的类之间引入一个抽象类,这个类实现了接口的大部分操作.

(13)IDP(Interface Design Principle)接口设计原则
规划一个接口而不是实现一个接口。

(14)BBP(Black Box Principle)黑盒原则
多用类的聚合,少用类的继承。

(15)DCSP(Don't Concrete Supperclass Principle)不要构造具体的超类原则
避免维护具体的超类。