阅读笔记:《程序员修炼之道》——2.8 正交性
这两天在做一个系统分析和设计的过程中,突然想起《程序员修炼之道》中有的一节是介绍正交性理论的,乘热打铁做了一次阅读笔记。
如果你想要制作易于设计、构建、测试和扩展的系统,正交性是一个十分关键的概念,但是,正交性的概念很少被直接讲授,而常常是你学习的各种其他方法和技术的隐含特性。这是一个错误。一旦你学会了直接应用正交性原则,你将发现,你制作的系统的质量立刻就得到了提高。
什么是正交性
“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的。用向量术语说这两条直线互不依赖。 在计算技术中,该术语用于表示某种不相依赖性或是解耦性。如果两个或更多个事务中的一个发生变化,不会影响其他事物,这些事物就是正交的。在设计良好的系统中,数据库代码与用户界面是正交的:你可以改动界面,而不影响数据库;更改数据库,而不用改动界面。
正交的好处
非正交系统的改变与控制更复杂是其固有的性质。当任何系统的各组件相互高度依赖时,就不再有局部(local fix)修正这样的事情。
提示13
Eliminate Effects Between Unrelated Things
消除无关事物之间的影响
我们想要设计自足的组件:独立,具有单一、良好定义的目的(Yourdon和Constantine称之为内聚(cohesion))。如果组件是相关隔离的,你就知道你能够改变其中之一,而不用担心其余组件。只要你不改变组件的外部接口,你就可以放心:你就不会造成波及这个系统的问题。
如果你编写正交的系统,你得到两个主要好处:提高生产率和降低风险。
提高生产率
- 改动得以局部化,所以开发时间和测试时间得以降低。与编写单个的大块代码相比,编写多个相对较小、自足的组件更为容易。你可以设计、编写简单的组件,对其进行单元测试,然后把它们忘掉——当你增加新代码时,无需不断改动已有的代码。
- 正交的途径还能够促进复用。如果组件具有明确而具体的、良好定义的责任,就可以用其最初的实现者未曾想过的方式,把它们与新的组件组合在一起。
- 如果你对正交的组件进行组合,生产率会有相当微妙的提高。假定某个组件做M件事情,而另一个组件做N件事情。如果它们是正交的,而你把它们组合在一起,结果就能做M*N件事情。但是,如果这两个组件是非正交的,它们就会重叠,结果能的事情就更少。通过正交的组件,你的每一份努力都能够得到更多的功能。
降低风险
- 正交的途径能降低任何开发中固有的风险。
- 有问题的代码区域被隔离开来。如果某个模块有毛病,它不大可能把病症扩散到系统的其余部分。要把它切掉,换成健康的新模块也更容易。
- 所得系统更健壮。对特定区域做出的小的改动与修正,你所导致的任何问题都将局限在该区域中。
- 正交系统很可能得到更好的测试,因为设计测试、并针对其组件运行测试更容易。
- 你不会与特定的供应商、产品、或是平台紧绑在一起,因为与这些第三方组件的接口将被隔离在全部开发的较小部分中。
设计
大多数开发者都熟知需要设计正交的系统,尽管它们可能会使用像模块化、基于组件、或是分层这样的术语描述该过程。系统应该由一组相互协作的模块组成,每个模块都实现不依赖于其他模块的功能。有时,这些组件被组织为多个层次,每层提供一级抽象。这种分层的途径是设计正交系统的强大方式。因为每层都只使用在其下面的层次提供的抽象、在改动底层实现、而又不影响其他代码方面,你拥有极大的灵活性。分层也降低了模块间依赖关系失控的风险。
对于正交设计,有一种简单的测试方法。一旦设计好组件,问问你自己:如果我显著的改变某个特定功能背后的需求,有多少模块会受影响?在正交系统中,答案应该是“一个”。
不要依赖你无法控制的事物属性
认同正交性
正交性和DRY原则紧密相关。运用DRY原则,你是在寻求使系统中的重复降至最小;运用正交性原则,你可以降低系统的各组件的相互依赖。这样说或许有点笨拙,但如果你紧密结合DRY原则、运用正交性原则,你将会发现你开发的系统会变得更为灵活、更容易理解、更易于调试、测试和维护。
