程序员修炼之道9 正交性

本来以为今天可以恢复去上班,可是昨天半夜还是继续发烧,靠退烧片压制,不过总体来说应该是在恢复中了,明天就可以重见天日了...

在家休息还是挺可以读读书的写写感受的,继续修炼修炼,说到正交性。作者的第一段话我就非常认同。

正交性是一个至关重要的概念。然而,正交性的概念很少被直接教授,在平时学习的各种方法和技术中,它往往是很不明显的特性——这很令人遗憾。一旦你学会了直接运用正交性原理,构建出的系统的质量就会有立竿见影的改进。

正交的概念来源于坐标系,二维空间的坐标是x,y,每一组x y对应了二维空间的一个点,每一个点又必然对应了x y两个坐标。这就非常有用了,描述空间中的点,就不需要用复杂的语言了,用两个数字轻松搞定,x 和 y是各自维度的特征,彼此互不影响,组合起来可以打遍天下。

我们在建模过程中也会需要用很多特性来表征一个事物的特点,最好的表征方法是学习xy的正交性方法,这样用到的特性数量最少,含义最清晰。

举一个我们去年折腾了几个版本的重构,干的就是正交化这件事。

说一个运输任务,有很多类型,有用车的,用船的,有火车的,有整车的,有零担的,有集装箱的等等。

domain里有设计了两个特性,一个叫运输模式,一个叫装载模式。运输模式呢主要有两种,一种叫散卡,一种叫集卡,装载模式呢有零担,整车,拼箱,整箱,好了合在一起呢就叫散卡零担,集卡整箱这样的。

后来应客户要求在运输模式里加了铁路,水路。好了混乱就由此开始了,到底铁路整箱算不算是集装箱运输呢?系统的答案是不一定,因为系统中大部分的判定看的是运输模式中的集卡,少部分看的是装载模式中的整箱。为了消除这些差异,用了大量的特殊逻辑来专门处理,肯定无法做到简单清晰了。

回过头来看看根源是什么呢?应该说在模型设计上用运输模式和装载模式这两个特性来表征运输的特征是没问题的,但是在使用这两个特性没有秉承正交性的原则,集卡对应拼箱和整箱,散卡对应零担和整车,这两个特性变成了一个上下级的关系,这个时候再在上层加一个铁路,要直接用到整箱的特性就混乱了。

所以重构就是把运输模式还原成本身的含义:铁路,公路(涵盖之前的散卡和集卡),水路,航空。装载模式保持不变。这样在含义上是非常清晰的,判断是不是集装箱运输唯一的标准是看装载模式这个特性,不存在双重标准的问题。虽然付出了一些重构的代价,使特性的含义一目了然,也为进一步拓展打下了基础。

所以正交性真的非常重要,特别是一些影响流程的关键特性一定要考虑好正交性。

推荐阅读更多精彩内容