改良既有代码的设计机械制造

机械制造 1

传世经典书丛 

重构:改良既有代码的筹划(评注版) 

Martin Fowler,Kent Beck,John Brant,William Opdyke,Don Roberts(马丁.福勒,肯特.贝克,约翰.布兰特,威廉.奥迪克,唐.罗伯茨) 编著

张逸 评注

ISBN 978-7-121-13450-0

2011年6月出版

定    价:69.00元

16开

452页




重构,一句话来说,就是在不转移外部表现的前提下,有条不紊地立异代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为广大普通程序员平常开支工作中不可或缺的一有的。本书也就此变成与《设计形式》齐名的经文著作,被译为中、德、俄、日等很多言语,在世界范围内畅销不衰。

本书凝聚了软件开发社区专家多年追寻而收获的贵重经验,拥有不因时光流逝而消亡的市值。前几日,无论是重构本身,业界对重构的明亮,依旧开发工具对重构的支撑力度,都与本书最初出版时不足同日而语,但书中所蕴涵的表示和精髓,仍然值得反复咀嚼,而且多次可以常读常新。

本评注版力邀国内闻名专家执笔,在英文原著基础上增添粤语点评与注释,目的在于以先锋的学研心得与履行感悟,对读者读书与上学加以点拨、指明捷径。

评注者序

近十年来,若要琢磨什么立异代码的质料,很难绕过马丁 福勒的这本经典作品。这本书已经影响了几代程序员,或许会频频不断地震慑将来的一批程序员。遗憾的是,在切切实实中大家照例看到了重构的步履维艰。一方面是因为程序员的重构技巧还有待磨砺,另一方面则是因为品种的压力,使得大家反复将重构视为鸡肋。

重构是可有可无的啊?Practices of an Agile Developer的作者安迪(Andy) Hunt认为“要投入时间和生命力保持代码的卫生、敞亮。在品种中,代码应该是通晓的,不应该有黑暗死角。”相信维护过遗留代码的程序员,在面对纠缠不清、复杂混乱的代码时,对于此言必有“心有戚戚焉”之感。重构是清理代码垃圾的有效性手法,它推向营造明晰的程序结构、一致的代码风格、有效的天职重用,可以适合地在简短与复杂之间寻找到代码之美,合理地权衡代码质地与开支效能,从而升级至优雅编码的境界。

如何展现重构之美?关键在于发现丑陋而不堪忍受。对丑的憎恶实则是一种强悍的驱重力,它会促使你采纳重构,直到重构变成如呼吸一般自但是不可缺失。重构无须专门的级差,随时随地皆可开展。平日的重构可以确保代码常拭常新,如利刃一般锋利。这种为了单纯地追求开发进度,而置代码质料于不顾的做法,实则是杀鸡取卵,可以预期的结果就是系统的“破窗户”逐渐蔓延,最终落得不行收拾的下台。重构并非不可实践,关键还在于大家对于重构的态度和行使重构的习惯。必须在思想上认可重构的重要性;然后在技巧上穿梭升级重构技能,并辅以对重构工具的采用,就能最大程度地松手重构在软件开发中再接再厉的一端。

若要提高重构技能,阅读本书就是必须,没有例外。那么,对于如此的经文之作而言,还有点评的不可或缺吗?是否我们在做着画蛇添足的蠢事?马丁 Fowler已经做得丰硕好,任何点评都是一种饶舌?不尽然!身为点评者的自身,要是仅满意于在本书的边边角角上,不痛不痒地刊登不承担责任的语气词,那么对于这种点评,不要也罢。我在最先本书的点评工作时,对团结的固化是:我不是点评者,我是创作者。在点评本书的历程中,我是以创作自己撰写的姿态来成功的。

