《
什么是重构,什么不是重构_》文章地址:http://www.tfxk.com/wangyesheji/jianzhanjingyan/110A192012.htm
重构的范畴应该受你需要实行的代码变更或代码修改来决议——为了让代码变更更安全和更简练,你应该做些什么?换句话说:不要为了重构而重构。不要对那些你不打算进行变更或不会变更的代码进行重构。
不要惦念着复查或测试这些改动。这是为了让你的重构疾速的推动——这能让这些代码以及它们的运行原理在你的大脑里产生一个快捷但不齐备的原型。从中学习,然后丢掉它们。简略重构还能让你尝试各种不同的重构道路,学到更多的重构技能。Michael Feathers倡议说,在这个过程中要留心那些看起来没什么用途、或者特别有用的东西,这样当你完成此训练后、要真正修改它们时,能力把事情做正确——修改时一点一点来,讲求方法,边修改边测试。
重构很简略。尽可能在写代码前先写测试可能避免你犯过错。小范围的、独破的、稳当的对代码进行构造上的调整,每次调剂完后都要进行测试,确保你不转变代码的行动特点——功效跟以前一样,只是代码上看着不同。重构模式和古代化的IDE里的重构工具使重构变得轻易、保险和代价低廉。
Michael Feather的《Working Effectively with Legacy Code》这本书里提到了简单重构(Scratch Refactoring)的概念;Martin Fowler称之为“为理解而重构”。这是用来凑合那些你不理解的(或不能忍耐的)代码,清算它们,这样在你盘算真正着手修正它前,你能对它们是干什么的有了更好的理解,同样也对你debug这些代码有赞助。一旦你能明白了一个变量或方式的真正用意,重命名它们,给它们一个更适合的名称,删除那些你不喜欢看的(或感到没有用的)代码,拆解庞杂的前提语句,把长程序分解成数个容易懂得的小程序。
--> 有时候,会有程序员跑到我这里说他们不喜欢某个货色的设计,“咱们需要给它来个全面的重构”,来纠正里面的毛病。哦,哦。这听起来可不是个好主张。而且这听起来也不是重构…
你不是为了重构而重构,你重构是因为你想做其它的事情,而重构能辅助你实现这些事件。
对代码进行简单的但又显著的重构:打消重复,修改变量和方法名称使其更有意义,提炼方法使代码更易懂、更易复用,简化条件逻辑,把无意思的数字换成命名的变量,把类似的代码集中到一起。通过这些重构,在代码的可理解性和可维护性上,你能得到宏大的回报。
而且在开发新代码的同时你还要维护旧代码,这使得代码版本把持很麻烦,变革起来不便利,以致代码很懦弱,易出错——这正和重构所预期的目标南辕北辙。有时这样的情形会始终连续下去——这种新旧代码交替的进程永远不能完成,因为能取得最大好处的局部都是最先完成,或者因为最初带来这个主意的参谋已经干别的去了,或者是估算被消减,而且你也厌恶保护这样一个拖沓的名目。
有些人爱好把对一个系统的重新设计或重写或从新搭建平台或返工叫“大规模重构”。由于技巧上讲,这些并不改变软件功能特征——业务逻辑、软件输入和输出仍和以前一样,“只是”设计和代码实现变了。它和惯例重构的差别看起来就是:一个是重写了一段代码,一个是重写了一个体系,只有你是一步一步做下来的,你都能够称之为“重构”——不论你是终年累月被困于将一个老系统换成新代码,仍是对系统架构进行大规模的改革。
重构可以、也应该融入到你写代码或维护代码的过程中——作为日常开发/品质管理的组成部分,就像写测试和代码审查一样。重构应该被宁静的,持续的和低调的完成。它需要我们把工作精神分出一部分给它,它需要在我们的工期评估微风险评估中斟酌到它的存在。假如做的准确,你不需要去说明或向外人验证这部分工作。
这些是重构——那些不是
在这个过程中发明了bug、修改bug,这不是重构。优化不是重构。强化异样捕获、增添防备性代码不是重构。让代码更容易测试不是重构——只管重构能到达雷同的后果。这些所有的事都是有利的。但这些都不是重构。
重构(Refactoring)这个词最初由Martin Fowler 和 Kent Beck给下的定义,它是
花几分钟、一两个小时做重构,就像是你开发过程中的一种修改,是工作的一部分。如果它让你花了数天时光,或者更长,那不是重构;那是重写,或重新设计。如果你需要明白的留出一部分时间(或全部sprint周期)来重构代码,如果需要为清理代码而申请同意,或把清理代码作为一个开发需要,那你不是在重构——即便你用了重构的技术和工具,你依然做的是另外一种工作。
在这种重型的项目开发过程中混入重构的概念是错误的。它们从根本上就是另外一种工作,带有完整不同的开发本钱和风险。它混杂了人们对什么是重构、重构能干什么的意识。
什么是“大规模”重构?
重构的成果是援用了快捷方法、去除了反复代码和逝世代码,使设计和逻辑更加清晰。是在更好的、更聪慧的应用编程语言。是在上风应用你当初知道、但当时的开发程序员并不晓得——或并没有加以利用的信息。一直的简化代码,让它们更容易理解。不断的使它们在未来的变更变得更容易、更安全。
一种修改,使软件的内部结构更容易理解,在不改变软件的可见行为方法条件下使软件更容易变更…它是一种有节 制的收拾代码、使bug发生多少率最小化的方法。
“大规模重构”会变的很蹩脚。你可能需要花数周、数月(甚至数年)才干完成,需要你对软件的良多部门进行修改。软件会因而不能运行,需要分屡次宣布这些变更,需要你做常设的台架(scaffolding)和变通计划——尤其是你采取短周期的迅速开发方法时。这时Branch by Abstraction这样的实践方法就派上用处了,它能帮你在长周期内治理代码中的变更。
程序员,特殊是做维护工作的程序员,清理代码是他们的日常工作之一。这是基础工作,是必需要做的。Martin Fowler等人的奉献是使重构代码的最佳实际办法格局化,并把常见的、证实切实有效的重构模式——重构的目的和重构的步骤——进行归档分类。
相对这些较小的、行内的重构,更加重大的设计上的重构与之有显明差别——这就是Martin Fowler所指的”大型重构”。大的、代价很高的变动,附带有大批的技术危险。这不是你编程过程中的清理代码和设计改良:这是根天性的重新设计。
不要为了重构而重构
重构可以被当成一种能给你的代码变更带来帮助的办法。代码重构应当在你进行代码变更前进行,这样能让你确信你对代码理解了,使你更容易、更平安的把变更引入代码。对你的重构动作进行回归测试。然落后行改正或变更。再次测试。之后可能须要对更多的代码进行重构,使你代码变更的意图变得更加清楚。再次进行全面测试。重构,再变更。或变更,而后重构。
为理解而做简略重构(Scratch Refactoring)
有些程序员以为对代码进行基本的、重大的修改是他们的权力和任务,在重构的名义下进行重新设计、重写,为了将来,也不辜负本人的技能。重新设计和重写有时候是你正确的该做的事情。但出于坦诚和表述清晰,请不要把这些运动赋以重构的名义。
相关的主题文章:
(责任编辑:网站建设)
什么是重构,什么不是重构_相关文章