何为重构?为何重构?

文章说明:

 1.重构:改善既有代码的设计 第3篇

 2.水平有限,可能有些语句和原文的意思有出入,请见谅

 3.前两篇由于代码较多,CSDN代码排版一直不太好,阅读请移驾

 重构:改善既有代码的设计(1) 

 重构:改善既有代码的设计(2)

    

        经过前面的例子,你应该对什么是重构有一个基本的认识,现在是时候让我们退回去看看重构的关键原则和一些你在运用重构时应该思考的问题。

1.何为重构

  我总是很谨慎的对一个东西下定义,因为对于每个东西,不同的人都有自己的定义。所以在重构的题目上,我的定义以Ralph Johnson(《设计模式》作者之一)团队和其它同行研究为基础的。

  首先要说明的是"Refactoring"一词视上下文的不同有两层意思:

  重构(动词):一种对软件内部结构的改善,目的是在不改变外部行为的前提下,使其更容易理解,修改成本更低;

  重构(名称):通过运用一系列重构方法,在不改变软件外部行为的前提下,重组其结构。

  所以你可能会花一些时间去重构,期间可能用上数十种不同的重构准则。有人曾经问过:"重构仅仅是整理代码吗?"从某种意义上说是,但是我认为重构的意义不仅仅在于此,因为它提供给我们一种技术,让我们整理代码更高效且受控制。自从我使用重构,我发现自己对代码的整理比以前更高效,因为我知道应该使用哪些重构准则,并且知道以怎样的方式使用它们可以让错误减少到最少,并且在每个可能出错的地方加以测试。

  这里,还要对我的定义向两方面扩展一下。首先,重构的目的是使代码更容易理解或修改,你可以在程序内部做很多修改,但是必须确保程序外部不做改变或者只是很小的改变。与之形成对比的就是性能优化,和重构一样,性能优化通常不会改变组件的外部行为(除了执行速度),只会改变起内部改变。但是它们的出发点却是不同的,性能优化经常让程序更难理解,但是为了得到你需要的性能又不得不那么去做。

  我要强调的第二点就是重构是不会改变软件的外部行为的。重构之后,软件仍然实现了原来的功能,任何用户,甚至是最终用户或者是其它程序员都不知道已有的东西已经发生改变。

  在使用重构技术开发软件时,你发现你的时间划分成了截然不同的两部分,一部分用来添加新功能,另一部分用来重构。添加新功能时,你不应该改变原有代码,只管添加新功能,并添加测试以确保你工作的正确性;重构时,你不应该添加新功能,只管改变代码内部结构,并不再添加新的测试(除非你发现以前有遗漏)。但是你在具体的开发时,它们就如同两顶帽子,你经常在交替使用它们两个。在添加新功能时,你发现这里可能需要一点改变,然后你就开始重构。重构完成以后,再换回以前的帽子继续添加新功能,当新功能完成以后,你发现你的代码又不太容易理解,所以你又戴上重构的帽子,继续修改你的代码。整个过程可能只花费了几分钟,但是你必须很清楚的知道,你头上到底是戴的哪顶帽子。

2.为何重构

  我不想宣称重构是治疗病态软件的灵药。但是它是一个好的工具能帮助你很好的控制自己的代码。重构可以为了以下数个目的而被使用:

重构可以改善软件的设计

  如果没有重构,程序的设计将会腐坏。人们修改代码往往是为了一个短期的目的,或是在没有完全理解程序的设计以前就贸然修改,程序就会失去自己的结构,人们会更难通过阅读代码来理解原来的设计。代码结构的流失是累积出来的,越难理解其设计的代码就越难以保护,那么它们就腐坏的越快。重构看似仅仅是在整理代码,但是经常性的重构可以帮助程序保持自己应该有的形态。

  糟糕的设计往往使用过多的代码来做同一件事,因为它们经常使用相同的代码在不同的地方来完成相同的事情。所以改善设计的一个重要方面就是消除重复代码。这个动作要着眼与未来,代码的减少并不能提高系统的运行速度。但是代码的减少使未来的修改动作容易得多,消除重复代码,你就可以确定代码将所有的食物和行为都只表述一次,这正是优秀设计的根本。

重构使软件更易理解

  很多方面来说,程序设计就是与计算机对话。你写代码就是告诉计算机想要做什么,它的响应则是精确的按照你的指示行动。这个时候你要做的就是尽量填补你[想要它做的][告诉它要做的]之间的间隙。这种编程模式的核心就是[准确说出你想要的]。你的代码除了计算机以外可能还有另外的用户,几个月后,有人可能因为要做些修改而阅读你的代码。我们很容易忘记代码阅读者的存在,但是这些用户才是最重要的。谁会关心计算机是否多花了数小时来编译,如果一个程序员花了数周时间来修改某段代码,这才关系重大。如果他理解你的代码的话,这原本只需要一小时。

  问题是当你努力让程序运转起来的时候是不会在意未来出现的那个开发者的。是时候改变你的节奏以确保你的代码更容易理解了,重构可以使你的代码更容易理解。一开始重构时,你的代码可以正常运行,但是结构不理想。在重构上多话一点时间,可以让代码更好的表达自己的用途。这种编程模式的核心就是[准确说出你的意思]

重构有助于找到bug

  对代码的理解可以帮助你知道代码的bug。一些人可以从一大段代码中找出bug,我不能,但是我可以通过重构我的代码来找到bug,对代码进行重构,可以更深入的了解代码,然后把自己的理解反馈回去。搞清楚程序结构的同时,我也搞清楚了自己的一些假设,从这个角度来说,不找到bug都难。

重构有助于提高编程速度

  终了,前面的一切都归结到一点:重构让你开发更迅速。

  听起来有点违反直觉。当谈到重构时,很容易看出它能够提高质量,改善设计,提升可读性,减少错误,这些都是提高质量。但是难道这些不会降低开发速度吗?

  我强烈的相信:良好的设计是快速开发软件的根本,事实上拥有良好设计才肯呢个达成快速的开发。如果没有良好设计,或许某一段时间内你的进度迅速,但是恶劣的设计很快就让你的速度慢下来。你会把时间花在调试上面,无法添加新功能。修改时间愈来愈长,因为你必须花费更多的时间去理解系统,寻找重复代码,随着你给最初的程序打上一个又一个补丁,新特性需要更多的代码才能实现。真是个恶性循环。

  良好的设计是维持软件开发速度的根本。重构可以帮助你更快速的开发软件,因为它阻止系统腐败变质,它甚至可以提高设计质量。

posted on 2011-09-14 20:32  springside5  阅读(434)  评论(0编辑  收藏  举报