本书的大部点评内容,并非片言只语,很多内容都是和谐重构心得以及重构技巧的应用。我读书参考了汪洋的图书,例如《程序员修炼之道》、《重构与情势》、《领域驱动设计》、《反格局》、《软件架构的不二法门》、《修改代码的情势》、《代码整洁之道》等十余部相关书籍。毕竟站在软件世界的角度来看,马丁(Martin) 福勒写作本书的时代已经分外“古老”了。在这事后,发生了许多了不起的计划技术、重构理念与方法。譬如在与重构相关的始末中,本书没有论述的就包括:架构重构、界面重构、数据库重构、重构形式等情节。在点评过程中,我期望能以开放的艺术讲述自己读书本书的感想,讲述自己重构的体验,并在能力限制之内提交自己的有些见识与理念。

本身当做一名程序员,看到了太多漠视或者无视垃圾代码的同行们,那么些中也囊括曾经的我。但当自身陷入遗留代码的痛苦时,对于这么的现状就变得痛心疾首了。目前,软件业界对于软件工艺以及迅速方法的执行,在一定水平上改良了人人的意见,但在事实上施行中如故艰苦。最大的起因就在于我们将程序员定位为“代码工人”,认为编码工作是低端程序员的权责。我们妄图创制如机械创造行业一般的“软件工厂”,却忽视了软件编程实则还有艺术的一边。我始终认为,代码仍旧是架设的一有些,代码质地控制了架构质料,而重构则是延缓系统萎缩的性命源泉。正所谓“千里之行始于足下”,就让重构之行,始于本书吧。


 

 

“重构”这么些概念来源于Smalltalk圈子,没多长时间就进入了其他语言阵营之中。由于重构是框架开发中不可缺失的一有些,所以当框架开发人士商讨自己的办事时,这么些术语就诞生了。当她们可以自己的类继承连串时,当他俩叫喊自己能够拿掉多少有点行代码时,重构的概念渐渐浮出水面。框架设计者知道,那东西不容许一先河就完全正确,它将随着设计者的经历成长而更上一层楼;他们也知道,代码被阅读和被涂改的次数远远多于它被编辑的次数。保持代码易读、易修改的根本,就是重构——对框架而言如此,对一般软件也如此。

好极了,还有怎么着问题吧?问题很明朗:重构具有高风险。它必须修改运作中的程序,这或者引入一些科学觉察的不当。倘若重构格局不端庄,可能毁掉你数天甚至数星期的结晶。假设重构时不搞好准备,不遵从规则,风险就更大。你打通自己的代码,很快发现了有些值得修改的地方,于是你挖得更深。挖得越深,找到的重构机会就越多,于是你的修改也越多……最后你给自己挖了个大坑,却爬不出来了。为了制止自掘坟墓,重构必须系统化举办。我在《设计模式》书中和其它三位作者曾经提过:设计格局为重构提供了目的。但是“确定目的”只是问题的一片段而已,改造程序以达到目标是另一个难题。

马丁(Martin) Fowler和本书另几位作者清楚揭露了重构过程,他们为面向对象软件开发所做的贡献难以权衡。本书解释了重构的原理和特等实践,并提议什么时候哪儿你应该初露开掘你的代码以求改良。本书的着力是一密密麻麻完整的重构方法,其中每一项都介绍一种经过实践验证的代码变换手法的念头和技术。某些类别如Extract Method和Move Field看起来也许很浅显,但不要掉以轻心,因为清楚这类技术正是有条不紊地拓展重构的重大。本书所提的那个重构手法将帮衬你一遍一小步地修改你的代码,这就减弱了经过中的风险。很快你就会把这么些重构手法和其名目出席自己的开销词典中,并且朗朗上口。

本人首先次体会有侧重的、两次一小步的重构,是某次与Kent 贝克(Beck)在30 000英尺高空的飞行途中中结对编程。大家接纳本书收录的重构手法,保证每一回只走一步。最终,我对这种实践措施的职能感到很是惊叹。我不但对最后结果更有信念,而且付出压力也小了很多。所以,我极力推荐你试试那一个重构手法,你和您的先后都将由此更美好。

 

