七大原则
- 单一职责原则
- 接口隔离原则
- 依赖倒转原则
- 里氏替换原则
- 开闭原则
- 迪米特法则
- 合成复用原则
七大原则的目的:降低耦合度,提高维护性、拓展性、重用性,可靠性。
一、单一职责原则
对类来说,一个类应该只负责一项职责,不能把所有功能都耦合到一起。这样可以降低类的复杂度,提高可读性和可维护性,降低了变更引发的风险。总的来说,就是一个类中,方法足够少,逻辑足够简单,才能保持单一职责。
单一职责可以是类级别的,也可以是方法级别的,依据实际情况来决定使用。
二、接口隔离原则
一个类通过一个接口依赖接口的实现类,该接口应该是最小接口。
如图,类A通过Interface1依赖实现类B,类B通过Interface1依赖实现类D。A只用到1、2、3方法,B只用到1、4、5方法。那么Interface1对于A、B来说,不是最小的接口。
按照接口隔离原则,可以将Interface1拆分成3个接口。
Interface1:只有1方法
Interface2:只有2、3方法
Interface3:只有4、5方法
如此,B、D两个类根据需求实现对应的接口,就遵循了接口隔离原则。
三、依赖倒转原则
依赖倒转说白了就是面向接口编程,使用接口或者抽象类定制规范,而不设计任何具体的操作,通过其实现类去完成细节的展示。
一般来说,底层模块尽量都要有抽象类或者接口,提高程序的稳定性。变量的声明尽量是抽象或者接口,通过接口去传递参数,这样就有一个缓冲,利于程序的拓展和优化。
四、里氏替换原则
里氏替换是关于继承的。继承对程序设计有很大的便利性,但是也有弊端,因为继承会给程序带来侵入性,增加耦合度。例如,一个类被其他的类所继承,当这个类需要修改时,必须考虑所有子类是否仍然适用,一旦父类做出修改,其他子类的功能可能收到牵连。如何正确适用继承?那么就涉及到里氏替换了。
里氏替换的定义:如果对每个类型为T1的对象t1,都有类型为T2的对象t2,使得以T1定义的所有程序P在所有的对象t1都代替为t2时,程序P的行为没有发生变化,那么类型T2就是类型T1的子类型。
也就是说,所有引用基类的地方,必须能够透明地使用其子类对象。在子类中尽量不要重写基类的方法。(其实继承会让两个类的耦合度增强)
五、开闭原则
开闭原则是编程中最基础、最重要的设计原则:对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。一般来说,也是面向接口编程。基类通用,子类或者实现类展开细节。
六、迪米特法则
迪米特法则又叫最少知道原则,即一个类对自己依赖的类了解越少越好。也就是说,对于被依赖的类不管多么复杂,都将逻辑封装在类之中。对外只提供public方法用以调用。
其实也可以优化为面向接口编程,用接口进行调用。
七、合成复用原则
尽量使用合成、聚合的方式,而不是继承。例如,一个类A要调用B类的方法,可以变量方式调用,而不是继承。