加入TW一年多,也是实践了TDD一年多。一开始是跟着别人照猫画虎,最近开始总结出来点意思了。
这个转变是我们组的Tech Lead——Chris Stevenson给我带来的。
跟Chris一起pair时,一个印象深刻的事情是他写代码,如果发现需要的东西还不存在,比如需要某个对象提供某个方法,甚至需要一个新的对象封装某些逻辑,他是直接敲出这样的方法,完成当前需要的逻辑,然后借助IDE的自动修正功能生成所需的方法。
这种编写代码的过程,就好像是一个类的方法,都是由它的客户们的需求驱动出来的。而且因为方法名都是在编写客户代码时编写出来的,那些名字在客户代码环境中看起来非常贴切,可读性非常好。
对比起我之前的编码习惯,可以发现一些有意思的结论。我之前开始写程序时,会先想出一个我需要的类,然后基于这个类的数据成员构思出它应该对外提供的方法接口。有时候甚至会反复斟酌很久,以图设计出一个看上去“完美”的接口。其实最后那些精心设计出来的方法,有多少是集成后保留下来的(或者经过了某些修改),仔细想想其实并不乐观。
而Chris的这种习惯,基本上一个类的接口,都是在实际需要时才被创建出来,这样做出的类的接口非常紧凑,而且更贴近需求。
看到这里,熟悉TDD的人应该已经看出来了,其实这就是TDD的思想——从需求出发,思考一个类封装什么样的职责,需要提供什么样的接口。
现在,我正实践着这种编程方式,而且正从中获益。