1、单一职责(业务逻辑上单一)
好处:
❑类的复杂性降低,实现什么职责都有清晰明确的定义;
❑可读性提高,复杂性降低,那当然可读性提高了;
❑可维护性提高,可读性提高,那当然更容易维护了;
❑变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。
2、里氏兑换原则
定义:
❑第一种定义,也是最正宗的定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
❑第二种定义:Functions that use pointers or references to baseclasses must be able to use objects of derived classes withoutknowing it.(所有引用基类的地方必须能透明地使用其子类的对象。)
第二个定义是最清晰明确的,通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
3、依赖倒置原则
定义:
❑高层模块不应该依赖低层模块,两者都应该依赖其抽象;
❑抽象不应该依赖细节;
❑细节应该依赖抽象。
4、接口隔离原则(接口功能方法上尽量少)
定义:
客户端不应该依赖它不需要的接口。
类间的依赖关系应该建立在最小的接口上。
解释:
第一种定义:“客户端不应该依赖它不需要的接口”,那依赖什么?依赖它需要的接口,客户端需要什么接口就提供什么接口,把不需要的接口剔除掉,那就需要对接口进行细化,保证其纯洁性;再看第二种定义:“类间的依赖关系应该建立在最小的接口上”,它要求是最小的接口,也是要求接口细化,接口纯洁,与第一个定义如出一辙,只是一个事物的两种不同描述。
我们可以把这两个定义概括为一句话:建立单一接口,不要建立臃肿庞大的接口。再通俗一点讲:接口尽量细化,同时接口中的方法尽量少。
5、迪米特法则
定义:也称最少知识原则。 一个对象应该对其他对象有最少的了解。
解释:一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。
6、开闭原则
定义:
软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。
软实体包括以下几个部分:
❑项目或软件产品中按照一定的逻辑规则划分的模块。
❑抽象和类。
❑方法。
开闭原则意义:
1.开闭原则对测试的影响
2.开闭原则可以提高复用性
3.开闭原则可以提高可维护性
4.面向对象开发的要求
如何实现开闭原则:
1、抽象的约束
接口是与其他模块交流的契约,修改契约就等于让其他模块修改。接口或抽象类一旦定义,就应该立即执行,不能有修改接口的思想,除非是彻底的大返工。
2、元数据(metadata)控制模块行为
元数据:用来描述环境和数据的数据,通俗地说就是配置参数,参数可以从文件中获得,也可以从数据库中获得。
3.制定项目章程
4.封装变化
对变化的封装包含两层含义:第一,将相同的变化封装到一个接口或抽象类中;第二,将不同的变化封装到不同的接口或抽象类中,不应该有两个不同的变化出现在同一个接口或抽象类中。