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

 

评注者序

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

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

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

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

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

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

 

 

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

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

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

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

 

Erich Gamma

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

熊节