TDD - 重构毕业录

TDD - 重构毕业录
0

熊节老师组织的 TDD 训练营中训练打卡了14天,终于毕业了~

按照惯例,一趟学习的结束,要进行一场 retrospect,接下来就以其中一道题目的三次打卡,来说明一下我的收获:

题目是 http://codekata.com/kata/kata06-anagrams/ ,大家可以自行查阅。

talk is cheap, show you the code~

version1:

这是我第一版本的实现,上图为测试代码,下图为实现代码。

从测试用例可以看出,我将功能划分成了一下几个部分

  1. 读取文件
  2. 比较两个单词是否为 Anagram
  3. 创建一个结果二维数组,对每个单词查找是否属于某个 Anagrams 的数组,并将其加入到对应的分组
  4. 过滤掉结果中只有1个单词

这个版本基本完成了功能,但是很遗憾,因为代码设计的问题,这个程序跑起来相当慢(挂了20分钟没跑完),导致 TDD 的时候不知

道该如何进行测试。后来请教了熊节老师,学习到可以尝试用 fake 的小数据来进行测试的方法。

速度上,实现这一版的代码用了一个半小时的时间,对任务的拆分是一个复杂的过程。

version2

这一版主要对之前的代码的任务进行了重新划分:

1.比较两个单词是否是 Anagram

2.获取单词数组中的第一个单词,寻找所有的 Anagrams, 放入结果数组中

3.过滤掉原单词数组中找到的 Anagrams

比较上一版,除了方法上的更改,还进行了一些重构:

  1. 明确读取文件的功能应该是在外部输入,将这个功能抽到了测试代码中
  2. 用 filter 管道代替了遍历循环
  3. 封装了类和方法,使语义化更清晰
  4. 使用查询方法替代变量,使函数更短

通过这一版的改进,测试代码描述得更加清晰,实现代码更短。

实现这一版代码用了不足1小时的时间,相比第一版,对任务的拆分更加清晰。但仍有一些 bad smell, 比如一个不可避免的 while 循环,以及不断被改变的 originWordList 属性。

version3

这一版的代码相对而言更简洁了,一个屏幕放完了所有测试代码和实现代码~

在不断这道题目的练习时发现,将单词两两比较时,其实是用同样的方法将他们都转化成了一个“特征值”来比较。于是在重写这一版代码的时候,就将“比较单词”的任务拆分成了“提取特征值”的任务。最后进行分类和过滤的动作就异常简单了。

因为测试代码更加清晰,通过阅读测试代码,大概可以说明:“完成 Anagrams 分三步,提取单词的特征值,将单词归类到对应的分类,过滤结果”

同时因为测试代码的清晰,也更有信心地、不加思索地对每个单元进行重构。

完成这一版代码只用了20分钟。

总结

  • 套用熊节老师的话“程序员的基本功就是拆解任务和用代码与别人交流的能力”,TDD 练习的是前半句,重构练习的是后半句。
  • TDD 和重构密不可分。以前光看《重构》或山羊书都有些看不进去,很难去实践。通过这个训练营,强制自己去 TDD 解决任务,发现了再看《重构》这本书并进行实践的时候,会非常的自然,真香。
  • 重构时只需要记住和关注 bad smell, 然后再去 翻书去看有什么手法来消除。有 TDD 的保驾护航,你发现代码真的可以随便玩~
  • TDD 需要大量的练习,反复地练习。其实写代码也是这样,但是 TDD 和重构可以让你反复练习 DRY 的代码。

最后 ,我关于这次训练营的代码都在 https://github.com/demongodYY/codo-kata 上,欢迎大家来和我讨论。

最后的最后 ,帮熊节老师的 TDD 训练营打个广告,请搜索微信公众号:程序员练功房

4赞

666