《重构:改善既有代码的设计》—第2章2.8节重构起源何处

2.8 重构起源何处
我曾经努力想找出重构(refactoring)一词的真正起源,但最终失败了。优秀程序员肯定至少会花一些时间来清理自己的代码。这么做是因为,他们知道简洁的代码比杂乱无章的代码更容易修改,而且他们知道自己几乎无法一开始就写出简洁的代码。

重构不止如此。本书中我把重构看做整个软件开发过程的一个关键环节。最早认识重构重要性的两个人是Ward Cunningham和Kent Beck,他们早在20世纪80年代就开始使用Smalltalk,那是个特别适合重构的环境。Smalltalk是一个十分动态的环境,你可以很快写出极具功能的软件。Smalltalk的“编译/连结/执行”周期非常短,因此很容易快速修改代码。它支持面向对象,所以也能够提供强大的工具,最大限度地将修改的影响隐藏于定义良好的接口背后。Ward和Kent努力发展出一套适合这类环境的软件开发过程(如今,Kent把这种风格叫作极限编程[Beck,XP])。他们意识到:重构对于提高他们的生产力非常重要。从那时起他们就一直在工作中运用重构技术,在正式的软件项目中使用它,并不断精炼这个程序。

Ward和Kent的思想对Smalltalk社群产生了极大影响,重构概念也成为Smautalk文化中的一个重要元素。Smalltalk社群的另一位领袖是Ralph Johnson,伊利诺斯大学乌尔班纳分校教授,著名的GoF [Gang of Four]之一。Ralph最大的兴趣之一就是开发软件框架。他揭示了重构对于灵活高效框架的开发帮助。

Bill Opdyke是Ralph的博士研究生,对框架也很感兴趣。他看到了重构的潜在价值,并看到重构应用于Smalltalk之外的其他语言的可能性。他的技术背景是电话交换系统的开发。在这种系统中,大量的复杂情况与日俱增,而且非常难以修改。Bill的博士研究就是从工具构筑者的角度来看待重构。通过研究,Bill发现:在C++的框架开发项目中,重构很有用。他也研究了极有必要的“语义保持性(semantics- preserving)重构”及其证明方式,以及如何用工具实现重构。时至今日,Bill的博士论文[Opdyke]仍然是重构领域中最有价值、最丰硕的研究成果。此外他为本书撰写了第13章。

我还记得1992年OOPSLA大会上见到Bill的情景。我们坐在一间咖啡厅里,讨论当时我正为保健业务构筑的一个概念框架中的某些工作。Bill跟我谈起他的研究成果,我还记得自己当时的想法:“有趣,但并非真的那么重要。”唉,我完全错了。

John Brant和Don Roberts将重构中的“工具”构想发扬光大,开发了一个名为Refactoring Browser(重构浏览器)的Smalltalk重构工具。他们撰写了本书第14章,其中对重构工具做了更多介绍。

那么,我呢?我一直有清理代码的倾向,但从来没有想到这会如此重要。后来我和Kent一起做个项目,看到他使用重构手法,也看到重构对生产性能和产品质量带来的影响。这份体验让我相信:重构是一门非常重要的技术。但是,在重构的学习和推广过程中我遇到了挫折,因为我拿不出任何一本书给程序员看,也没有任何一位专家打算写出这样一本书。所以,在这些专家的帮助下,我写下了这本书。

优化一个薪资系统
——Rich Garzaniti

将C3系统移至GemStone之前,我们用了相当长的时间开发它。开发过程中我们无可避免地发现程序不够快,于是找了Jim Haungs(GemSmith中的一位好手),请他帮我们优化这个系统。

Jim先用一点时间让他的团队了解系统运作方式,然后以GemStone的ProfMonitor特性编写出一个性能度量工具,将它插入我们的功能测试中。这个工具可以显示系统产生的对象数量,以及这些对象的诞生点。

令我们吃惊的是:创建量最大的对象竟是字符串。其中最大的工作量则是反复产生12 000字节大小的字符串。这很特别,因为这些字符串实在太大,连GemStone惯用的垃圾回收设施都无法处理它。由于它是如此巨大,每当被创建出来,GemStone都会将它分页至磁盘上。也就是说,字符串的创建竟然用上了I/O子系统,而每次输出记录时都要产生这样的字符串三次!

我们的第一个解决办法是把一个12 000字节大小的字符串缓存起来,这能解决一大半问题。后来我们又加以修改,将它直接写入一个文件流,从而避免产生字符串。

解决了“巨大字符串”问题后,Jim的度量工具又发现了一些类似问题,只不过字符串稍微小一些:800字节、500字节,等等,我们也都对它们改用文件流,于是问题都解决了。

使用这些技术,我们稳步提高了系统性能。开发过程中原本似乎需要1 000小时以上才能完成的薪资计算,实际运作时只花40小时。一个月后,我们把时间缩短到18小时。正式投入运转时只花12小时。经过一年的运行和改善后,全部计算只需9小时。

我们的最大改进就是:将程序放在多处理器计算机上,以多线程方式运行。最初这个系统并非按照多线程思维来设计,但由于代码构造良好,所以我们只花了三天时间就让它同时运行在多个线程上。现在,薪资的计算只需2小时。

在Jim提供工具使我们得以在实际操作中度量系统性能之前,我们也猜测过问题所在。但如果只靠猜测,我们需要很长的时间才能试出真正的解法。真实的度量指出了一个完全不同的方向,并大大加快了我们的进度。
[1] 一种有名的麦芽酒。——译者注