Erich Gamma

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

熊节  译

前  言

往年,有位咨询顾问造访客户调研其开发项目。系统核心是个类继承体系,顾问看了开发人员所写的片段代码。他发现整整系统分外凌乱,上层超类对于系统的运行做了部分一旦,下层子类实现那多少个倘诺。可是这个假若并不吻合所有子类,导致覆写(override)工作特别辛勤。只要在超类做点修改,就足以减掉过多覆写工作。在另一对地点,超类的一些意图并未被优异精通,因而其中一些行为在子类内再次出现。还有局部地点,好多少个子类做同样的作业,其实可以把它们搬到后续连串的上层去做。

这位顾问于是提出项目组长看看这多少个代码,把它们整理一下,不过经营并不热爱于此,毕竟程序看上去仍是可以够运作,而且类型面临很大的速度压力。于是主管说,晚些时候再抽时间做这一个整理工作。

顾问也把他的想法告诉了在这多少个延续体系上工作的程序员,告诉他们也许暴发的事体。程序员都很乖巧,登时就来看问题的要紧。他们通晓那并不全是他们的错,有时候确实需要依靠外力才能发现题目。程序员登时用了一两天的年月整治好这么些延续序列,并删掉了其中一半代码,效率毫发无损。他们对此分外满意,而且发现在此起彼伏体系中进入新的类或利用系统中的其他类都更快、更便于了。

项目主管并不喜形于色。进度排得很紧,有好多行事要做。系统必须在多少个月之后发布,而这一个程序员却白白消耗了两天时间,干的行事与要付出的多数职能毫无关系。原先的代码运行起来还算正常,他们的新规划看来有点过于追求面面俱到。项目要交付给客户的,是可以使得运转的代码,不是用来取悦学究的圆满东西。顾问接下去又提出应当在系统的别样中央部分进行这样的盘整工作,这会使整个项目暂停一至六个星期。所有这一个工作只是为着让代码看起来更理想,并无法给系统添加其余新效用。

你对这几个故事有咋样感想?你觉得这一个顾问的提议(更进一步整理程序)是对的呢?你会遵照这句古老的工程谚语吗:“如若它还足以运作,就不用动它。”

自己不可能不认同自己有几许偏见,因为自身就是分外顾问。两个月之后这多少个项目揭发破产,很大的来由是代码太复杂,不可能调试,也无从赢得可被接受的属性。

新兴,项目再度起动,几乎从头起始编写整个系统,Kent Beck受邀做了参谋。他做了几件迥异以往的事,其中最首要的一件就是坚定不移以持续不断的重构行为来整治代码。那多少个类另外功成名就,以及重构在这多少个成功项目中饰演的角色,启发了自家写那本书,如此一来我就可以把Kent和其余一些人早已学会的“以重构格局改进软件质地”的学识,传播给所有读者。

如何是重构

所谓重构(refactoring)是这么一个进程:在不转移代码外在表现的前提下,对代码做出修改,以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减小整治过程中引入错误的几率。本质上说,重构就是在代码写好之后立异它的宏图。

“在代码写好之后改进它的设计”这种说法有些奇怪。按照目前对软件开发的知情,我们深信应该先规划而后编码:首先得有一个赏心悦目的计划,然后才能先导编码。不过,随着年华流逝,人们穿梭修改代码,于是按照原先计划所得的系统,全体布局日趋收缩。代码质料逐渐沉沦,编码工作从严俊的工程腐败为胡砍乱劈的随性行为。

“重构”正好与此相反。哪怕你手上有一个糟糕的计划,甚至是一堆混乱的代码,你也可以借由重构将它加工成设计赏心悦目的代码。重构的每个步骤都很粗略,甚至显得有些过于简短:你只需要把某部字段从一个类移到另一个类,把一些代码从一个函数拉出去构成另一个函数,或是在继续序列中把一些代码推上推下就行了。可是,聚沙成塔,这个细小修改累积起来就可以根本改正计划质地。这和一般常见的“软件会日趋腐烂”的看法相反。

