在几何学中,正交性的典型例子是坐标轴。只改变横轴的值,不会对纵轴值产生影响。 后来,正交性的影响逐渐延伸至软件设计领域。
比如,在设计良好的系统中,数据库与用户界面是正交的:改动界面,而不会影响数据库,反之亦然。
Unix文化缔造者道格拉斯·麦克罗伊(Malcolm Douglas McIlroy)曾总结的Unix哲学:“只做一件事,把它做好”,很多人以为只是在强调简单性,殊不知这其中也暗含了对正交性的强调。
软件中的正交性
随着软件功能增多,软件里的模块会变得越来越复杂,随时会变成一匹脱缰的野马,不受程序员的掌控,这时候就需要把软件系统的模块进行拆分。
而正交性就是模块拆分需要遵循的原则,意味着更改一个组件,另一个组件不会受到影响(比如多米诺骨牌)。这样逐渐复杂的系统才会变得相对有条理,方便后期的管理与维护。
如何遵循正交原则?
一旦涉及模块拆分,首先要解决的问题就是如何分,如何合。
(如何分)
当划分模块时,要让每个模块简单明了(高内聚),模块间不要有很强的关系。具体可依照以下两个原则:
1、消除重复
重复的代码,其实都在表达同一项功能需求。如果需求发生变化,这些分布在不同模块中的重复代码,统统都要修改,增加了维护成本。
有关 Don't Repeat Yourself 原则的内容可查看我们的往期视频,其实正交性原则与 DRY 原则紧密相关,运用DRY原则,可使系统中的重复降至最小;运用正交性原则,可减少系统组件间的相互依赖。
2、按需求分类
图书馆中,书籍会分有哲学、社会科学等不同区域。同理,在软件模块中,不同的小模块也有不同的职责,应尽量把这些关联紧密的部分放在此模块中,减少与其他模块的连接。
(如何合)
当模块通过接口相连时,需要让模块间尽可能不要相互影响。
比如乐高的A模型跟临近模型只通过底部相连,拿掉A不会影响其他模型。而B模型依赖于两边的模型,拿掉B后,组接的成本就会高一些。
同理,在软件设计中,模块间应尽量减少依赖,接口尽可能简单。
正交原则如何应用于实际工作中?
除了代码设计,正交原则大多可用于以下几个方面。
·用在编码中
编写代码的过程中,有很多方法可以维持正交性。
比如说编写“害羞”的代码,它们不会向其他模块暴露任何问题,彼此独立不干扰。
·用在项目团队中
具有正交性的项目团队,通常分工明确,效率最高。每个人都知道自己要做什么,并全力做出贡献。
如何检验一个团队是否具有正交性?
可观察项目中每个变动会涉及的人数,涉及人数越多,团队的正交性就越差。而正交性差会导致团队组织重叠,各成员的责任不明确,每次改动可能会让团队中的任一成员都会受到影响。
Kent Beck 曾提出一个精炼的原则:局部化影响。任何一个变化,对当前的软件设计影响范围都可以控制在一个尽量小的局部。当然这是所有软件从业者的理想状态,不妨就尽量去做吧。
《程序员修炼之道》系列更多视频可戳:《程序员修炼之道》系列视频