全文学习于 《敏捷整洁之道》
作者:[美] 罗伯特·C.马丁
译者:申健 何强 罗涛
1. 测试驱动开发
-
测试驱动开发类似于复式记账:
- 复式记账:每笔交易会写入账本两次
- 在一组账户中记一笔贷项,然后相应的在另一组账户中记为借项,这些账户最终汇总到收支平衡表文件中,如果差额不为 0,那么就出错了;
- 测试驱动开发需要每个必要的行为都输入两次:
- 一次作为测试,另一次作为使测试通过的生产代码;
- 当测试代码与生产代码一起执行时,失败的测试数为零;
- 复式记账:每笔交易会写入账本两次
-
TDD 三规则
- TDD 可以描述为以下 3 条简单的规则:
- 先编写一个因为缺乏生产代码而失败的测试,然后才能编写生产代码;
- 只允许编写一个刚好失败的测试 – 编译失败也算;
- 只允许编写刚好能使当前失败测试通过的生产代码;
- TDD 可以描述为以下 3 条简单的规则:
-
TDD 的好处:
- 假设有一个遵循三规则的程序员,该程序员的所有工作内容都在一分钟之前执行并通过全部测试,那么代表着这个程序员一分钟之前所有内容都是可以工作的;
- 即使出了问题,一分钟以内的故障都是小事一桩,根本不需要动用调试器来寻找问题。
-
基于 TDD 模式开发程序,不是不会遇到棘手的 bug,而是会降低 bug 的发生率和严重性;
2. 重构
-
重构是改善代码结构的实践,但并不改变由测试定义的行为;
- 在不破坏任何测试的情况下对命名、类、函数和表达式进行修改;
- 在不影响行为的情况下改善系统的结构;
- 在重构时,测试必须始终保持通过的状态;
-
编写可用的代码和整洁的代码是两个不同的维度,同时控制很难:
- 可以先以粗劣的想法草草的使代码工作起来;
- 然后,一旦代码工作起来了且通过测试,就对其重构;
- 重构是一个持续的过程,而不是定期执行的过程;
-
重构不应该出现在时间表上,也不应该出现在项目的计划中;重构是每分钟,每小时软件开发活动中不可分割的一部分。
3. 简单设计
- 简单设计:仅编写必要的代码,使得程序结构保持最简单、最小和最富表现力;
- 规则如下:
- 所有测试通过;
- 揭示意图;
- 代码在工作之后还必须具备表现力;
- 消除重复;
- 减少元素;
4. 结对编程
- 结对是两个人共同解决同一个编程问题;
- 结对可能的模式:
- 一个是手持键盘和鼠标的驾驶员,一个是眼观六路的导航员;
- 另一种是,一个人先编写测试,另一位编写实现该测试的业务代码,然后交换来实现;
- 结对不需要事先安排,根据程序员的喜好来形成或解散搭档;
- 结对是团队成员之间共享知识并防止形成知识孤岛的最佳方法;
- 结对不一定是两个人,也被称为“聚众式编程”;