透过重构,你可以找出改变的平衡点。你会发现所谓计划不再是任何动作的前提,而是在整整开发进程中逐年透表露来。在系统构筑过程中,你可以学学如何深化统筹,其间带来的相互可以让一个顺序在支付进程中不止保有优秀的规划。

本书有咋样

本书是一本为标准程序员而写的重构指南。我的指标是告诉你怎么着以一种可控制且高效率的点子举办重构。你将学会怎么有条不紊地改进程序结构,而且不会引入错误,这就是没错的重构形式。

按部就班传统,图书应该以引言起先。即便我也同意那么些规则,不过本人发现以概括性的座谈或概念来介绍重构,实在不是一件容易的事。所以自己控制用一个实例做为开路先锋。第1章显示了一个小程序,其中有些常见的统筹缺陷,我把它重构为更合格的面向对象程序。其间我们可以见见重构的历程,以及多少个很有用的重构手法。假若你想明白重构到底是怎么回事儿,这一章必须读。

第2章钻探重构的常备原则、定义,以及开展重构的来由,我也大体介绍了重构所存在的一部分题目。第3章由Kent Beck介绍怎么着嗅出代码中的“坏味道”,以及哪些使用重构清除这多少个坏味道。测试在重构中扮演着十分重要的角色,第4章介绍怎样行使一个简练而且开源的Java测试框架,在代码中建筑测试环境。

本书的中央部分——重构列表——从第5章延伸至第12章。它不可以说是一份全面的列表,只是一个起头,其中包括迄今截止我在工作中整理下来的保有重构手法。每当我想做点什么——例如Replace Conditional with Polymorphism (245)的时候,这份列表就会提醒我哪些一步一步安全提升。我梦想这是值得您之后屡次回顾的有的。

本书介绍了其旁人的不在少数研商成果,最终几章就是由他们其中的几位客串所写的。比尔(Bill) Opdyke在第13章记述他将重构技术利用于经贸支出过程中遇见的局部题材。Don 罗Bert(Robert)s和约翰(John) 布兰特在第14章展望重构技术的前途——自动化工具。我把最后一章(第15章)留给重构技术的顶级大师Kent 贝克(Beck)来压轴。

在Java中使用重构

本书范例全体应用Java撰写。重构当然也足以在任何语言中落实,而且自己也指望这本书可以给任何语言使用者带来帮衬。但自身认为自己最好在本书中只行使Java,因为这是自个儿最熟稔的语言。我会平常写下一些提醒,告诉读者如何在任何语言中展开重构,然而自己真诚愿意观望其旁人在本书的根基上针对其他语言写出更多重构方面的图书。

为了很好地与读者互换我的想法,我尚未运用Java语言中特意复杂的一部分。所以我防止接纳内嵌类、反射机制、线程以及无数精锐的Java特性。那是因为自身盼望尽可能精通地展现重构的主干。

自家应当提拔您,这一个重构手法并不针对并发或分布式编程。那个大旨会引出更多的考虑,本书没有提到。

何人该阅读本书

本书的靶子读者是标准程序员,也就是这个以编制软件为生的人。书中的示例和议论,涉及大气亟待详细阅读和清楚的代码。这一个事例都以Java写成。之所以采纳Java,因为它是一种选取范围进一步广的言语,而且其他拥有C语言背景的人都足以随意精通它。Java是一种面向对象语言,而面向对象机制对于重构有很大扶持。

即便关注对象是代码,但重构对于系统规划也有英雄影响。资深设计师和架构师也很有必不可少精通重构原理,并在融洽的项目中接纳重构技术。最好是由一把手、经验充裕的开发人员来引入重构技术,因为这么的人最可以透彻通晓重构背后的原理,并按照意况再说调整,使之适用于特定工作圈子。如若你采取的不是Java,这点进一步紧要,因为您无法不把自家付出的范例以其它语言改写。

