重构的重新认识

基本定义:重构是在不改变软件可观察行为的前提下改善其内部结构。

重构的生活方式

软件自有其美感所在。软件工程希望建立完美的需求与设计,按照既有的规范编写标准统一的代码,这是结构的美;快速迭代和RAD颠覆“全知全能”的神话,用近乎刀劈斧砍(crack)的方式解决问题,在混沌的循环往复中实现需求,这是解构的美;而Kent Beck与Martin Fowler两人站在一起,以XP那敏捷而又严谨的方法论演绎了重构的美。

“重构”这个概念来自Smalltalk圈子,没多久就进入了其他语言阵营之中。由于重构是框架开发中不可缺少的一部分,所以当框架开发人员讨论自己的工作时,这个属于就诞生了。当他们提炼自己的类继承体系时,但他们叫喊自己可以拿掉多少行代码时,它将随着设计者的经验成长而进化;他们也知道,代码被阅读和别修改的次数远远多于它被编写的次数,保持代码易读、易修改的关键,就是重构——对框架而言如此,对一般软件也如此。

好极了,还有什么问题吗?问题很显然:重构具有风险。它必须修改运作中的程序,这可能映入一些不易察觉的错误。如果重构方式不恰当,可能毁掉你数天甚至数星期的成果。如果重构时不做好准备,不遵守规则,风险就更大。你挖掘自己的代码,很快发现了一些值得修改的地方,于是你挖得更深。挖得愈深,找到的重构机会就越多,于是你的修改也愈多……最后你给自己挖了个大坑,却爬不出去了。为了避免自掘坟墓,重构必须系统化进行。我在《设计模式》书中和另外三位作者曾经提过:设计模式为重构提供了目标。然而“确定目标”只是问题的一部分而已,改造程序已达到目标,是另一个难题。

前言

什么是重构

所谓重构是这样一个过程:在不改变代码外在行为的前提下,对代码作出修改,以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减少整理过程中引入错误的几率。本质上说,重构就是在代码写好之后改进它的设计。

按照目前对软件开发的理解,我们相信应该先设计而后编码:首先得有一个良好的设计,然后才能开始编码。但是,随着时间流逝,人们不断修改代码,编码工作从严谨的工程堕落为胡砍乱劈的随行行为。

“重构”正好与此相反。哪怕你手上有一个糟糕的设计,甚至是一堆混乱的代码,你也可以借由重构把它加工成设计良好的代码。重构的每个步骤都很简单,甚至显得有些过于简单:你只需要把某个字段从一个类移到另一个类,把某些代码冲一个函数拉出来构成另一个函数,或是在继承体系中把某些代码推上推下就行了。但是,聚沙成塔,这些小小的修改累计起来就可以根本改善设计质量。这和一般常见的“软件会慢慢腐烂”的观点恰恰相反。

本书有什么

第1章展示了一个小程序,其中有些常见的设计缺陷,我把它重构为更合格的面向对象程序。其间我们可以看到重构的过程,以及几个很有用的重构手法。如果你想知道重构到底是怎么回事,这一章不可不读。

第2章讨论重构的一般性原则、定义,以及进行重构的原因,我也大致介绍了重构所存在的一些问题。

第3章由KentBeck介绍如何嗅出代码屮的“坏味道”,以及如何运用重构淸除这些坏味道。测试在重构中扮演着非常重要的角色,第4章介绍如何运用一个简单而且开源的Java测试框架,在代码中构筑测试环境。

本书的核心部分—重构列表—从第5章延伸至第12章。它不能说是一份全面的列表,只是一个起步,其中包括迄今为止我在工作中整理下来的所有重构手法。每当我想做点什么——例如Replace Conditional with Polymorphism (255)——的时候,这份列表就会提醒我如何一步一步安全前进。我希望这是值得你日后一再回顾的部分。本书介绍了其他人的许多研究成果,最后几章就是由他们之中的几位所客串写就的。

在Java中运用重构

为了很好地与读者交流我的想法,我没有使用Java语言中特别复杂的部分。所以我避免使用内嵌类、反射机制、线程以及很多强大的Java特性。这是因为我希望尽可能淸楚地展现重构的核心。

我应该提醒你,这些重构手法并不针对并发或分布式编程。那些主题会引出更多的考虑,本书并未涉及。

谁该阅读本书

本书的目标读者是专业程序员,也就是那些以编写软件为生的人。书中的示例 和讨论,涉及大景需要详细阅读和理解的代码。

下面我要告诉你,如何能够在不通读全书的情况下充分用好它。

  • 如果你想知道重构是什么,请阅读第1章,其中示例会让你清楚重构的过程。
  • 如果你想知道为什么应该重构,请阅读前两章。它们告诉你重构是什么以及 为什么应该重构。
  • 如果你想知道该在什么地方重构,请阅读第3章。它会告诉你一些代码特征,这些特征指出“这里需要重构”。
  • 如果你想着手进行重构,请完整阅读前四章,然后选择性地阅读重构列表。一开始只需概略浏览列表,看看其中有些什么,不必理解所有细节。一旦真正需要实施某个准则,再详细阅读它,从中获取帮助。列表部分是供査阅的参考性内容,你不必一次就把它全部读完。此外你还应该读一读列表之后其他作者的“客串章节”,特别是第15章。

results matching ""

    No results matching ""