摘要
面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。
六大原则:单一职责原则;里氏代换原则;依赖倒转原则;开闭原则;接口隔离原则;迪米特法则;合成复用原则 (7个?)
单一职责原则(SRP)Single Responsibility Principle
定义
- 一个类只负责一个功能领域中的相应职责
- 就一个类而言,应该有且只有一个原因引起它变更。
核心
- 职责
- 变化原因
好处
- 降低类的复杂性,清晰定义职责
- 复杂度低了,可读性高,可维护性高
- 变更风险低
使用频率:★★★★☆
里氏代换原则(LSP)Liskov Substitution Principle
定义
- 任何基类(父类)可以出现的地方, 子类一定可以出现。
核心
- 父类业务必须原样支持:子类要完整的实现父类的业务
- 要求子类能扩展父类,但不能变更父类的行为,或者减少父类的行为
- 如果子类不能完整的做到这点,就断开继承,用依赖、组合、聚合代替
- 子类可以扩展:子类有自己的扩展行为
重写父类方法时
- 重写方法时,入参需要放大,并且保证父类的逻辑可用
- 重写方法时,返回要缩小,不能超过父类的返回值得范围
使用频率:★★★★★
依赖倒转原则(DIP)Dependence Inversion Principle
定义
- 高层模块不应该依赖低层模块。两个都应该依赖抽象。
- 抽象不应该依赖细节。细节应该依赖抽象。
核心
- 实现类不应相互依赖,都应该依赖接口、抽象
- 抽象类,接口也应该依赖抽象和接口,不能依赖具体实现类
最佳实践
- 每个类尽量都有接口或抽象类,或者两者都具备
- 定义变量的表面类型尽量是接口或抽象类
- 实现类不应该由具体类派生出来 (现实往往做不到)
使用频率:★★★★★
开闭原则(OCP)Open Close Principle
定义
- 对扩展开放, 对修改关闭。
使用频率:★★★★★
接口隔离原则(ISP)Interface Segregation Principle
定义
- 使用多个专门的接口,而不使用单一的总接口
- 即客户端不应该依赖那些它不需要的接口。
核心
- 接口尽量细化
- 接口中的方法尽量少
- 接口高内聚
使用频率:★★☆☆☆
迪米特法则(LoD)Law of Demeter
定义
- 最小知识原则(LKP)Least Knowledge Principle
- 一个软件实体应当尽可能少地与其他实体发生相互作用。
使用频率:★★★☆☆
合成复用原则(CRP)Composite Reuse Principle
定义
- 尽量使用对象组合,而不是继承来达到复用的目的