重构的定义:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构,提高其可理解性,降低其修改成本。
重构的关键:运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。因此,在重构的过程中,代码要时刻处于可工作状态,即便重构没有完成,也可以在任何时刻停下来。
重构的时机:如下所示:
1.预备性重构:对相似功能的代码进行重构,从而让添加新功能更加容易。
2.帮助理解的重构:在一些小细节(函数改名,变量改名,拆分大函数等)上使用重构来时代码更易懂。
3.捡垃圾式重构:在精力有限的情况下,每次对不好的代码修改一点点。积少成多,垃圾总会被清理掉。
4.长期重构:对一个要花费几个星期的大型重构,需要让团队所有开发人员在触及到重构区的代码时,就把它朝想要改进的方向推动一点。
5.复审代码时重构:在复审代码时,采用和原作者结对编程的方式对不好的代码提出重构方案,并实现验证。
重构的挑战以及解决方案:如下所示:
1.延缓新功能开发:由于项目管理者需要保障开发进度,所以一般不乐意花时间去做重构工作。此时最简单有效的解决方案就是不告诉项目管理者你在做重构工作。
2.代码所有权:由于开发者是没有权限去修改调用者的代码,所以一旦开发者自作主张的重构代码,就一定会影响调用者的程序。此时最简单有效的解决方案就是采用开源模式(团队代码所有制),每个成员只需要监控自己责任区内发生的修改即可。
3.分支:由于分支存在时间越长,在进行集成(就是将主干的修改拉到分支上,并且将分支的修改推回到主干上)操作时,代码被破坏的程度就会越大。此时最简单有效的解决方案就是采用持续集成(基于主干开发)的方式,每个分支每天至少向主干集成一次。
4.测试:如果没有完备的自测试套件,那么重构的风险就会太大,可能引入bug。此时最简单有效的解决方案就是使用开发工具提供的自动化重构功能来辅助你安全的进行重构工作。
YAGNI:全称为"you aren’t going to need it"。该设计方法的核心思想就是立足当下,未来的事情酌情处理。例如在进行架构设计时,如果引入兼顾未来的一种灵活性机制不会增加复杂度,那么就大胆的引用;否则就必须证明该灵活性机制值得被引入。
重构与性能:重构使程序更加容易理解,但是往往也会带来性能问题,然而在清晰的程序上进行性能优化往往会变得更加容易。性能优化需要注意以下几点:
1.在开发期间不用持续关注代码来保持系统的高性能,因为这样会减缓开发速度,而是应该在开发后期的优化阶段去发现性能热点并去除性能热点。
2.哪怕你完全了解系统,也请实际度量它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。
3.如果你对大多数程序进行分析,就会发现它把大半时间都消耗在一小半代码身上。如果你一视同仁的优化所有代码,90%的优化工作都是白费劲的,因为被你优化的代码大多很少被执行。你花时间做优化是为了让程序运行更快,但如果因为缺乏对程序的清除认识而花费时间,那些时间就都被浪费掉了。
重构的记录格式:重构手法采用的一种标准格式。该格式组成部分如下所示:
1.名称:重构手法的名字和别名。
2.速写:更快速找到所需要的重构手法。
3.动机:介绍"为什么需要做这个重构"以及"什么情况下不该做这个重构"。
4.做法:一步步介绍如何进行此重构。
5.范例:以一个十分简单的例子说明此重构手法如何运作。