正交性是什么

重读经典–《程序员修炼之道》

大多数开发人员对设计正交系统的必要性都很熟悉。只不过他们可能会使用其他一些词来描述这个过程,例如模块化、基于组件和分层,等等。

正交性是什么

“正交性”是从几何学中借用来的术语。

若两条直线相交后构成直角,它们就是正交的。

例如,图表中的坐标轴就是正交的。对于向量而言,这两条线相互独立。图示中的向量1指向北,完全不影响东西朝向。向量2指向东,完全不影响南北朝向。

在计算科学中,这个术语象征着独立性或解耦性

对于两个或多个事务,其中一个的改变不影响其他任何一个,则这些事物是正交的。

在良好设计的系统中,数据库相关代码应该和用户界面保持正交:你可以变更界面但不应影响数据库,切换数据库而不必要更换界面。

正交的好处

编写正交的系统,就能获得两个主要的收益:提高生产力及降低风险

提高生产力

1、将变更限制在局部后,开发时间和测试时间都会减少。

2、正交的方法同时促进了重用。

3、组合正交组件能获得相当微妙的生产力提升。

假设一个组件能做M件独特的事情,另一个能做N件。如果它们是正交的,组合起来就能做M*N件事。如果两个组件不正交,有重叠之处,结果就少一些。

在正交组件的组合过程中,单个单元的性价比提高了。

降低风险

1、代码中病变的部分被隔离开。

如果一个模块生病了,不太可能将症状传播到系统的其他部分。把它切下来并移植一个新的健康器官进去,也更加容易

2、这样获得的系统不那么脆弱。

对特定区域进行小的变更和修复后,因此而产生的任何问题都将局限于该区域。

3、你不会被特定的供应商、产品或平台紧紧束缚。

因为这些第三方组件的接口所关联的,仅仅是整个开发中相对很小的一部分。

4、正交系统可能更利于测试,因为为其组件设计和运行测试更加容易

正交的方法

设计

系统应该由一组相互协作的模块构成,每个模块实现的功能应独立于其他模块。

有时这些模块组件被组织到不同的层次上,每一层都做了一级抽象。

这种分层的实现是设计正交系统的有力途径。

因为每一层只使用它下面一层提供的抽象,所以可以在不影响代码的情况下极其灵活地更改底层实现。

工具包和程序库

在引入第三方工具包和程序库时,请注意保持系统的正交性。技术选择要明智。

当你拿出一个工具包时,问问自己,它是否会将一些不应该有的变化强加给你代码。

编码

每当你写下代码时,就有降低软件的正交性的风险。

不仅需要盯着正做的事情,还要监控软件的大环境。

养成不断质疑代码的习惯。只要有机会就重新组织、改善其结构和正交性。这个过程被称为重构。

保持代码解耦

编写害羞的代码–模块不会向其他模块透露任何不必要的信息,也不依赖于其他模块的实现。

试试最少知识原则。如果你需要改变一个对象的状态,让该对象替你来完成。这样做能让你的代码和其他代码实现隔离,更有可能保持正交性。

避免全局数据

只要代码引用全局数据,就会将自己绑定到共享该数据的其他组件上。

即使只打算对全局数据进行读操作,也可能引发问题。

避免相似的函数

重复代码是结构问题的症状。

测试

基于正交性设计和实现的系统更容易测试。

由于系统组件之间的交互是形式化的,且交互有限,因此可以在单个模块级别上执行更多的系统测试。

文档

正交性也适用于文档。其涉及的两个独立维度是内容和呈现。

真正符合正交性的文档,应该能够在不改变内容的情况下显著地改变外观。

公众号:码农戏码
欢迎关注微信公众号『码农戏码』