早就听闻马丁·福勒的经典著作《重构 - 改善既有代码的设计》大名,但一直没有看。在这本书问世近二十年后,第2版修订出版了,并很快翻译引进。第2版的一大变化是代码示例语言从Java换成了JavaScript,于是趁此机会学习一番。

何谓重构

重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。

为何重构

是需求的变化使重构变得必要。

  • 重构改善软件的设计
  • 重构使软件更容易理解
  • 重构帮助找到bug
  • 重构提高编程速度

何时重构

  • 预备性重构:让添加新功能更容易
  • 帮助理解的重构:使代码更易懂
  • 捡垃圾式重构
  • 有计划的重构和见机行事的重构
  • 长期重构
  • code review时重构

重构实践

预先做出良好的设计很难,重构使软件的设计和架构不必在开始编程之前完成。

重构需要与版本控制,持续集成,自动化测试等其他实践协同进行。

重构与性能

重构可能使软件运行更慢,但也使软件的性能优化更容易。作者偏好的方法是编程时不对性能以特别关注,在开发后期性能优化阶段,分析热点,进行优化。

我并不完全认同作者的这一观点。在自动化测试,持续集成发布的项目中,没有什么开发后期优化阶段。重构不改变软件行为,是不能引入bug的。所以问题就转化成了如何对待性能问题,也就是性能问题是不是bug。如果自动化测试中包含了性能测试,性能达不到要求就是bug,那就不能先重构不管性能,后面再修复问题。

代码的坏味道

代码的坏味道:神秘命名,重复代码,过长函数,过长参数列表,全局数据,可变数据,发散式变化,霰弹式修改,依恋情结,数据泥团,基本类型偏执,重复的switch,循环语句,冗赘的元素,夸夸其谈通用性,临时字段,过长的消息链,中间人,内部交易,过大的类,异曲同工的类,纯数据类,被拒绝的馈赠,注释。

俗话说的好,命名是编程中最难的两件事之一,命名也是写书和翻译中很难的事吧,哈哈。为这些条款起名和翻译也是难为作者和译者了,很遗憾这些名字里也有很多神秘命名。

重构手法

重构手法太多了我就不列了,作者的网站上有列表。书中写的很详细,特别是做法部分,我怀疑没人能仔细看完,更没人能照着做法做。我也没有精读,是快速看完的,只了解了大意。这些手法更多的是语句函数层面的代码重构,个别涉及到了类和继承,比设计模式的抽象层次低,不涉及架构之类的问题。

总的来说本书很实用,阅读有收获,自己的代码能力都好像提高了呢(并没有)。