1. 理想的结构
软件设计中理想的结构是怎样的? 在给出答案之前,先看看自然界的例子。
首先是DNA。两条链围着一条中心轴,绕成双螺旋,只有三个组成元件:碱基、脱氧核糖和磷酸。它们先有序组合,再重复、延伸。简单、清晰。
然后是碳原子的组合,有好多种。如果每个碳原子与相邻四个碳原子相连,组成正四面体,再重复、拓展,就成晶体状的金刚石;如果每个碳原子与相邻其他三个碳原子相连,组成正六边形,再重复、堆叠,就成片状的石墨。也是简单、清晰。
同样的,软件设计也追求简单的结构。具体来说就是用简单的模式搭起来的小部件。
几个部件合成一体,在某个维度上重复、延伸。另外几个部件又合成一体,在另一个维度上重复、延伸。各个维度上部件组独立发展,同时在少量交点上彼此联系。
这就像一棵树,树枝间相互独立,又相互关联。
每个维度是内聚的。调整其中一个维度不影响其他维度;调整维度之间的接口,维度内部也只需要在局部做小的调整。这就是理想结构:简单清晰所以稳定,容易调整所以富有弹性。
测试驱动开发的初衷,正是希望得到这样的结构。
2. 怎么得到它
第一,测试驱动开发聚焦于明确的需求,不塞进空想的东西。不明确的需求,就让它呆在纸上、脑子里,直到成形。这样做的目的只有一个,保持设计简单。
第二,测试驱动开发有完善的、而且时时可继续完善的测试用例集。时时运行它们,首先的好处当然是验证稳定性,更大的意义则是在调整时提供保护。
这两点是测试驱动开发的两个基本要点。
有这两点做基础,开发者就不需要担心需求不完整、不准确。只要需求累积到一定的交付尺度,设计就可以从这个起点开始生长。因为设计是内聚的,未来如果有调整,也是有限、快速的。事实上,测试驱动开发追求快速变更的能力,而不追求对混沌未来的远见卓识。这正是术语“不过度设计”的含义。
在质量和效率之间取得平衡。一旦做到这一点,开发者的心里就是从容、淡定、无所畏惧的。
相关链接
测试驱动开发与设计模式 - 为什么使用测试驱动开发
测试驱动开发与设计模式 - 从入门到精通
测试驱动开发与设计模式 - C++书籍及网站
测试驱动开发与设计模式 - 适应并改进软件设计过程
测试驱动开发与设计模式 - 让“理想结构”与“快速变更”并行
测试驱动开发与设计模式 - 提速 — 在纸上做细节设计
测试驱动开发与设计模式 - 开发实例一 DVR-POS库
测试驱动开发与设计模式 - 开发实例二 JSON过滤库
测试驱动开发与设计模式 - 开发实例三 rs_driver库