上边我要告知你,如何可以在堵塞读全书的图景下充裕用好它。

q 假使你想清楚重构是何等,请阅读第1章,其中示例会让您通晓重构的过程。

q 如若你想了然为什么应该重构,请阅读第1、2章。它们告诉你重构是如何以及为啥应该重构。

q 即使您想掌握该在哪些地点重构,请阅读第3章。它会报告您有的代码特征,这么些特征提议“那里需要重构”。

q 若是你想动手开展重构,请完整阅读第1~4章,然后选取性地翻阅重构列表。一开头只需概略浏览列表,看看里面多少如何,不必明白有所细节。一旦真的需要履行某个轨道,再详尽阅读它,从中拿到协理。列表部分是供查阅的参考性内容,你不要五次就把它全体读完。其它你还应当读一读列表之后其他作者的“客串章节”,特别是第15章。

站在前人的肩膀上

就在本书一开首的此时此刻,我不可以不说:这本书让自家欠了一大笔人情债,欠这么些在过去十年中做了大气钻探工作并创立重构领域的人一大笔债。这本书原本应该由他们中间的某部人来写,但最后却是由本人这些有时间有生气的人捡了有利于。

重构技术的两位最早倡导者是沃德(Ward) Cunningham和Kent 贝克。他们很已经把重构作为开发进程的一个基本成分,并且在自己的支付进程中采纳它。尤其需要表明的是,正因为和Kent的合作,才让自家真的看到了重构的重大,并直接激发了本人写出这本书。

Ralph 约翰逊在UIUC(北达科他大学厄巴纳—尚Penn分校)领导了一个小组,那么些小组因其在目的技术上边的其实贡献而名声远扬。拉尔夫(Ralph)很早就是重构技术的维护者,他的局部学员也直接在探究这多少个课题。比尔 Opdyke的大学生随笔是重构探讨的首先份详细的封皮成果。约翰(John) 布兰特和Don 罗Berts则早已不满意于写作品了,他们写了一个工具叫Refactoring Browser(重构浏览器),对Smalltalk程序实施重构工程。

致谢

固然有这个研究成果可以借鉴,我或者需要广大扶植才能写出这本书。首先,并且也是最紧要的,Kent 贝克(Beck)给了自身伟大的援助。Kent在科伦坡的某部酒吧和自家谈起她正在为Smalltalk Report撰写一篇杂文[Beck,hanoi],从此播下本书的首先颗种子。这次谈话不仅仅让我起来注目到重构技术,而且自己还从中“偷”了很多想方设法放到本书第1章。Kent也在其他许多方面支援自己,想出“代码味道”这么些概念的是他,当我遇见各个困难时,鼓励自己的人也是她,经常和自身一起坐班助我形成这本书的,依然她。我平常忍不住这么想:他完全可以协调把那本书写得更好。可惜有时光写书的人是本人,所以自己也只可以希望自己不用做得太差。

写这本书的时候,我希望能把部分专家经验直接与您大饱眼福,所以我十分感激这个花时间为本书添砖加瓦的人。Kent 贝克(Beck)、约翰 Brant、威尔iam Opdyke和Don 罗伯特(Robert)(Bert)(Robert)s编撰或合写了本书部分章节。另外Rich Garzaniti和Ron Jeffries帮我添加了部分得力的文中讲明。

在任何一本此类技术书里,作者都会告知您,技术审阅者提供了高大的佑助。一如既往,艾迪生(Addison)(Addison)-卫斯理出版社的卡特(Carter) Shanklin和她的团伙社团了强有力的审稿人队伍容貌,他们是:

q Ken Auer,Rolemodel软件公司

q Joshua Bloch,Sun公司Java软件部

q John Brant,UIUC

q 司各脱(Scott)(Scott) Corley,High Voltage软件商店

q Ward Cunningham,Cunningham&Cunningham公司

q Stéphane Ducasse

q Eric(Eric)h Gamma,对象技术国际公司

