ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
每当我要进行重构的时候,第一个步骤永远相同:我得确保即将修改的代码拥有一组可靠的测试。这些测试必不可少,因为尽管遵循重构手法可以使我避免绝大多数引入bug的情形,但我毕竟是人,毕竟有可能犯错。程序越大,我的修改不小心破坏其他代码的可能性就越大——在数字时代,软件的名字就是脆弱。 `statement`函数的返回值是一个字符串,我做的就是创建几张新的账单(invoice),假设每张账单收取了几出戏剧的费用,然后使用这几张账单作为输入调用`statement`函数,生成对应的对账单(statement)字符串。我会拿生成的字符串与我已经手工检查过的字符串做比对。我会借助一个测试框架来配置好这些测试,只要在开发环境中输入一行命令就可以把它们运行起来。运行这些测试只需几秒钟,所以你会看到我经常运行它们。 测试过程中很重要的一部分,就是测试程序对于结果的报告方式。它们要么变绿,表示所有新字符串都和参考字符串一样,要么就变红,然后列出失败清单,显示问题字符串的出现行号。这些测试都能够自我检验。使测试能自我检验至关重要,否则就得耗费大把时间来回比对,这会降低开发速度。现代的测试框架都提供了丰富的设施,支持编写和运行能够自我检验的测试。 > ![](https://box.kancloud.cn/9cf522e33e311401bf0d755d003df8ea_19x20.jpeg) 重构前,先检查自己是否有一套可靠的测试集。这些测试必须有自我检验能力。 进行重构时,我需要依赖测试。我将测试视为bug检测器,它们能保护我不被自己犯的错误所困扰。把我想要达成的目标写两遍——代码里写一遍,测试里再写一遍——我就得犯两遍同样的错误才能骗过检测器。这降低了我犯错的概率,因为我对工作进行了二次确认。尽管编写测试需要花费时间,但却为我节省下可观的调试时间。构筑测试体系对重构来说实在太重要了,因此我将用第4章一整章的笔墨来详细讨论它。