大话重构连载10:小设计而不是大布局

开车的朋友一定深有体会,驾驶汽车其实就是在不断矫正汽车行驶方向的一个过程。在整个驾驶过程中,你必须全神贯注地紧盯前方,通过方向盘不断矫正方向,否则即使行驶在直线路段也可能偏离车道。那些疲劳驾驶的司机,因为进入睡眠状态,无法再矫正方向,车辆就会越来越偏离航向。这种情况下,即使数秒钟的小盹,也能造成车毁人亡的严重后果。

重构与驾车虽然属于完全不同的领域,但其道理是相同的。我们在运用重构方法修改代码的过程中也是经常会犯错的(是人就会犯错)。犯错就如同偏离了航向一样,因此我们需要不断去矫正。既然是矫正,就必须有一个正确的标准,以及判断是否正确的方法。驾车过程中正确的标准是车辆是否正确行驶在自己的车道上,判断是否正确的方法则是司机朋友的目测。同样地,重构过程中正确的标准是我们的软件是否保持重构前的外部行为,判断的方法则是测试,不论是手工测试还是自动化测试。

说起来这个道理很简单,但问题是你不可能随时都在测试,随时都在矫正,这是不可能的。因此,我们必须要有一个周期,即间隔多长时间测试并矫正一次。周期越长,出大问题的几率就越大,就如同那个睡着了的司机;周期越短,我们所需要付出的成本就越高,因为每进行一次测试都是需要我们付出成本的。周期的长短是需要我们去不断权衡的。

然而,与驾车不同,重构的测试周期还要取决于完成一次重构并提交代码的周期。因为软件重构总是这样一个过程,首先修改一部分代码,使程序处于一个错误而无法编译运行的状态,然后完全其它所有相关代码的修改,使程序恢复编译可运行的状态。在这个中间状态中,我们是无法测试的,或者说测试是无意义的。只有当相关代码都修改完成,程序恢复到可运行状态时,测试才变得有意义。每完成这样一个过程,我们称之为“完成一次重构”。而完成一次重构所花费的时间,是决定我们测试周期的关键因素。

既然如此,我们完成一次重构到底要花费多少时间呢?这听起来像是在进行数学推导,但其中的道理就是这样。决定一次重构花费的时间,是由我们的设计决定的。小设计,我们对代码的修改量少,我们完成重构的时间就短;大设计,我们对代码的修改量大,我们完成重构的时间必然长。完成重构时间长,测试的周期就长,我们发现错误的时间就晚,可能给我们造成的损失必然就大。

大布局为什么我们伤不起?漫长的业务整理,漫长的设计与开发,持续数月之久。在这数月中我们一直都无法评估自己是否正确。当我们辛苦数月之后才被告知我们犯错了,一切都为时已晚,项目不得不滑入了失败的深渊。这就是前面那个故事系统改造失败的根本原因。

我们说,大布局不可以,但大设计同样不可能。我开始要重构了,我们思考了很多问题,运用了很多重构手法,来完成一次重构。这样的重构,代码修改量必然多,重构周期必然长,出错的风险就大。因此,我们的重构应当是一个一个的小设计。运用一个重构手法,解决一个问题,完成一次重构,测试通过,再运用一个重构手法,解决另一个问题,完成另一次重构……如此往复,这就是我在前面所说的“小步快跑”的开发模式。

但是一个我必须要澄清的概念就是,判断是否是大设计的衡量标准并不是代码行数。举一个简单例子,我们将一段上千行的代码从一个函数,原封不动地挪到另一个函数中,而这段代码本身改动很小,这属不属于大设计呢?显然不属于,因为我们真正修改的代码量不多。后面我们将看到,重构过程会经常进行这种代码的搬移。

小步快跑让我们每次重构的时候只关注一个问题,运用一个重构手法去解决这一个问题。这样就使我们每次在修改问题时不会想得太多太远。但是,小步快跑并不是要我们完全没有远期规划,不是这样的。你可以有远期规划,但这种规划不要做得太早,过早做出这些规划往往容易顾此失彼。先工作一段时间,做一些基础的工作,让我们对系统的整体有了一个比较全面地认识,然后再规划,这样将得到更好的效果。

同时,它要求我们对远期的规划不要过细。越近期的计划越细,越远期的规划越粗。一些人之所以急急匆匆地去做细致的远期规划,是因为担心今天做出来的东西,到了今后发现不对,得改,所以今天多想想,多规划一些。但问题是,今天规划的就正确吗?如果是当然很好,而现实常常是否。不正确的规划却常常适得其反,让我们陷入一种困境,一种既不能解决当前问题,又不得不为错误设计埋单的困境之中。因此重构的思想却完全打破了这种思维习惯。重构不惧怕修改,因为它让明天的代码修改是安全的,而不再是走钢丝。它认为,今天的任务就是改今天的,即使到了明天会被认为是错误的,也是明天再改去。

大话重构连载首页:http://blog.csdn.net/mooodo/article/details/32083021

特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢!

大话重构连载10:小设计而不是大布局

时间: 2024-11-05 14:58:16

大话重构连载10:小设计而不是大布局的相关文章

大话重构连载首页

<大话重构>这本书是我写的第一本书,从今天起我将通过连载的形式逐渐跟大家分享. 这本书让你: 告别游击队转变为正规军. 远离劣质代码走向精妙设计 真正明确专业级的软件开发是如何的 真正明确重构是如何一步一步进行的 高效重构七步曲.面对实践不卡壳 让遗留系统维护不再是你的梦魇 读完这本书以后: 需求变更不再纠结.重构让你润物细无声地容纳它们 超越代码级的重构,从各个层面深度领略重构之美 自己主动化測试不再是梦想.重构让自己主动化測试走你 又一次审视熟悉而陌生的技术.将碎了一地的它们又一次铆合在一

