评注者序

重构:改革既有代码的计划性(评注版)
评注者序


 

评注者序

近十年来,若要商讨哪些改进代码的质料,很难绕过马丁 Fowler的这本经典作品。这本书已经影响了几代程序员,或许会不停不断地震慑未来的一批程序员。遗憾的是,在具体中我们依旧看到了重构的步履维艰。一方面是因为程序员的重构技巧还有待磨砺,另一方面则是因为项目的压力,使得大家反复将重构视为鸡肋。

重构是可有可无的呢?Practices of an Agile Developer的作者Andy Hunt认为“要投入时间和生机保持代码的整洁、敞亮。在类型中,代码应该是领略的,不应当有黑暗死角。”相信维护过遗留代码的程序员,在直面纠缠不清、复杂混乱的代码时,对于此言必有“心有戚戚焉”之感。重构是理东晋码垃圾的有效手段,它推向营造明晰的程序结构、一致的代码风格、有效的职责重用,可以适当地在简约与复杂之间寻找到代码之美,合理地权衡代码质地与支出功能,从而提升至优雅编码的境地。

怎么表现重构之美?关键在于发现丑陋而不堪忍受。对丑的憎恶实则是一种强悍的驱引力,它会促使你使用重构,直到重构变成如呼吸一般自可是不可缺失。重构无须专门的等级,随时随地皆可举行。日常的重构可以保证代码常拭常新,如利刃一般锋利。这种为了单纯地追求开发速度,而置代码质地于不顾的做法,实则是杀鸡取卵,能够预期的结果就是系统的“破窗户”渐渐蔓延,最后落得不行收拾的下台。重构并非不可实践,关键还在于大家对于重构的姿态和应用重构的习惯。必须在思想上认可重构的显要;然后在技术上频频提拔重构技能,并辅以对重构工具的施用,就能最大程度地加大重构在软件开发中积极的一方面。

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

本书的多数点评内容,并非片言只语,很多内容都是友善重构心得以及重构技巧的采纳。我读书参考了大量的书籍,例如《程序员修炼之道》、《重构与形式》、《领域驱动设计》、《反形式》、《软件架构的艺术》、《修改代码的不二法门》、《代码整洁之道》等十余部有关书籍。毕竟站在软件世界的角度来看,马丁 Fowler写作本书的时代已经非凡“古老”了。在那事后,发生了诸多地道的计划技术、重构理念与格局。譬如在与重构相关的始末中,本书没有论述的就包括:架构重构、界面重构、数据库重构、重构格局等情节。在点评过程中,我期望能以开放的不二法门讲述自己阅读本书的感触,讲述自己重构的体验,并在力量范围以内提交自己的有的看法与意见。

本人作为一名程序员,看到了太多漠视或者无视垃圾代码的同行们,这其中也席卷曾经的自家。但当自己陷入遗留代码的惨痛时,对于这样的现状就变得痛心疾首了。近来,软件业界对此软件工艺以及高效方法的实践,在必然水平上更上一层楼了人人的理念,但在实际上施行中依然辛勤。最大的起因就在于我们将程序员定位为“代码工人”,认为编码工作是低端程序员的权责。我们妄图创设如机械创设行业一般的“软件工厂”,却忽略了软件编程实则还有艺术的单方面。我始终认为,代码如故是架设的一部分,代码质地控制了架构质地,而重构则是延缓系统萎缩的生命源泉。正所谓“千里之行始于足下”,就让重构之行,始于本书吧。


 

 

机械制造,“重构”这么些定义来源于Smalltalk圈子,没多长时间就进来了此外语言阵营之中。由于重构是框架开发中不可缺失的一片段,所以当框架开发职员琢磨自己的做事时,这些术语就诞生了。当他俩好好自己的类继承序列时,当他们叫喊自己可以拿掉多少有些行代码时,重构的概念逐步浮出水面。框架设计者知道,这东西无法一最先就完全正确,它将趁着设计者的阅历成长而上扬;他们也知道,代码被阅读和被改动的次数远远多于它被编辑的次数。保持代码易读、易修改的重大,就是重构——对框架而言如此,对一般软件也如此。

好极了,还有哪些问题啊?问题很显著:重构具有风险。它必须修改运作中的程序,这可能引入一些不错察觉的不当。倘诺重构模式不对路,可能毁掉你数天甚至数星期的结晶。假如重构时不搞好准备,不服从规则,风险就更大。你打通自己的代码,很快发现了一些值得修改的地点,于是你挖得更深。挖得越深,找到的重构机会就越多,于是你的修改也越多……最终你给自己挖了个大坑,却爬不出来了。为了制止自掘坟墓,重构必须系统化举办。我在《设计形式》书中和其它三位作者曾经提过:设计形式为重构提供了对象。不过“确定目的”只是问题的一有些而已,改造程序以达到目标是另一个难题。

