在解答这个问题之前,来聊聊什么是设计。类、方法命名成什么样子是不是设计?这个方法隶属于那个类是不是设计?给这个方法传什么参数算不算设计?等等等,其实这些都是代码设计。不只是设计模式那些东西才叫设计。
首先,测试驱动开发中的驱动更多的突出一种以终为始的思想,我们先要弄清楚我们要去哪里?如何判断我们到那里了?先定义好客户的验收标准,在定义验收标准的时候肯定会驱使我们思考如何设计出方便用户使用的接口,这样子我们设计就是被反向驱动出来的。
其次,人是一种趋利避害的高等动物。我们在写测试的时候,一定会想办法让测试更容易编写,没有人喜欢在一上路就给自己找麻烦,这就不得不驱使我们写出更易于测试的代码,而无数软件开发实践证明,利于测试的代码,它的设计不会太差,那些耦合度高、设计复杂的代码通常都不易于写测试(看看没有自动化测试的遗留系统就知道了)。”TDD并不会驱动出好的设计,TDD只会给你及时的反馈什么可能是糟糕的设计。” Kent Beck的这句话,体现的正是这个理。
最后,TDD中有一个核心动作–重构。我们先定义好验收标准,在定义验收标准的时候已经来过一轮设计了(接口的定义,类的定义等),然后让测试快速通过,这两个过程我们都能够很好的分离关注点,每次聚焦在一件事情上。通过之后,我们不能就这么过了,还要去停下来去重构实现代码,这就需要我们对好的设计有一定的理解,能够识别一些代码坏味道,识别不良的设计。如果从重构驱使着我们去改良设计,那么TDD的测试先行能够让我们的重构充满信息。从这个层面来讲,测试也是在驱动你去改良设计。