设计原则伪笔记

六大设计原则

Posted by Simon on October 1, 2018

单一职责 里氏替换 开闭原则 依赖倒置 接口隔离 迪米特法则。

单一职责原则(SRP)

目的

代码业务逻辑清晰,便于维护。

具体实现

代码上的职责需要根据个人经验、具体业务进行划分,在类中,封装的成员属性和函数功能必须具备相关性很高的特点;在接口中,声明的方法 需要是一组相关性很高的动作;在方法中,多个形参若无相关性则应该再划分多个方法。

里氏替换原则(LSP)

继承抽象-> 实现规范-> 多态替换

目的

实现开闭原则,先继承抽象 后通过setter方法/构造函数/实例化时进行多态替换,避免当增加程序功能时类的修改,确保程序易于扩展维护。

具体实现

里氏替换实际上是在继承概念的基础上加了一个原则规范:
① 子类必须完全实现父类的方法。
② 子类可以有自己特有的属性方法,但应该尽量避免”个性”。
③ 重写(覆盖)父类方法,方法名/参数列表/返回值类型/异常捕获 应该保持一致(返回值可以被缩小,即可以为父类返回值类型的子类),访问修饰符必须>=父类方法的修饰符。
④ 重载,方法的形参必须比父类方法的形参更宽松,确保多态替换后,传入参数能正确调用到子类覆盖父类的方法,进而确保子类替换父类后程序的行为不变。

开闭原则(OCP)

目的

对扩展开发,对修改关闭。当新增需求功能时,通过新建子类去实现接口或继承类,达到不必修改到原模块代码的目的,提高复用性和维护性。

具体实现

通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法。
① 抽象层应保持稳定,一旦确定下来则不允许修改。
② 引用对象类型、参数类型应尽可能地使用抽象类或接口,而非实现类(具体细节)。
③ 应用里氏替换原则的继承、多态

依赖倒置(DIP)

目的

面向抽象编程,降低耦合。

具体实现

高层次不能依赖低层次模块,两者都应依赖于抽象;抽象不能依赖于具体细节,具体细节应该依赖抽象。
依赖有4种途径:引用对象、构造函数、接口方法、Setter方法。
① 类(高层次)中引用对象类型应为抽象类或接口,不能为实现类(低层次)。
② 构造函数中的参数类型应为抽象类或接口,而非实现类。
③ 方法(接口方法、Setter方法)中的参数类型应使用抽象类或接口,而非实现类。

接口隔离(DIP)

目的

避免接口臃肿。

具体实现

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
① 在单一职责的前提下: 拆分接口,确保接口下的方法只与B类相关,A类通过接口依赖B类,A类实现的方法也都只跟B类相关。
② 高内聚,提高每个方法的处理能力,减少对外交互,以达到减少对外公布public方法的数量。
③ 单独定制服务,每个接口只对一个模块(个体)定制一套方法进行服务。
④ 适度,根据经验适度设计接口。

迪米特法则(LoD)/最少知道原则(LKP)

目的

降低类与类之间的耦合,核心是减少类对其他类的依赖。

具体实现

一个对象应该对其他对象尽可能少的了解,一个类依赖的类越少越好。
① 去掉间接依赖类,只与直接依赖的类通信: 一个类A的成员变量、方法的输入输出参数中的类B,为类A直接依赖的对象,但方法体内部出现的类C,不应该存在于类A中,而是应该抽到与其依赖的类B中。
② 依赖倒置原则中,强调的是通过依赖抽象接口降低耦合,而迪米特法则强调的是其余因素:
尽可能减少被依赖类的public方法和属性,或改为private package-private、protected等访问权限,及是否可以加上final关键字。