1. 单一职责原则 Single responsibility principle,SRP
2. 接口隔离原则 Interface Segregation Principle,ISP
3. 迪米特法则:Law of Demeter,LoD (最少知道原则)
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想
单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
迪米特法则还是在讲如何减少耦合的问题,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
1. 从依赖者的角度来说,只依赖应该依赖的对象。
2. 从被依赖者的角度说,只暴露应该暴露的方法。
但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。
所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
4. 开闭原则:Open Closed Principle,OCP
软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),
这就是开闭原则的经典定义。
(1)修改接口
(2)修改实现类
(3)通过扩展实现变化
开闭原则是一种约束。一个软件产品在他的生命周期内一般都会发生变化,开闭原则视为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。
1. 对软件测试的影响
软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运 行。
2. 可以提高代码的可复用性
粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
3. 可以提高软件的可维护性
遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
5. 里氏替换原则:Liskov Substitution Principle,LSP
子类可以替换父类。
1.里氏替换原则是实现开闭原则的重要方式之一。
2.它克服了继承中重写父类造成的可复用性变差的缺点。
3.它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
优点:
1.代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
2. 提高代码的重用性;
3. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留了自己独特的个性;其实很多开源框架的扩展都 是通过继承父类实现的。
4. 提供产品或者项目的开放性。
缺点:
1. 继承是侵入性的,只要继承就必须拥有父类的所有方法和属性;
2. 降低了代码的灵活性。子类必须拥有父类的属性和方法,让子类中多了约束
3. 增加了耦合,当父类的常量、变量或者方法被修改了,需要考虑子类的修改,所以一旦父类有了变动,很可能 会造成非常糟糕的结果,要重构大量的代码。
6. 依赖倒置原则:Dependence Inversion Principle,DIP
核心思想:要面向接口编程,分工协作互不影响。
秦国统一度量衡、剑、弩尺寸;
毕升的活字印刷;
富士康待加工;
电脑组装机、维修(cpu、内存条、硬盘、移动硬盘、鼠标、键盘)随意更换;
手机充电口(移动电源、共享充电宝)
接口标准化程度,是产业强盛的
1.高层模块不应该依赖低层模块,两者都应该依赖其抽象;
2.抽象不应该依赖细节,
3.细节应该依赖抽象。
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性
1. 每个类尽量提供接口或抽象类,或者两者都具备。
2. 变量的声明类型尽量是接口或者是抽象类。
3. 任何类都不应该从具体类派生。
4. 尽量不要覆写基类的方法
5. 使用继承时结合里氏替换原则。
7. 优先使用对象组合,而不是类继承。
明确类之间的关系,是IS-A 还是 HAS-A。
IS-A 是 白箱复用,存在类继承的缺点(破坏封装,强耦合)。
HAS-A 是 黑箱复用
8. 封装变化点
通过封装的手段创建对象之间的分界层。一侧变化、一侧稳定。