马丁 福勒(Fowler)和本书另几位作者清楚揭穿了重构过程,他们为面向对象软件开发所做的孝敬难以衡量。本书解释了重构的规律和极品实践,并提出什么日期何地你应有最先挖掘你的代码以求改进。本书的核心是一文山会海完整的重构方法,其中每一项都介绍一种经过实践检验的代码变换手法的意念和技术。某些类型如Extract Method和Move 菲尔德(Field)(Field)看起来也许很浅显,但毫无掉以轻心,因为了然这类技术正是有条不紊地举行重构的重中之重。本书所提的这个重构手法将帮扶您一次一小步地修改你的代码,这就收缩了经过中的风险。很快你就会把这多少个重构手法和其名目参加自己的开支词典中,并且朗朗上口。

自己先是次体会有讲究的、两回一小步的重构,是某次与Kent Beck在30 000英尺高空的飞行中途中结对编程。大家接纳本书收录的重构手法,保证每便只走一步。末了,我对这种实践方法的职能感到相当奇怪。我非但对最终结果更有信心,而且付出压力也小了无数。所以,我极力推荐你尝试这些重构手法,你和您的主次都将据此更美好。

 

Erich Gamma

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

熊节  译

前  言

过去,有位咨询顾问造访客户调研其付出品种。系统主题是个类继承体系,顾问看了开发人士所写的一对代码。他发现任何连串卓殊凌乱,上层超类对于系统的运转做了部分假使,下层子类实现那一个虽然。不过这多少个假使并不相符所有子类,导致覆写(override)工作异常困苦。只要在超类做点修改,就足以减去过多覆写工作。在另一部分地点,超类的少数意图并未被突出了然,因而其中一些行为在子类内重新出现。还有局部地点,好多少个子类做一样的事情,其实可以把它们搬到连续系列的上层去做。

这位顾问于是提议项目经理看看这么些代码,把它们整理一下,可是经营并不热爱于此,毕竟程序看上去还足以运作,而且档次面临很大的速度压力。于是主管说,晚些时候再抽时间做那一个整理工作。

顾问也把她的想法告诉了在这几个延续序列上工作的程序员,告诉他们恐怕发生的事务。程序员都很灵敏,立刻就看看问题的重要。他们精通这并不全是他们的错,有时候的确需要借助外力才能窥见问题。程序员顿时用了一两天的时辰整理好这几个连续体系,并删掉了内部一半代码,功效毫发无损。他们对此极度满足,而且发现在持续系列中参加新的类或利用系统中的其他类都更快、更易于了。

项目主任并不愉快。进度排得很紧,有诸多办事要做。系统必须在多少个月未来宣布,而这多少个程序员却白白消耗了两天时间,干的劳作与要付出的大多数功用毫无关系。原先的代码运行起来还算正常,他们的新规划看来有些过于追求面面俱到。项目要交付给客户的,是足以有效运转的代码,不是用来取悦学究的宏观东西。顾问接下去又提出应该在系统的其他主题部分开展如此的盘整工作,这会使一切项目暂停一至六个礼拜。所有那一个工作只是为着让代码看起来更尽善尽美,并不可能给系统添加此外新职能。

您对那多少个故事有咋样感想?你以为这么些顾问的提议(更进一步整理程序)是对的吧?你会按部就班这句古老的工程谚语吗:“即使它还是可以运作,就无须动它。”

我不可能不认同自己有少数偏见,因为自身就是老大顾问。多个月之后这些项目揭露失利,很大的缘由是代码太复杂,无法调试,也无力回天取得可被接受的性质。

后来,项目再一次开动,几乎从头起先编写整个序列,Kent Beck受邀做了参谋。他做了几件迥异以往的事,其中最重大的一件就是坚持不渝以持续不断的重构行为来收拾代码。这么些项目的功成名就,以及重构在这个成功项目中扮演的角色,启发了本人写这本书,如此一来我就可知把Kent和其余部分人曾经学会的“以重构形式改进软件质地”的文化,传播给持有读者。

哪些是重构

所谓重构(refactoring)是这般一个历程:在不更改代码外在表现的前提下,对代码做出修改,以精益求精程序的内部结构。重构是一种经千锤百炼形成的井然有序的次序整理方法,可以最大限度地减小整治过程中引入错误的票房价值。本质上说,重构就是在代码写好以后革新它的规划。

“在代码写好未来立异它的筹划”这种说法有些奇怪。遵照近来对软件开发的明亮,大家信任应该先规划而后编码:首先得有一个两全其美的宏图,然后才能起首编码。不过,随着时光流逝,人们不断修改代码,于是遵照原先设计所得的系统,全部结构逐渐缩小。代码质量逐步沉沦,编码工作从严苛的工程腐败为胡砍乱劈的随性行为。

