一、单一职责
就一个类而言,应该仅仅只有一个使其变化的原因;
这强调了类设计需要讲究高内聚的性质,只完成它该做的事,不实现与它无关的;
二、开闭原则
对一个类来说,应该是对于扩展开放,对于修改关闭的;
这建立在类单一职责的基础上,并且依赖于抽象:1)一个系统如果没有抽象或者接口就没有扩展点;2)封装可变性,需要将多个可变因素封装到继承结构中,如果多个可变因素混乱在一起,就会使系统变得复杂;
三、接口隔离原则
一个接口的设计应该小而专,而非大而杂;
接口表示能力,那么一个接口最好只描述一种能力;
四、里氏替换原则
所有能够使用父类的地方都要能用子类替换;
换言之,子类的能力不能比父类小;
开闭和里氏往往是生世相依,不离不弃,通过里氏替换来达到程序的扩展,对修改的关闭效果。然而,这两个原则都同时强调了一个 OOP 的重要性 - 抽象,因此,在开发过程中,运用抽象是走向代码优化的重要一步。
五、依赖倒置原则
细节应该依赖于抽象, 抽象(具体来说可以是不能被实例化的接口或是抽象类)而不应该依赖于细节(具体来说可以是实现类);
也可以这样说:声明变量的引用类型,声明方法的引用类型和返回类型时,尽量使用抽象类型而不是具体类型,因为抽象类型可以被它的任意子类型所代替;
六、迪米特原则
一个类应该对自己需要耦合或调用的类知道的最少,类的内部如何实现与调用者或者依赖者没有关系,调用者或者依赖着只需要知道它需要的方法即可,其他的可一概不用管。类与类之间关系密切,耦合度就越大,当一个类发生改变时,对另一个类的影响也越大。
七、合成聚合复用
优先使用聚合或者合成关系复用代码
因为如果使用继承实现复用,一旦只需要使用父类的一部分代码,而不得不将父类其他的代码一并复用,反而会造成严重的代码冗余,并且进一步暴露了父类的内部细节;
而使用聚合/组合,在实现目的的同时,会带来更小的副作用。
参考资料: