重构:改善既有代码的设计(评注版) 评注者序

 

评注者序

近十年来,若要讨论如何改进代码的质量,很难绕过Martin Fowler的这本经典著作。这本书已经影响了几代程序员,或许会持续不断地影响未来的一批程序员。遗憾的是,在现实中我们仍然看到了重构的步履维艰。一方面是因为程序员的重构技巧还有待磨砺,另一方面则是因为项目的压力,使得我们往往将重构视为鸡肋。

重构是可有可无的吗?Practices of an Agile Developer的作者Andy Hunt认为“要投入时间和精力保持代码的整洁、敞亮。在项目中,代码应该是亮堂的,不应该有黑暗死角。”相信维护过遗留代码的程序员,在面对纠缠不清、复杂混乱的代码时,对于此言必有“心有戚戚焉”之感。重构是清理代码垃圾的有效手段,它有助于营造明晰的程序结构、一致的代码风格、有效的职责重用,能够恰如其分地在简单与复杂之间寻觅到代码之美,合理地权衡代码质量与开发效率,从而提升至优雅编码的境界。

如何呈现重构之美?关键在于发现丑陋而不堪忍受。对丑的憎恶实则是一种强悍的驱动力,它会驱使你运用重构,直到重构变成如呼吸一般自然而不可缺失。重构无须专门的阶段,随时随地皆可进行。经常的重构可以保证代码常拭常新,如利刃一般锋利。那种为了单一地追求开发速度,而置代码质量于不顾的做法,实则是杀鸡取卵,可以预期的结果就是系统的“破窗户”逐渐蔓延,最后落得不可收拾的下场。重构并非不可执行,关键还在于我们对于重构的态度和运用重构的习惯。必须在思想上认同重构的重要性;然后在技巧上不断提升重构技能,并辅以对重构工具的使用,就能最大程度地放大重构在软件开发中积极的一面。

若要提升重构技能,阅读本书就是必须,没有例外。那么,对于这样的经典之作而言,还有点评的必要吗?是否我们在做着画蛇添足的蠢事?Martin Fowler已经做得足够好,任何点评都是一种饶舌?不尽然!身为点评者的我,如果仅满足于在本书的边边角角上,不痛不痒地发表不承担责任的语气词,那么对于这种点评,不要也罢。我在着手本书的点评工作时,对自己的定位是:我不是点评者,我是创作者。在点评本书的过程中,我是以创作自己著作的态度来完成的。

本书的大多数点评内容,并非片言只语,很多内容都是自己重构心得以及重构技巧的运用。我阅读参考了大量的书籍,例如《程序员修炼之道》、《重构与模式》、《领域驱动设计》、《反模式》、《软件架构的艺术》、《修改代码的艺术》、《代码整洁之道》等十余部相关书籍。毕竟站在软件世界的角度来看,Martin Fowler写作本书的时代已经相当“古老”了。在这之后,产生了许多精彩的设计技巧、重构理念与方法。譬如在与重构相关的内容中,本书未曾论述的就包括:架构重构、界面重构、数据库重构、重构模式等内容。在点评过程中,我希望能以开放的方式描述自己阅读本书的感受,讲述自己重构的体验,并在能力范围之内给出自己的一些意见与看法。

我作为一名程序员,看到了太多漠视或者无视垃圾代码的同行们,这其中也包括曾经的我。但当我深陷遗留代码的痛苦时,对于这样的现状就变得痛心疾首了。近年来,软件业界对于软件工艺以及敏捷方法的推行,在一定程度上改善了人们的看法,但在实际推行中依旧困难重重。最大的起因就在于我们将程序员定位为“代码工人”,认为编码工作是低端程序员的责任。我们妄图创造如机械制造行业一般的“软件工厂”,却忽略了软件编程实则还有艺术的一面。我始终认为,代码仍然是架构的一部分,代码质量决定了架构质量,而重构则是延缓系统衰老的生命源泉。正所谓“千里之行始于足下”,就让重构之行,始于本书吧。

 

“重构”这个概念来自Smalltalk圈子,没多久就进入了其他语言阵营之中。由于重构是框架开发中不可缺少的一部分,所以当框架开发人员讨论自己的工作时,这个术语就诞生了。当他们精练自己的类继承体系时,当他们叫喊自己可以拿掉多少多少行代码时,重构的概念慢慢浮出水面。框架设计者知道,这东西不可能一开始就完全正确,它将随着设计者的经验成长而进化;他们也知道,代码被阅读和被修改的次数远远多于它被编写的次数。保持代码易读、易修改的关键,就是重构——对框架而言如此,对一般软件也如此。

好极了,还有什么问题吗?问题很显然:重构具有风险。它必须修改运作中的程序,这可能引入一些不易察觉的错误。如果重构方式不恰当,可能毁掉你数天甚至数星期的成果。如果重构时不做好准备,不遵守规则,风险就更大。你挖掘自己的代码,很快发现了一些值得修改的地方,于是你挖得更深。挖得越深,找到的重构机会就越多,于是你的修改也越多……最后你给自己挖了个大坑,却爬不出去了。为了避免自掘坟墓,重构必须系统化进行。我在《设计模式》书中和另外三位作者曾经提过:设计模式为重构提供了目标。然而“确定目标”只是问题的一部分而已,改造程序以达到目标是另一个难题。

Martin Fowler和本书另几位作者清楚揭示了重构过程,他们为面向对象软件开发所做的贡献难以衡量。本书解释了重构的原理和最佳实践,并指出何时何地你应该开始挖掘你的代码以求改善。本书的核心是一系列完整的重构方法,其中每一项都介绍一种经过实践检验的代码变换手法的动机和技术。某些项目如Extract Method和Move Field看起来可能很浅显,但不要掉以轻心,因为理解这类技术正是有条不紊地进行重构的关键。本书所提的这些重构手法将帮助你一次一小步地修改你的代码,这就减少了过程中的风险。很快你就会把这些重构手法和其名称加入自己的开发词典中,并且朗朗上口。

我第一次体验有讲究的、一次一小步的重构,是某次与Kent Beck在30 000英尺高空的飞行旅途中结对编程。我们运用本书收录的重构手法,保证每次只走一步。最后,我对这种实践方式的效果感到十分惊讶。我不但对最后结果更有信心,而且开发压力也小了很多。所以,我极力推荐你试试这些重构手法,你和你的程序都将因此更美好。

Erich Gamma

《设计模式》第一作者,Eclipse平台主架构师

熊节  译

转载于:https://blog.51cto.com/bvbroadview/620653

重构:改善既有代码的设计(评注版) 评注者序相关推荐

  1. 重构—改善既有代码的设计

    概述 1.1 参考资料 <重构-改善既有代码的设计>读后总结 <重构改善既有代码的设计> 22种代码的坏味道,一句话概括 1.2 何谓重构 首先要说明的是:视上下文不同,重构的 ...

  2. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  3. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  4. PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

    介绍 承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容. 这章主要针对数据的重构. 1.争论的声音--直接访问Field还是通过函数(Accesso ...

  5. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

  6. 《重构-改善既有代码的设计》-第1例:租赁影片(2)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接  重构-改善既有代码的设计-第1例:租赁影片(1) 2  运用多态取代与价格相关的条件逻辑 2 ...

  7. 《重构-改善既有代码的设计》-第1例:租赁影片(1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 买了<重构 - 改善既有代码的设计 >一书,一直没有好好看,大致过了下也觉得只是有点点印 ...

  8. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

    重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来 ...

  9. 重构改善既有代码的设计(github源码)

    refactoring improving the design of existing code(重构改善既有代码的设计) https://github.com/CoderDream/refacto ...

  10. 重构:改善既有代码的设计(软件开发的不朽经典)

    重构:改善既有代码的设计(软件开发的不朽经典) 基本信息 作者: (美)Martin Fowler   译者: 熊节[同译者作品] 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:978 ...

最新文章

  1. php 字母转换成小写字母,PHP中将大写字母转换为小写字母的函数是_________
  2. Java 语言实现的 I/O 模型
  3. 终于记住回车和换行cr lf的来由和含义了 -参考: http://www.cnblogs.com/me115/archive/2011/04/27/2030762.html...
  4. es6 Promise.done(),Promise.finally()
  5. github 码云 获取_开发记录篇使用VS2019管理github项目
  6. java实现kmp_java 实现KMP算法
  7. Spring Boot学习总结(17)——Spring Boot常见面试题再总结
  8. javascript正则表达式验证IP,URL
  9. webpack文件系统缓存
  10. MyBatis学习笔记(2)-MyBatis入门
  11. WPS2019 电子表格/Excel文件保护密码忘记了?
  12. 深度学习(增量学习)——ICCV2021:SS-IL: Separated Softmax for Incremental Learning
  13. 如何删除微软拼音输入法2003
  14. Vivado HLS介绍及IP核的设计流程
  15. Mac查看电池健康情况、电池损耗的方法
  16. 【论文笔记】基于生成对抗网络的强化学习算法的研究
  17. cadence SPB17.4 - 从正常PCB文件反推原理图
  18. 博客的WordPress地址(URL)修改后博客打不开解决方法
  19. 比心app源码,html 获取时间
  20. ros中有关欧拉角和四元数互转的python写法

热门文章

  1. 在VI中删除行尾的换行符
  2. Shuffle'm Up——简单模拟
  3. select、poll、epoll优缺点
  4. create-react-app项目使用假数据
  5. 卡特兰数 HDU2067 HDU4165 HDU1134
  6. [转载] mysql 索引中的USING BTREE 的意义
  7. 使用canvas绘制时钟
  8. 流行的编程语言及其趋势
  9. [置顶] Java Socket实战之一 单线程通信
  10. INFO:InstallShield工程中如何将安装包集成的Prerequisites安装文件压缩到一个Setup.exe中...