“重构”正好与此相反。哪怕你手上有一个不佳的计划性,甚至是一堆混乱的代码,你也得以借由重构将它加工成设计优秀的代码。重构的各种步骤都很简单,甚至显得有点过度简单:你只需要把某部字段从一个类移到另一个类,把一些代码从一个函数拉出去构成另一个函数,或是在连续系列中把一些代码推上推下就行了。不过,聚沙成塔,那么些微小修改累积起来就可以根本改正计划质料。这和一般常见的“软件会逐步腐烂”的见识相反。

经过重构,你可以找出改变的平衡点。你会发现所谓计划不再是成套动作的前提,而是在全方位开发进程中逐步透露出来。在系统构筑过程中,你可以学学如何强化计划,其间带来的互动可以让一个顺序在付出过程中连连拥有卓越的宏图。

本书有怎么样

本书是一本为规范程序员而写的重构指南。我的目的是报告您什么样以一种可决定且高功能的法子展开重构。你将学会怎么有条不紊地改进程序结构,而且不会引入错误,这就是天经地义的重构格局。

遵照传统,图书应该以引言起先。即便自己也允许这一个规格,可是我意识以概括性的议论或概念来介绍重构,实在不是一件容易的事。所以自己控制用一个实例做为开路先锋。第1章呈现了一个小程序,其中有些常见的设计缺陷,我把它重构为更合格的面向对象程序。其间我们得以见见重构的长河,以及多少个很有用的重构手法。假使您想了解重构到底是怎么回事儿,这一章必须读。

第2章商量重构的通常原则、定义,以及举办重构的案由,我也大致介绍了重构所存在的部分题材。第3章由Kent 贝克介绍如何嗅出代码中的“坏味道”,以及哪些采纳重构清除这一个坏味道。测试在重构中扮演着相当重要的角色,第4章介绍怎么着利用一个简短而且开源的Java测试框架,在代码中建筑测试环境。

本书的着力部分——重构列表——从第5章延伸至第12章。它无法说是一份全面的列表,只是一个起首,其中包括迄今截至我在工作中整理下来的具有重构手法。每当自己想做点什么——例如Replace Conditional with Polymorphism (245)的时候,那份列表就会指示自己哪些一步一步安全发展。我盼望这是值得你未来屡次回顾的有些。

本书介绍了其旁人的许多探讨成果,最终几章就是由他们中间的几位客串所写的。比尔 Opdyke在第13章记述她将重构技术利用于买卖开发进程中遭遇的片段问题。Don Robert(Bert)(Robert)s和约翰 布兰特(Brant)在第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章。

站在前人的双肩上

就在本书一先导的眼前,我无法不说:这本书让自己欠了一大笔人情债,欠那多少个在过去十年中做了大量研讨工作并创造重构领域的人一大笔债。这本书原本应该由她们之中的某部人来写,但说到底却是由自己这么些有时间有活力的人捡了便民。

重构技术的两位最早倡导者是沃德 Cunningham和Kent Beck。他们很已经把重构作为支出进程的一个着力成分,并且在投机的付出进程中应用它。尤其需要验证的是,正因为和Kent的搭档,才让我的确看到了重构的要紧,并直接激发了自己写出这本书。

拉尔夫(Ralph)(Ralph) Johnson在UIUC(特拉华大学厄巴纳—尚Penn分校)领导了一个小组,这个小组因其在对象技术方面的实际上贡献而声名远扬。Ralph(Ralph)很早就是重构技术的拥护者,他的一对学童也一直在探究那么些课题。比尔(Bill) Opdyke的大学生杂谈是重构研商的首先份详细的封皮成果。约翰(John) 布兰特和Don 罗Bert(Robert)s则早已不满足于写著作了,他们写了一个工具叫Refactoring Browser(重构浏览器),对Smalltalk程序实施重构工程。

致谢

虽然有这么些啄磨成果可以借鉴,我或者需要过多匡助才能写出这本书。首先,并且也是最重大的,Kent Beck给了自己伟大的扶持。Kent在瓦尔帕莱索的某个酒吧和我谈起他正在为Smalltalk Report撰写一篇小说[Beck,hanoi],从此播下本书的率先颗种子。那次谈话不仅仅让我起来注目到重构技术,而且自己还从中“偷”了广大设法放到本书第1章。Kent也在其他许多下面协助自己,想出“代码味道”这些定义的是他,当我遇见各个困难时,鼓励自己的人也是她,通常和自家一块干活助我成功这本书的,如故她。我平常忍不住这么想:他全然能够自己把这本书写得更好。可惜有时光写书的人是自家,所以我也只好希望团结不要做得太差。

