从事代码工作两年后,从盲目码字到设计先行的思路启蒙
一、功能设计原则
1. SRP:单一职责原则
一个类应该只有一个发生变化的原因。
2. OCP:开放 - 封闭原则
软件实体(类、模块、函数)应该是可以扩展,但是不可修改。
- 对于扩展是开放的,需求改变时,可以对模块进行扩展。可以改变模块的功能。
- 对于修改时封闭的,扩展时,不需要修改模块内部的代码
- 其核心是通过抽象,抽取基本通用的部分(基类),再通过派生,实现功能的扩展(extend)
3. LSP:Liskov替换原则
子类型(subtype)必须能够替换掉它们的基类型(base type)。
若对类型S的每一个对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型 –Barbara Liskov
- S应该是基于T派生而来的,反过来说,由T派生出去的S应该满足上述条件,否则认为程序是脆弱的。
4. DIP:依赖倒置原则
a. 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
b. 抽象不应该依赖于细节。细节应该依赖于抽象。
- 低层(通用)模块提供抽象,由高层(业务)模块去调用。
- 业务操作抽象接口
5. ISP:接口隔离原则
不应该强迫客户程序依赖并未使用的方法。
二、包和组件
内聚性原则:粒度
1. REP(Reuse-Release Equivalence):重用-发布等价原则
a. 重用的粒度就是发布的粒度
b. 可重用的组件必然包含可重用的类
- 为了复用而设计的组件应该自始至终都是为了能够持续重用而进行开发、扩展,版本的迭代能够向下兼容
- 设计之初应该做好约定
2. CRP(Common-Reuse):共同重用原则
a. 一个组件中的所有类应该是共同重用的。如果重用了组件中的一个类,那么就要重用组件中的所有类。
- 组件内的依赖,必需是都满足REP的,确保组件是共同可重用
3. CCP(Common-Closure):共同重用原则
a. 组件中的所有类对于同一种性质的变化应该是共同封闭的。一个变化若对于一个封闭的组件产生影响,则将对该组件中的所有类产生影响,而对其他组件则不造成影响。
- 类似SRP,一个组件不应该包含多个引起变化的原因
- 组件中的类要做到高内聚,低耦合,尽量将变化封闭,而不引起其它类的变化。
耦合性原则:稳定性
1. ADP(Acyclic-Dependencies):无环依赖原则
在组件的依赖关系图中不允许存在环
2. SIP(Stable-Dependencies):稳定依赖原则
朝着稳定的方向进行依赖
- 开发时,尽量减少非必要的依赖
3. SAP(Stable-Abstractions):抽象稳定原则
组件的抽象程度应该与其稳定程度一致
- 用抽象来提高组件的稳定性