软件模块的正交设计

这篇文章是我的学习笔记,是通过学习作者袁英杰的文章《变化驱动:正交设计》有感而记。
摘录了他的一些句子。著作权归作者所有。

软件设计是为了实现功能,但功能的增加会降低人对软件的控制力,很快软件就会变得难以维护。人们使用分而治之的思想,进行软件系统的模块拆分。

为了降低软件的理解和修改的复杂度,提升可重用性,我们需要模块化

此时我们遇到了两个问题:怎么分,怎么合。说的细致一点是:怎么划分模块,怎么定义接口。

Kent Beck 说:“软件设计是为了在让软件在长期范围内容易应对变化。”
Kent Beck 提出了一个原则,要局部化影响

局部化影响的意思是:变化对软件设计带来的影响,要控制在尽可能小的范围内。

用软件工程的话,说的不那么抽象一点,要遵循高内聚、低耦合原则。

高内聚追求的是关联紧密的事物应该被放在一起,并且只有关联紧密的事物才应该被放在一起
低耦合追求的是软件的单位之间尽可能不要相互影响。

软件工程告诉我们,要让每个模块都尽可能高内聚,要让模块之间尽可能低耦合

而事实上,良好定义的模块与模块之间要实现交互,需要引入“接口”。而且要做到如下图所示的三边关系。

软件模块的正交设计_第1张图片
客户端、接口、实现 三方应追求的目标

该图来自于原文章。

这就是模块化设计的全部了。

如何将模块正交分解以减少变化带来的修改?

变化导致的修改有两类:

  1. 一个变化导致多处修改(重复);
  2. 多个变化导致一处修改(多个变化方向);

由此得到前两个策略:消除重复分离不同的变化方向

除此之外,我们要努力消除变化发生时不必要的修改,也有两种方式:

  1. 不依赖不必要的依赖;
  2. 不依赖不稳定的依赖;

这就是后面两个策略:缩小依赖范围向着稳定的方向依赖

怎么分
  • 消除重复
  • 分离不同的变化方向

重复包括客户端的重复和模块实现的重复,消除重复提高了模块的可复用性

当有变化需要让模块做其他方向的事情,那么优先选择改进代码使之做更加“通用”的事情,然后将不同的方向作为参数传入(你也可以根据语言特性选择模板、泛型、方法重载等技术)。将这些方向的选择从原模块中分离,将得到具有更高可扩展性的模块。

怎么合
  • 缩小依赖范围
  • 向着稳定的方向依赖

这两者都在强调接口的设计,接口应该精简,高内聚,稳定

说到稳定,看上面“分离不同的变化方向”的例子,是不是也是一个让接口更稳定的例子。

切记,需求来自客户端。要从需求上深挖其本质和共同点,才能设计好“高内聚的接口”。

你可能感兴趣的:(软件模块的正交设计)