数学中的正交,是指相互垂直的两个向量,简单来讲就是平面上的两个垂直线段,其中一个线段变长或减短或者转圈圈,另外一根是不变的也不影响它们的垂直度的。表现为空间的独立性,在软件中我们可以理解为两个只有交叉点而互不影响的模块,是一种相互正交的模块化思想,模块内有更高的内聚,模块外有更低的耦合,只有一个不变的交叉点,这个交叉点就是我们所说的依赖点(或API接口)。
软件中的正交设计之正交四原则,最终目的是为了实现软件的高内聚低耦合架构。它是一种与范式,语言无关的设计原则。为了解决软件系统向未来演进的过程中,如何让软件在尽量长的时期范围内更容易应对变化,降低项目后期的人力投入成本。
正交四原则:
1 消除重复
2 分离关注点
3 缩小依赖范围
4 向着更稳定的方向依赖
消除重复
重复是万恶之源(Duplication is root of all evil)。
什么是重复代码?重复是不同的代码元素对同一知识进行了多次描述,无论描述方式是否一致。
消除重复的过程,本身就是一个提高系统可重用性的过程,而后者又会进一步降低未来产生重复的可能性。
消除重复原则对应SOLID原则中的单一职责原则(SRP)。
分离关注点
所谓关注点,小到一个函数,大到一个类,再或者是一个包,甚至更大的一个软件分层,都可以看作是一个关注点。从行为的角度看,是一个个功能职责,即在某个层面上,可以清晰描述它完成一件什么样的具体事情。
分离关注点,也即分离不同方向变化,是整个模块化思想的延伸,也就是单一职责和组合复用的表现。
缩小依赖范围
软件系统需要通过组件或模块之间的相互协作来实现各种功能。两个组件间的读写交互就会产生依赖关系。
依赖不可消除;否则,软件系统将毫无价值。
但是,为了实现一个功能,作为软件设计人员应尽可能地缩小依赖范围,避免不必要的依赖。
如何缩小依赖范围?如尽可能减少依赖点的数量,依赖点应该包含尽可能少的知识,依赖点应该高内聚,不应该强迫依赖方依赖它不需要的东西。
缩小依赖范围体现了高内聚,是迪米特法则的表现。
向着更稳定的方向依赖
依赖点越稳定,依赖方受依赖点变化的影响就越小。
站在需求的角度,而不是实现方式的角度定义依赖点(如API),会让依赖点更稳定。
需求是不断变化的,必须对需求进行抽象和建模,找出其中本质的东西,可以能使API的实现更稳定。
向着更稳定的方向依赖,是接口分离原则(ISP)的另一种说法。