Skip to content

简单设计

满足系统所有需求特性,同时提供最大修改灵活性的最简设计就是该系统的最佳设计。

简单设计是基于高层级策略不关心低层级细节实现的设计。高层级策略被隔离于低层级细节之外,不会受到对于低层级细节修改的影响。

简单设计法则:

  1. 覆盖测试。
  2. 揭示意图。
  3. 没有重复。
  4. 最少元素。

YAGNI

YAGNI 是你不需要它(You aren't gonna need it)。如果丢弃钩子的成本可以接受,大概就不该用钩子。如果在设计中使用钩子的成本随着时间推移变得太高,而用到钩子的概率很低的话,大概你就不该把钩子放进来。

无论怎么看,钩子都问题多多。我们特别不擅长预测客户真正想做的事。我们往往基于不怎么会发生的假设情况,塞进了远多于所需的钩子。

有时,使用钩子是好主意。在代码中预留未来余地的做法并未过时,顾及未来永远是明智做法。

用测试覆盖

覆盖

测试覆盖,就是指覆盖 100% 的代码行,以及覆盖 100% 的代码分支。

渐进目标

100% 是不可能达到的目标。将 100% 看作渐进目标。

设计

可测试的代码就是解耦了的代码。

测试不仅测试行为,也测试耦合程度。编写分离出来的测试也是一种设计行为,因为被测试的代码必须被设计为可被测试。

充分表达

底层抽象

如果每行代码、每个函数和每个模块都安置在定义明确的分区中,清楚描述了代码的层级,以及自身在整个抽象中的位置,那么这个软件系统就具有表现力。

把高层级的策略和低层级的细节分开,是使设计简单和富有表现力的最基本要素。

尽量减少重复

重复会导致脆弱。一般来说,最好将重复代码抽象为新函数,并为其提供适当的参数,以适应不同调用场景的差异。

意外重复

在有些情况下,两段代码可能非常相似甚至一模一样,但将会出于截然不同的原因而被修改。这类情况称为意外重复。随着需求的变化,两段代码将各自演化,这种重复将被消解。

意外重复的两段代码各有意图。真重复的代码意图一致。

尺寸尽量小

简单设计由简单元素组成。在让所有测试都通过之后,在让代码尽可能有表现力之后,在把重复的部分降到最低之后,在不违反其他三条法则的情况下,努力减小每个函数内部的代码规模。

Released under the MIT License.