写这本书的时候,我梦想能把部分专家经验直接与您分享,所以我很是感激这一个花时间为本书添砖加瓦的人。Kent 贝克、约翰 布兰特、威尔iam Opdyke和Don 罗Bert(Robert)s编撰或合写了本书部分章节。另外Rich Garzaniti和Ron Jeffries帮我添加了部分卓有功用的文中表明。

在其他一本此类技术书里,作者都会告诉您,技术审阅者提供了高大的声援。一如既往,Addison(Addison)-韦斯利(Wesley)出版社的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)h Gamma,对象技术国际公司

q Ron Jeffries

q Ralph 约翰逊(Johnson),印第安纳高校

q Joshua Kerievsky,Industrial Logic公司

q Doug Lea,纽约州立大学Oswego分校

q Sander Tichelaar

他们大大进步了本书的可读性和准确性,并且至少去掉了有些别样手稿都可能会藏有的谬误。在此我要特别感谢五个效果显明的提议,它们让自己的书看上去眼睛一亮:沃德(Ward)和Ron提出我以重构前后效果并列对照的办法写第1章,乔舒亚(Joshua) Kerievsky指出我在重构列表中画出代码草图。

除却正规审阅小组,还有为数不少非正式的审阅者。这个人或看过自己的手稿,或关注自我的网页并留住对自身很有襄助的眼光。他们是Leif Bennett,迈克尔(Michael) Feathers,Michael 芬恩ey,Neil Galarneau,Hisham Ghazouli,托尼(Tony) Gould,John Isner,Brian Marick,Ralf Reissing,约翰 Salt,马克(Mark) Swanson,戴夫(Dave) 托马斯(Thomas)和Don 韦尔斯。我深信不疑一定还有一对被我记不清的人,请容我在此向你们道歉,并致上自家的谢忱。

有一个特地风趣的审阅小组,就是“恶名昭彰”的UIUC读书小组。本书反映出她们的大队人马研究成果,我要特别感谢他们用录音记录的见识。这多少个小组成员包括弗雷德(Fred)rico“弗雷德(Fred)”Balaguer,约翰 Brant,伊恩 Chai,Brian Foote,Alejandra Garrido,Zhijiang“约翰(John)”Han,彼得(Peter) Hatch,拉尔夫(Ralph)(Ralph) 约翰逊(Johnson),Songyu“Raymond”Lu,Dragos-Anton Manolescu,Hiroaki Nakamura,詹姆斯(James) Overturf,Don 罗伯特(Robert)(Bert)s,Chieko Shirai,Les Tyrell和Joe Yoder。

此外好想法都需要在严俊的生产条件中收受稽查。我看齐重构对于路虎综合薪资系统(Chrysler Comprehensive Compensation,C3)发挥了高大的功力。我要感谢这么些团队的享有成员:Ann 安德森,Ed Anderi,拉尔夫(Ralph) Beattie,Kent Beck,戴维 布赖恩(Bryan)t,鲍伯(Bob) Coe,Marie DeArment,玛格丽特 Fronczak,Rich Garzaniti,Dennis Gore,Brian Hacker,Chet Hendrickson,Ron Jeffries,Doug Joppie,大卫(David) Kim,保罗(Paul) Kowalsky,Debbie Mueller,Tom Murasky,理查德 Nutter,艾德里安(Adrian) Pantea,Matt Saigeon,Don Thomas和Don 韦尔斯(Wells)。和她俩一块工作所拿到的一直数据,巩固了本人对重构原理和机能的认识。他们采纳重构技术所取得的腾飞极大程度地帮助我见状:重构技术利用于历时多年的大型项目中,可以起到什么的效用!

再提一句,我得到了阿狄森(Addison)(Addison)-卫斯理(Wesley)出版社的J.卡特 Shanklin及其协会的协理,包括Krysia Bebick、苏珊 Cestone、Chuck 杜德(Dutt)on、Kristin Erickson、约翰(John) Fuller、克里Stowe弗(Christopher) Guzikowski、西蒙(Simon)e Payment和Genevieve Rajewski。与优质出版商合作是一个让人心潮澎湃的阅历,他们为自我提供了大量的支撑和帮衬。

谈到支撑,为一本书付出最多的,总是距离作者最近的人。这就是明日已化作我老伴的辛迪(Cindy)。感谢他,当自己埋首干活的时候,仍然一样爱自我。即使在自家投入写书时,也总会频频回顾她。

 

Martin Fowler

于堪萨斯州Melrose市

fowler @acm.org

http://www.martinfowler.com

http://www.refactoring.com

熊节  译

发表评论

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