六大原则
- 单一职责原则告诉我们实现类要职责单一;
- 里氏替换原则告诉我们不要破坏继承关系;
- 依赖倒置原则告诉我们要面向接口编程;
- 接口隔离原则告诉我们在设计接口的时候要精简单一;
- 迪米特法则告诉我们要降低耦合;
- 开闭原则告诉我们要对扩展开放,对修改封闭;
Open Closed Principle(OCP):开闭原则
- Open for extension,Closed for modification:当软件需求变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现.
- 用抽象构建架构,用实现扩展细节.因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保证架构的稳定.在软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了,当然前提是抽象要合理,要对需求的变更有前瞻性和预见性.
Single responsibility principle(SRP):单一功能原则
- 核心:一个类应该有且只有一个变化的原因.
- 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心.
Liskov Substitution Principle(LSP): 里氏替换原则
-
定义1:所有引用基类的地方必须能透明地使用其子类的对象.
-
定义2:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
-
四层含义:
1.子类必须完全实现父类的抽象方法,但不能覆盖父类的非抽象方法.
2.子类中可以增加自己特有的方法.
3.当子类的方法重载父类的方法时,方法的前置条件(方法的形参)要比父类方法的输入参数要更宽松;
4.当子类的方法实现父类的抽象方法时,方法的后置条件(方法的返回值)要比父类更严格.
Dependency Inversion Principle(DIP): 抽象倒置原则
- 定义:High level modules should not depend upon low level modules, Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstracts.
- 高层模块不应该依赖低层模块,两者都应该依赖抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
Interface Segregation Principle(ISP):接口隔离原则
- 定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上.
- 含义:一个类对另一个类的依赖应该建立在最小的接口上;一个接口代表一个角色,不应该将不同的角色都交给一个接口,因为这样可能会形成一个臃肿的大接口;
不应该强迫客户依赖他们从来不用的方法.
Law of Demeter(LoD):迪米特法则
-
定义:又叫做最少知识原则,也就是说,一个对象应当对其他对象尽可能少的了解,不和陌生人说话.(Talk only to your immediate friends.)
-
解释:
一个软件实体应当尽可能少的与其他实体发生相互作用.每个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位.迪米特法则的初衷在于降低类之间的耦合,由于每个类尽量减少对其他类的依赖,因此很容易使得系统的功能模块独立,相互之间不存在(或很少有)依赖关系.