程序员修炼之道-从小工到专家(摘录四)正交性

2018/01 08 23:01

如果你想要制作易于设计、构建、测试及扩展的系统,正交性是一个十分关键的概念,但是,正交性的概念很少被直接讲授,而常常是你学习的各种其它方法和技术的隐含特性。这是一个错误。一旦你学会了直接应用正交性原则,你将发现,你制作的系统的质量立刻就得到了提高。

什么是正交性

“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的。用向量术语说,这两条直线 互不依赖。沿着某一条直线移动,你投影到另一条直线上的位置不变。

在计算技术中,该术语用于表示某种不相依赖性或是解耦性。如果两个或者更多事物中的一个发生变化,不会 影响其它事物,这些事物就是正交的。在设计良好的系统中,数据库代码与用户界面是正交的;你可以改动界 面,而不影响数据库;更换数据库,而不用改动界面。

非正交系统

你正乘坐直升机游览科罗拉多大峡谷,驾驶员–他显然犯了一个错误,在吃鱼,他的午餐–突然呻吟起来,晕 了过去。幸运的是,他把你留在了离地面100英尺的地方。你推断,升降杆控制总升力,所以轻轻将其压低可以 让直升机缓降向地面。然而,当你这样做时,却发现生活并非那么简单。直升机的鼻子向下,开始左盘旋下降 。突然间你发现,你驾驶的这个系统,所有的控制输入都有次级效应。压低左手的操作杆,你需要补偿性地向 后移动右手柄,并踩右踏板,但这些改变中的每一项都会再次影响所有的其它控制。突然间,你在用一个让人 难以置信的复杂系统玩杂耍,其中每一项改变都会影响其它的输入。你的工作负担异常巨大:你的手脚在不停 地移动,试图平衡所有交互影响的力量。

直升机的各个控制器断然不是正交的。

正交的好处

如直升机的例子所阐明的,非正交系统的改变与控制更复杂是其固有的性质。当任何系统的各组件互相高度依 赖时,就不再有局部修正(local fix)这样的事情。

Eliminate Effects Between Unrelated Things
消除无关事物之间的影响

我们想要设计自足(self-contained)的组件:独立,具有单一、良好定义的目的(Yourdon)和Constantine 称之为内聚(cohesion)。如果组件是相互隔离的,你就知道你能够改变其中之一,而不用担心其余组件。只 要你不改变组件的外部接口,你就可以放心;你不会造成波及整个系统的问题。

如果你编写正交的系统,你得到两个主要好处:提高生产率与降低风险。

提高生产率

  • 改动得以局部化,所以开发时间和测试时间得以降低。与编写单个的大块的代码相比,编写多个相对较小的, 自足的组件更为容易。你可以设计、编写简单的组件,对其进行单元测试,然后把它们忘掉–当你增加新代码时,无须不断改动已有的代码。
  • 正交的途径还能够促进复用。如果组件具有明确而具体的、良好定义的责任,就可以用其最初的实现者未曾想象过的方式,把它们与新组件组合在一起。
  • 如果你对正交的组件进行组合,生产率会有相当微妙的提高。假定某个组件做M件事情,而另一个组件做N件事 情。如果他们是正交的,而你把它们组件在一起,结果就能做M*N件事情,但是,如果这2个组件是非正交的,他们就会重叠,结果能做的事情就更少,通过组合正交的组件,你的每一份努力能得到更多的功能。

降低风险

  • 正交的途径能降低任何开发中固有的风险
  • 有问题的代码区域被隔离开来。如果某个模块有毛病,他不大可能把病症扩散到系统的其余部分。要把它切掉 ,换成健康的新模块也更容易。
  • 所得系统更健壮。对特定区域做出小的改动与修正,你所导致的任何问题都将局限在该区域中。
  • 正交系统很可能得到更好的测试,因为设计测试、并针对其组件运行的测试更容易。
  • 你不会与特定的供应商、产品、或是平台紧绑在一起,因为与这些第三方组件的接口将被隔离在全部开发的较小部分中