大话重构连载4:大布局与小步快跑

以往我们在重新设计一个系统时,总是喜欢大布局.全面地整理系统需求,全面地分析系统功能,再全面地设计系统.开发.测试.这样一个过程往往会持续数月,花费大量的工作量.但是,不到最后设计出来,谁都不知道会不会存在问题.这就是“大布局”的弊病. 正因为如此,软件大师在讲述系统重构时总是强调,系统重构应当避免大设计,而应当尽量采用一个一个连续不断的小设计.这就是我们所说的“小步快跑”的设计模式. 小步快跑体现出了敏捷软件开发的特点——简单与快速反馈.不要想得太多了,活在今天的格子里,因为你永远不可能预知今

大话重构连载16:超级大函数

事情总是这样的:当我们对一个遗留系统一忍再忍,再忍,忍,还要忍--终于积攒到某一天,实在忍无可忍了,拍案而起,不能再忍了,重构!!!事情就这样发生了.然而,在这时你突然发现,重构的工作千头万绪,真不知从何开始.堆积如山的问题此起彼伏,期望修改的设计思绪万千.这里有个想法,那里有个思路,什么都想做,却什么都做不了,真是脑子里一团乱麻.这时候,没有一个合理的步骤,清晰的计划,瞎干蛮干是十分危险的,它会为你的重构带来不可预期的未来.无数次的经验告诉我,不论是什么系统,采用什么架构,从分解大函数开始,肯

大话重构连载1:遗留系统——软件工业时代的痛

我常常感到幸运,我们现在所处的是一个令人振奋的时代,我们进入了软件工业时代.在这个时代里,我们进行软件开发已经不再是一个一个的小作坊,我们在进行着集团化的大规模开发.我们开发的软件不再是为某个车间.某个工序设计的辅助工具,它从某个单位走向整个集团,走向整个行业,甚至整个社会,发挥着越来越重要的作用.一套软件所起到的作用与影响有多大,已经远远超越了所有人的想象,成为一个地区.一个社会,乃至整个国家不可或缺的组成部分.慢慢地,人们已经难以想象没有某某软件或系统的生活和工作会是怎样的.这就是软件工业时

大话重构连载:遗留系统——软件工业时代的痛

我经常感到幸运,我们如今所处的是一个令人振奋的时代,我们进入了软件工业时代.在这个时代里,我们进行软件开发已经不再是一个一个的小作坊,我们在进行着集团化的大规模开发.我们开发的软件不再是为某个车间.某个工序设计的辅助工具.它从某个单位走向整个集团,走向整个行业,甚至整个社会,发挥着越来越关键的数据.一套软件所起到的作用与影响有多大.已经远远超越了全部人的想象.成为一个地区.一个社会.乃至整个国家不可或缺的组成部分. 慢慢地,人们已经难以想象没有某某软件或系统的生活和工作会是如何的.这就是软件工业

大话重构连载18:最常见的问题

使用抽取方法,虽然道理十分简单,但实际操作起来却并不是那么容易的.完成抽取方法最大的困难,就是如何处理抽取函数与原函数的数据交换.如同将一颗大树从土壤里拔出来,盘根错节的根茎,那是剪不断理还乱.当代码还没有被抽取出来之前,它们与其它程序都是在一个函数的内部,因此各个代码段可以毫无顾忌地相互交互数据.但当我们将代码从原函数中抽取出来时,抽取出来的代码与原函数中的代码就形成了一道墙,要交换的数据只能通过参数与返回值进行交互,这将给我们带来诸多麻烦. 将代码从原函数中抽取出来,放进新的函数中,首先就会

大话重构连载14:我们是这样自动化测试的

说了那么多,让我们用示例看看,系统重构是应该怎样做自动化测试的.还是回到前面那个HelloWorld的例子(详见 3.3 小步快跑是这样玩的),该类中有一个sayHello()方法,只要我们输入当前的时间与用户名,就返回对该用户的问候语.如果当前时间是上午,则返回"Hi, XXX. Good morning!":如果是下午,则返回"Hi, XXX. Good afternoon!":如果是晚上,则返回"Hi, XXX.Good Night!",这

大话重构连载5:软件修改的四种动机

软件,自从被我们开发出来并交付使用以后,如果它运行得好好的,我们是不会去修改它的.我们要修改软件,万变不离其宗,无非就是四种动机: 1. 增加新功能: 2. 原有功能有BUG: 3. 改善原有程序的结构: 4. 优化原有系统的性能[1]. 第一种和第二种动机,都是源于客户的功能需求,而第四种是源于客户的非功能需求. 软件的外部质量,其衡量的标准就是客户对软件功能需求与非功能需求的满意度.它涉及到一个企业.一个软件的信誉度与生命力,因此为所有软件企业所高度重视.但是,就在所有企业高管把软件外部质量

大话重构连载11:小步快跑是这样玩的

说了那么多.相信你对小步快跑的概念有了一个初步的印象,但理解还不是非常深.让我们来看一看一个实际工作中的样例,来亲身感受一下什么是大布局,什么是大设计.什么是小设计. 还是回到前面那个HelloWorld的样例,起初的需求总是简单而清晰的. 当用户登录一个站点时,站点往往须要给用户打一个招呼:"hi, XXX! ".同一时候,假设此时是上午则显示"Good morning! ",假设是下午则显示"Good afternoon! ",除此显示&qu