> For the complete documentation index, see [llms.txt](https://ethan-lin.gitbook.io/refactoring/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ethan-lin.gitbook.io/refactoring/xiang-jin-mei-gui/15-project-summary.md).

# 项目总结

在极限编程的实践中，测试驱动开发与重构总是如影随形。在我们看来，根本就不应该有“花大段时间重构”这样的事情发生。重构应该贯穿在整个开发过程中：**写 5 分钟代码，花上 20 秒重构，这才是敏捷软件开发应有的节奏**。

但是，我们总有遇上祖传代码的时候。它们缺乏测试、质量不佳、结构混乱。想在这样的代码基础上做任何事都会步履维艰。我们必须掌握进行较大规模重构的技能，才能有效应对祖传代码带来的挑战，才能真正把敏捷应用到最核心的系统。

在这个项目里，我们见识了镶金玫瑰商店的祖传代码。刚一接手，我们完全不知道应该拿这堆复杂的代码怎么办。但随着一步步重构进行，代码变得清晰易读，业务规则自然地从代码中浮现出来。

在这个过程中，我们做了下列练习：

* 用“录制/回放”的办法，为祖传代码搭建安全网；
* 跟随 IDEA 的提示对代码做最基本的清理；
* 提炼并重组代码中的大块逻辑，把行为放到适当的对象；
* 消除魔法字符串；
* 用工厂方法封装对象的创建过程；
* 建立继承体系；
* 用多态取代复杂的条件逻辑。

整个重构过程中，我们坚持了小步前进的原则：每次只做很小的修改，每次修改之后都运行所有测试，确保软件行为保持不变。这样做的结果是，**我们可以在任何一分钟暂停重构**，提交代码，去处理一些别的事情，回头再接着重构。祖传代码不会一夜之间被清理干净，我们要保持“日行一善”、持续改进的节奏，不能因为步子迈得太大把自己陷在泥潭中进退两难。

在重构过程中，IDE 的支持非常重要。像 Intellij IDEA 这样出色的 IDE，可以自动化很多重构步骤，从而大大降低重构出错的几率。作为程序员，我们也必须摸熟 IDE 提供的重构支持功能，才能在需要的时候能得心应手地使用。