[2] 数据库重构的经验也已经由Soctt Ambler等人总结成书,相关内容请参考《数据库重构》(http://www.douban.com/subject/1954438/)。——译者注

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-09-17 12:24:35

《重构:改善既有代码的设计》—第2章2.8节重构起源何处的相关文章

PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用_php技巧

思维导图 介绍 前几篇系列文章,我比较关注的是<PHP 杂谈<重构-改善既有代码的设计>之一 重新组织你的函数>,但是我觉得我还是没有说清楚,我自己也有很多不理解的地方,而且这篇是我的第一篇这方面的文章,有很多的纰漏,所以我会经常性的去做修改,如果大家有好的意见不妨告知一.二. 今天谈得是"接口",此接口非"Interface",而是一个统称.我们一般可以把供别人使用的函数或者url(一般是用于提供数据)叫接口.--可能还有别的意思,毕竟我现

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

思维导图 介绍    承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容.   这章主要针对数据的重构.   1.争论的声音--直接访问Field还是通过函数(Accessor)访问Field  2.修改Array为Object:当你看到一个Array很像一个数据结构,你可以使用Replace Array with Object,把Array变成一个对象.--数据结构更清晰.      专业术语   accessor:访问者,存储器--在本文翻译为&quo

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

思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类合并到其他类中) Ø Hide Delegate (隐藏委托关系) Ø Remove Middle Man ( 移除中间人) Ø Introduce Foreign Method (引入外加函数) Ø Introduce Local Extension (引入本地扩展)    介绍    承接上文P

《重构与模式(修订版)》—第1章1.5节重构与模式

1.5 重构与模式重构与模式(修订版)我观察了自己和同事们在许多项目中重构的对象和方式.在使用<重构>[F]一书中描述的许多重构方法时,我们还发现模式有助于改进设计.很多次我们都是通过重构实现模式,或者通过趋向模式进行重构,小心翼翼地避免产生过分灵活或者过度复杂的方案. 深入研究了应用"模式导向的重构"的动机之后,我发现它和"实现低层次重构"的一般动机是一样的:减少或去除重复的地方,简化复杂之处,使代码更好地表达其意图. 但是,如果只学习某个设计模式的一

PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式_php技巧

思维导图 点击下图,查看大图.  介绍    条件逻辑有可能十分复杂,因此本章提供一些重构的手法,专门用来简化它们.   全文简述(你可直接跳过下面的内容) 核心重构:Decompose Conditional--分离"转辙逻辑"(switching logic)和"操作细节"(details)分离. 多处测试有相同结果:Consolidate Conditional Expresssion 条件代码中去掉重复成分:Consolidate Duplicate 标识特

PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数_php技巧

思维导图 点击下图,可以看大图. 介绍 我把我比较喜欢的和比较关注的地方写下来和大家分享.上次我写了篇<php 跟老大的对话>.还是有很多疑问,这书帮了我不少的忙. 如果你比较繁忙,或者懒得看文字,建议你直接看截图,也会有很大的收获的.你可以通过比较截图中的代码就能知道孰优孰劣了. 代码部分我为什么用图呢?因为我经常用手机看代码,博客园的代码在手机里乱七八糟的,还是看图比较舒服. 专业术语 我们毕竟是用英文字母编码,所以用一些英语单词,更能显示出我们的专业性.以下的英文单词,你如果掌握了,与其

《重构—改善既有代码设计》——第二章重构原则——学习笔记

1:什么是重构? 重构是一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序内部结构.本质上说,重构就是[在代码写好之后改进它的设计]   2:为什么要对项目进行重构呢?重构对软件开发有什么好处,   为什么要重构呢,打个贴切的比方:我平时比较 懒散,屋子里面的东西都是随手乱放,时间长了,屋子里面就乱七八糟了.有时候到了自己也忍无可忍的时候,我就要大动干戈了,把该放哪儿的东西都整理到哪 儿,该扔掉的东西全部扔掉.一个项目也是如此,有时候可能是设计不到位:有时候可能是经过多人的修改,

《重构:改善既有代码的设计》目录—导读

内容提要 重构:改善既有代码的设计 本书清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善.书中给出了70 多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术.本书提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险. 本书适合软件开发人员.项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物. 版权声明 重构:改善既有代码的设计 Authorized translation from the

《重构:改善既有代码的设计》—第1章1.1节起点

第1章 重构,第一个案例 重构:改善既有代码的设计 我该从何说起呢?按照传统做法,一开始介绍某个东西时,首先应该大致讲讲它的历史.主要原理等等.可是每当有人在会场上介绍这些东西,总是诱发我的瞌睡虫.我的思绪开始游荡,我的眼神开始迷离,直到主讲人秀出实例,我才能够提起精神.实例之所以可以拯救我于太虚之中,因为它让我看见事情在真正进行.谈原理,很容易流于泛泛,又很难说明如何实际应用.给出一个实例,就可以帮助我把事情认识清楚. 所以我决定从一个实例说起.在此过程中我将告诉你很多重构的道理,并且让你对重

《重构:改善既有代码的设计》—第2章2.1节何谓重构

第2章 重构原则 重构:改善既有代码的设计 前面所举的例子应该已经让你对重构有了一个良好的感受.现在,我们应该回头看看重构的关键原则,以及重构时需要考虑的某些问题. 2.1 何谓重构 我总是不太喜欢下定义,因为每个人对每样东西都有自己的定义.但是既然在写书,总得选择自己满意的定义.在重构这个概念上,我的定义以Ralph Johnson团队和其他相关研究成果为基础. 首先要说明的是:视上下文不同,"重构"这个词有两种不同的定义.你可能会觉得这挺烦人的(我就是这么想的),不过处理自然语言本