1、单一职责SRP;
一个模块的代码应该尽可能只专注一件事情,要求在设计功能模块代码时,尽可能划分清楚代码的功能;
比如一个 “容器接口(协议)”, 只有盛和倒,而不应该考虑各种使用方法;
2、开放闭合OCP;
当程序已经正确描述功能稳定发布后,需要添加新的功能或者修改功能时,应该进行对程序进行拓展,而不是修改源代码。
当杯子实现了 “容器接口 ”,而杯子需要有一个“把手”,应该依赖一个“把手接口”,而不是直接在类里耦合实例一个“把手对象”的。否则,当把手需要替换的时候,你需要每次都从一个带“把手”的“杯子”中把旧“把手”扔掉,才用上新的。
3、里氏替换LSP;
就是继承,父类出现的地方,可以用子类对象进行替换,而原程序不会造成变化。理论上,设计(Java)代码时,应该首选继承抽象而不是具体。
当保温瓶继承了杯子,保温瓶完全可以满足杯子的功能,而保温瓶的功能,杯子并不一定有。
4、依赖倒置DIP;
要求耦合尽量都是抽象的,类关系之间的依赖都应该是具体依赖抽象,是比较难实现的地方。
描述如2、开放闭合原则;
5、接口隔离ISP;
一个接口的方法应该尽量精简,一个大的接口可以继承自小的接口,一个具体类应该依赖自最小接口,从而避免实现无用的方法。
如果 “把手容器接口”继承自“把手接口”和“容器接口”,杯子直接继承“把手容器接口”。因为这个时候“把手”是不确定,有三种处理选择:一、把杯子变成抽象类,抽象“把手接口”的方法;二、依赖一个 “把手”对象 ; 三、生成空方法无论哪一种都是可爱的感觉
6、自己舒服原则;
杯子好不好用,自己知道。 如我们都知道,高内聚低耦合是代码的追求。 聚合/合成原则是一种强耦合原则,而迪米特法则也是一种实践出来的经验法门。地要怎么种不是死的。