定义
单一职责原则(Single Responsibility Princi-ple)简称是SRP。它规定一个类应该只有一个发生变化的原因
好处
- 类的复杂性降低
- 可读性提高
- 可维护性提高
- 变更所引起的风险降低
使用场景及注意事项
单一职责原则简单可真到设计时候发现有一些类的多个功能很难拆分,当然好多项目由于受到工期,时间成本等众多因素的限制,也是很难做到单一职责,我的建议是接口一定要做到单一职责,类的编写尽量做到只有一个原因引起变化,这样才能最大限度的做到解耦合,拥抱变化
定义
里氏替换原则(Liskov Substitution Principle,LSP)有两种定义:
- 第一种定义,也是最正宗的定义:If for each object o1 oftype S there is an object o2 of type T such that for all pro-grams P defined in terms of T, the behavior of P is un-changed when o1 is substituted for o2 then S is a subtypeof T.(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代替成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
- 第二种定义:Functions that use pointers or references tobase classes must be able to use objects of derived classeswithout knowing it.(所有引用基类的地方必须能透明地使用其子类的对象。)
好处
- 代码共享
- 提高代码的重用性
- 子类可以形似父类,但又异于父类
- 提高代码的可扩展性
- 提高产品或者项目的开放性
缺点
- 继承是侵入的,只要是继承,就必须拥有父类的所有属性和方法
- 增强了耦合性
使用场景及注意事项
里氏替换原则强调的是在某个方法中用到父类和子类共有特征(可以是接口,共同的抽象类,或者是方法),可以做到无缝替换,一定要注意的是这个方法用到的一定要是父类和子类共有的方法才行,如果是子类独有的个性方法则不能应用这一原则
定义
依赖倒置原则(Dependence Inversion Principle,DIP)
High level modules should not depend upon low levelmodules. Both should depend upon abstractions. Abstractionsshould not depend upon details. Details should depend uponabstractions.
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
好处
- 减少类间的耦合性
- 提高系统的稳定性
- 降低并行开发引起的风险
- 提高代码的可读性和可维护性
使用场景及注意事项
遵循的规则
- 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备(这是依赖倒置的基本要求,接口和抽象类都是属于抽象的,有了抽象才可能依赖倒置)
- 变量的表面类型尽量是接口或者是抽象
- 任何类都不应该从具体类派生
- 尽量不要覆写基类的方法
- 结合里氏替换原则使用
定义
接口隔离原则(Interface Segregation Principle)
- Clients should not be forced to depend upon interfacesthat they don't use.(客户端不应该依赖它不需要的接口。)
- The dependency of one class to another one should de-pend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)
好处
缺点
- 可能会倒置类膨胀和接口过分细粒度的划分给开发人员造成很大的压力
使用场景
把每个模块即业务对应的接口抽象隔离出来,使其互不影响
迪米特原则 (Least Knowledge Principle 简写LKP)
定义
迪米特原则(Least Knowledge Principle 简写LKP)
一个对象应该对其他对象有最少的了解,通俗的讲就是类之间的关联调用做到嘴少
好处
让类与类之间解耦,弱耦合
使用场景
模块以及方法的封装可以说是最直接的对迪米特原则的使用