软件设计的两个维度

我习惯把软件系统的逻辑放到两个维度上来分别来考量:整体结构 VS 组成部分 应对可能的变化,是系统设计的重要目标,亦是一个常见的挑战。对变化的部分进行总结,根据变化的形式不同,有两种情况:

  1. 系统的整体结构或秩序没有变化,系统的某一部分被更新,或者新的组成部分添加到已有的结构中
  2. 系统的各个组成部分没有变化,只是使用新的秩序和结构把旧的组成部分重新拼接在一起

传统的结构化设计方法中,推崇自顶向下的设计方法,选确定整体结构,推迟内部模块的实现,是一种先设计大纲, 后面做填空的方式.容易应对第一种变化,大不了修改局部,我架子还在, 就没有白干。而自底向上的设计方法,从最可能通用的功能模块开始设计,推迟模块的组成秩序和结构先设计积木,后面搭房子,容易应对第二种变化, 大不了推倒重搭, 我积木还在, 就不是重零开始。自然而然的就会奢望: 能不能同时使用自顶向下和自底向上的思路,并且期望能同时应对这两种变化?

把系统的整体结构的逻辑和组成部分的逻辑区分开,分别独立考虑,使用自顶向下的思路来分析整体结构,使用自底向上的方法来构造通用模块。发现整体结构和组成模块中的“元模型”,既能产生模型的模型。抽象出最一般化的问题。发现模块组成的规律,甚至“元规律”(规律之规律),规制化的接口,让不同组成部分能够按照任意的秩序和结构随意拼接,也让各个组成部分成为通用的配件。

这里所谓的“维度”,强调这是"两个正交的方向",。要衡量一个多维空间中,事物的运动和变化,要创建一个对应的坐标系统。好的坐标系统有这样的特征,其坐标轴是正交的。在一个维度或轴向的变动,不影响其他维度或轴向的映射点。例如:在直角坐标系中,x坐标的增加不影响y坐标值,如果在一个非正交的坐标系中观察事物运动,其复杂度将是不可想象的.“整体结构”和“组成部分”代表的两个思路,就是正交的两个坐标轴。构成了一个软件设计中使用的非常好的一个直角坐标系。