机械制造,q Ron Jeffries

q Ralph 约翰逊,南达科他高校

q Joshua Kerievsky,Industrial Logic公司

q Doug Lea,伦敦州立大学Oswego分校

q Sander Tichelaar

他们大大提高了本书的可读性和准确性,并且至少去掉了部分其余手稿都可能会藏有的谬误。在此我要特别感谢六个效果显著的提议,它们让我的书看上去眼前一亮:沃德和Ron提议我以重构前后效果并列对照的办法写第1章,约书亚 Kerievsky提议我在重构列表中画出代码草图。

除却正规审阅小组,还有许多业余的审阅者。那些人或看过自家的手稿,或关注自我的网页并预留对自身很有帮扶的见解。他们是Leif Bennett(Bennett),Michael(Michael) Feathers,Michael(Michael) 芬恩ey,尼尔 Galarneau,Hisham Ghazouli,托尼 Gould,约翰(John) Isner,Brian Marick,Ralf Reissing,约翰(John) Salt,马克(Mark) Swanson,Dave Thomas和Don 韦尔斯(Wells)。我相信一定还有局部被我遗忘的人,请容我在此向你们赔不是,并致上自家的谢忱。

有一个专程好玩的审阅小组,就是“恶名昭彰”的UIUC读书小组。本书反映出他们的许多研商成果,我要特别感谢他们用录音记录的看法。这么些小组成员包括Fred(Fred)rico“弗瑞德(Fred)(Fred)”Balaguer,约翰(John) 布兰特,伊恩(Ian) Chai,Brian Foote,Alejandra Garrido,Zhijiang“John”Han,彼得 Hatch,Ralph 约翰逊(Johnson),Songyu“Raymond”Lu,Dragos-Anton Manolescu,Hiroaki Nakamura,詹姆士 Overturf,Don 罗Bert(Robert)s,Chieko Shirai,Les Tyrell和Joe Yoder。

任何好想法都需要在严俊的生产条件中收受稽查。我看齐重构对于雷克萨斯综合薪资系统(Chrysler Comprehensive Compensation,C3)发挥了赫赫的机能。我要感谢那些团队的有所成员:Ann 安德森,Ed Anderi,Ralph(Ralph) Beattie,Kent 贝克,大卫 布赖恩t,鲍勃 Coe,Marie DeArment,玛格丽塔(Rita)(Margaret) Fronczak,Rich Garzaniti,Dennis Gore,Brian Hacker,Chet Hendrickson,Ron Jeffries,Doug Joppie,戴维 Kim,保罗 Kowalsky,黛比(Debbie) Mueller,Tom Murasky,理查德(Richard) Nutter,艾德里安(Adrian) Pantea,Matt Saigeon,Don Thomas(Thomas)和Don 韦尔斯。和他们一块工作所拿到的从来数据,巩固了自家对重构原理和机能的认识。他们采取重构技术所取得的升华极大程度地帮手自己见到:重构技术使用于历时多年的大型项目中,可以起到何等的效果!

再提一句,我获取了阿狄森(Addison)-韦斯利出版社的J.Carter Shanklin及其社团的帮助,包括Krysia Bebick、Susan Cestone、Chuck 杜德(Dutt)on、Kristin 埃里克(Eric)kson、约翰(John) Fuller、Christopher(Christopher) Guzikowski、西蒙e Payment和Genevieve Rajewski。与优异出版商合作是一个令人欢喜的阅历,他们为自我提供了大量的支撑和拉扯。

谈到帮忙,为一本书付出最多的,总是距离作者近期的人。这就是明天已改成自我太太的辛迪(Cindy)。感谢她,当我埋首工作的时候,如故一如既往爱自己。固然在自己投入写书时,也总会不停回顾他。

 

Martin Fowler

于维吉妮亚州Melrose市

fowler @acm.org

http://www.martinfowler.com

http://www.refactoring.com

熊节  译

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注