大话重构连载2:什么是系统重构

当我们开始系统重构的时候,不是着手去修改代码,而是首先建立测试机制。不论什么程序,只要是被我们修改了,理论上就可能引入BUG,因此我们就必须要进行测试。既然是测试就必须要有一个正确与否的评判标准。以往的测试,其评判的标准就是是否满足业务需求。因此,测试人员往往总是拿着需求文档测试系统。

与以往的代码修改不同,重构没有引入任何新的需求,系统原来什么功能,重构以后还是这些功能。因此,重构的测试标准就只有一个,就是与之前的功能完全保持一致,仅此而已。

然而在许多经典的重构书籍中,大师们总是建议我们首先建立自动化测试机制,这已经被我在无数次实践中证明是不现实的。要知道我们现在重构的是一个遗留系统,它往往设计混乱,接口不清晰,程序相互依赖。所有这些都使得最初的自动化测试变得非常困难而不切实际。

因此,从一开始就实现自动化测试是不切实际的,我们所能采用的还是手工测试。在重构之前首先将系统启动起来,执行相应的功能,得到各自相应的输出。然后开始重构,每次重构对代码的修改量不要太大,花费的时间不要太长。因为,修改量太大,花费时间太长,一旦测试不通过,很难定位错误的原因。在这种情况下,我们只能还原代码,将此次修改的工作完全作废。如果此次修改已经花费了你数天甚至数月的时间,这样的损失就实在太大了。

每做一次重构,修改一点儿代码,然后提交,对系统进行一次测试。如果系统依然保持与以往一样的功能,重构成功,继续进行下一次重构。如果不是,你不得不还原回来重新重构。频繁地测试着实让你挺烦的,但却有效减少了重构失败带给你的损失。一个折中的办法就是,平时频繁测试的时候,测试项目少一些,只测试主要项目,定期再进行全面地测试。录制QTP[1]脚本也是一个不错的方式,它虽然有诸多问题,但却可以在系统重构初期有效地建立自动化测试,系统级别的自动化测试。随着系统重构的不断深入,我们的程序开始在改善,耦合变得越来越松散,程序变得越来越内聚,接口变得越来越清晰。这时候,当自动化测试条件成熟时,我们才可以逐渐开始自动化测试,而这种自动化测试才是建立在代码级别的真正的自动化测试。

一旦某个修改测试不通过,则还原回来。这种一次一小步的修改模式,我们形象地称之为“小步快跑”。在测试集成工具的不断监督下一点一点地修改程序,是系统重构异于以往的另外一个特点。通过小步快跑可以使我们在重构的过程中,以最快的速度发现修改的问题,将因修改错误带来的损失减到最小,毕竟是人都不可能避免犯错。


[1] QTP,Quicktest Professional的简称,是一种自动测试工具。使用QTP的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本。

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

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

大话重构连载2:什么是系统重构,布布扣,bubuko.com

时间: 2024-10-10 20:10:47

大话重构连载2:什么是系统重构的相关文章

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

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

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

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

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

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

大话重构连载8:盘点我们的重构工具箱

下面我们来盘点一下系统重构工具箱里都有什么,也就是看一看系统重构到底都有哪些方法.系统重构总是在不同层次上调整我们的代码,因此重构方法也就分为了多个层次.从总体上看,重构方法分为以下几个层次:方法的重构.对象的重构.对象间的重构.继承体系间的重构.组织数据的重构与体系架构的重构. 前面那个例子我们可以清楚地看到方法的重构过程.方法的重构往往发生在一个对象的内部,是对一个对象内部的优化.从这个例子中,我们首先看到了增加注释.调整顺序.重命名变量.进行分段等操作,这些虽然不是什么重构方法,却是我们进

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

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

大话重构连载12:你不能没有保险索

通过前面的描述你已经对重构中"小步快跑"的开发模式有了一个清楚的认识.学会和习惯小步快跑的开发模式,对于重构工作极其重要,因为它让这种大范围.大幅度修改代码的重构工作变得不再像以往那样让人胆战心惊.究其原因,虽然从结果上是在大范围.大幅度调整,但每一步却是小范围.小福度调整,并且能保证每一步都是正确的. 然而,这里有一个非常重要的假设条件,那就是"保证每一步都是正确的",这是怎么保证的呢?就这个问题,我们需要展开来认真讨论讨论. 毫无疑问,系统重构就其结果来看,是在

大话重构连载7:重构是一系列的等量变换

系统重构要求我们对代码的每一步修改,都不能改变软件的外部行为,因此在系统重构中的所有方法,都是一种代码的等量变换.重构的过程,就好像在做数学题,一步一步地进行算式的等量变换.经过一系列等量变换,最终的结果虽然在形式上与原式不一样,但通过计算可以得到与原式完全相同的结果. 这种等量变换对于重构来说非常重要,它使得我们进行重构以后,程序还是那些程序,代码还是那些代码.但是,等量变换不等于原地踏步.正如矩阵通过等量变换可以得到方程组的解,微积分可以通过等量变换计算最终的结果,重构通过等量变换,在保证代

大话重构连载首页

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

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

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