`
wisfly
  • 浏览: 62938 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

重构(Refactoring)

阅读更多
重构
重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。另有同名图书。
1 为什么要重构
  为什么要重构(Refactoring)在不改变系统功能的情况下,改变系统的实现方式。为什么要这么做?投入精力不用来满足客户关心的需求,而是仅仅改变了软件的实现方式,这是否是在浪费客户的投资呢?
重构的重要性要从软件的生命周期说起。软件不同与普通的产品,他是一种智力产品,没有具体的物理形态。一个软件不可能发生物理损耗,界面上的按钮永远不会因为按动次数太多而发生接触不良。那么为什么一个软件制造出来以后,却不能永远使用下去呢?
对软件的生命造成威胁的因素只有一个:需求的变更。一个软件总是为解决某种特定的需求而产生,时代在发展,客户的业务也在发生变化。有的需求相对稳定一些,有的需求变化的比较剧烈,还有的需求已经消失了,或者转化成了别的需求。在这种情况下,软件必须相应的改变。
考虑到成本和时间等因素,当然不是所有的需求变化都要在软件系统中实现。但是总的说来,软件要适应需求的变化,以保持自己的生命力。
这就产生了一种糟糕的现象:软件产品最初制造出来,是经过精心的设计,具有良好架构的。但是随着时间的发展、需求的变化,必须不断的修改原有的功能、追加新的功能,还免不了有一些缺陷需要修改。为了实现变更,不可避免的要违反最初的设计构架。经过一段时间以后,软件的架构就千疮百孔了。bug越来越多,越来越难维护,新的需求越来越难实现,软件的构架对新的需求渐渐的失去支持能力,而是成为一种制约。最后新需求的开发成本会超过开发一个新的软件的成本,这就是这个软件系统的生命走到尽头的时候。
重构就能够最大限度的避免这样一种现象。系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。通过重构,不断的调整系统的结构,使系统对于需求的变更始终具有较强的适应能力。
通过重构可以达到以下的目标:
1.1 持续偏纠和改进软件设计
  重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解决方案就够了,如果没有重构、程序设计会逐渐变质,愈来愈像断线的风筝,脱缰的野马无法控制。重构其实就是整理代码,让所有带着发散倾向的代码回归本位。
1.2 使代码更易为人所理解
  Martin Flower在《重构》中有一句经典的话:"任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员。"对此,笔者感触很深,有些程序员总是能够快速编写出可运行的代码,但代码中晦涩的命名使人晕眩得需要紧握坐椅扶手,试想一个新兵到来接手这样的代码他会不会想当逃兵呢?
软件的生命周期往往需要多批程序员来维护,我们往往忽略了这些后来人。为了使代码容易被他人理解,需要在实现软件功能时做许多额外的事件,如清晰的排版布局,简明扼要的注释,其中命名也是一个重要的方面。一个很好的办法就是采用暗喻命名,即以对象实现的功能的依据,用形象化或拟人化的手法进行命名,一个很好的态度就是将每个代码元素像新生儿一样命名,也许笔者有点命名偏执狂的倾向,如能荣此雅号,将深以此为幸。
对于那些让人充满迷茫感甚至误导性的命名,需要果决地、大刀阔斧地整容,永远不要手下留情!
1.3 帮助发现隐藏的代码缺陷
  孔子说过:温故而知新。重构代码时逼迫你加深理解原先所写的代码。笔者常有写下程序后,却发生对自己的程序逻辑不甚理解的情景,曾为此惊悚过,后来发现这种症状居然是许多程序员常患的"感冒"。当你也发生这样的情形时,通过重构代码可以加深对原设计的理解,发现其中的问题和隐患,构建出更好的代码。
1.4 有助于提高编程效率
  从长远看,有助于提高编程效率。当你发现解决一个问题变得异常复杂时,往往不是问题本身造成的,而是你用错了方法,拙劣的设计往往导致臃肿的编码。
改善设计、提高可读性、减少缺陷都是为了稳住阵脚。良好的设计是成功的一半,停下来通过重构改进设计,或许会在当前减缓速度,但它带来的后发优势却是不可低估的。
2 何时着手重构
  何时着手重构(Refactoring)
新官上任三把火,开始一个全新??、脚不停蹄、加班加点,一支声势浩大的千军万"码"夹裹着程序员激情和扣击键盘的鸣金奋力前行,势如破竹,攻城掠地,直指"黄龙府"。
开发经理是这支浩浩汤汤代码队伍的统帅,他负责这支队伍的命运,当齐恒公站在山顶上看到管仲训练的队伍整齐划一地前进时,他感叹说"我有这样一支军队哪里还怕没有胜利呢?"。但很遗憾,你手中的这支队伍原本只是散兵游勇,在前进中招兵买马,不断壮大,所以队伍变形在所难免。当开发经理发觉队伍变形时,也许就是克制住攻克前方山头的诱惑,停下脚步整顿队伍的时候了。
Kent Beck提出了"代码坏味道"的说法,和我们所提出的"队伍变形"是同样的意思,队伍变形的信号是什么呢?以下列述的代码症状就是"队伍变形"的强烈信号:
2.1 代码中存在重复的代码
  中国有118 家整车生产企业,数量几乎等于美、日、欧所有汽车厂家数之和,但是全国的年产量却不及一个外国大汽车公司的产量。重复建设只会导致效率的低效和资源的浪费。
程序代码更是不能搞重复建设,如果同一个类中有相同的代码块,请把它提炼成类的一个独立方法,如果不同类中具有相同的代码,请把它提炼成一个新类,永远不要重复代码。
2.2 过大的类和过长的方法
  过大的类往往是类抽象不合理的结果,类抽象不合理将降低了代码的复用率。方法是类王国中的诸侯国,诸侯国太大势必动摇中央集权。过长的方法由于包含的逻辑过于复杂,错误机率将直线上升,而可读性则直线下降,类的健壮性很容易被打破。当看到一个过长的方法时,需要想办法将其划分为多个小方法,以便于分而治之。
2.3 牵一毛而需要动全身的修改
  当你发现修改一个小功能,或增加一个小功能时,就引发一次代码地震,也许是你的设计抽象度不够理想,功能代码太过分散所引起的。
2.4 类之间需要过多的通讯
  A类需要调用B类的过多方法访问B的内部数据,在关系上这两个类显得有点狎昵,可能这两个类本应该在一起,而不应该分家。
2.5 过度耦合的信息链
  "计算机是这样一门科学,它相信可以通过添加一个中间层解决任何问题",所以往往中间层会被过多地追加到程序中。如果你在代码中看到需要获取一个信息,需要一个类的方法调用另一个类的方法,层层挂接,就象输油管一样节节相连。这往往是因为衔接层太多造成的,需要查看就否有可移除的中间层,或是否可以提供更直接的调用方法。
各立山头干革命
如果你发现有两个类或两个方法虽然命名不同但却拥有相似或相同的功能,你会发现往往是因为开发团队成员协调不够造成的。笔者曾经写了一个颇好用的字符串处理类,但因为没有及时通告团队其他人员,后来发现项目中居然有三个字符串处理类。革命资源是珍贵的,我们不应各立山头干革命。
2.6 不完美的设计
  在笔者刚完成的一个比对报警项目中,曾安排阿朱开发报警模块,即通过Socket向指定的短信平台、语音平台及客户端报警器插件发送报警报文信息,阿朱出色地完成了这项任务。后来用户又提出了实时比对的需求,即要求第三方系统以报文形式向比对报警系统发送请求,比对报警系统接收并响应这个请求。这又需要用到Socket报文通讯,由于原来的设计没有将报文通讯模块独立出来,所以无法复用阿朱开发的代码。后来我及时调整了这个设计,新增了一个报文收发模块,使系统所有的对外通讯都复用这个模块,系统的整体设计也显得更加合理。
每个系统都或多或少存在不完美的设计,刚开始可能注意不到,到后来才会慢慢凸显出来,此时唯有勇于更改才是最好的出路。
2.7 缺少必要的注释
  虽然许多软件工程的书籍常提醒程序员需要防止过多注释,但这个担心好象并没有什么必要。往往程序员更感兴趣的是功能实现而非代码注释,因为前者更能带来成就感,所以代码注释往往不是过多而是过少,过于简单。人的记忆曲线下降的坡度是陡得吓人的,当过了一段时间后再回头补注释时,很容易发生"提笔忘字,愈言且止"的情形。
曾在网上看到过微软的代码注释,其详尽程度让人叹为观止,也从中体悟到了微软成功的一个经验。
分享到:
评论

相关推荐

    重构资料整理1 重构 refactoring

    “所谓重构(refactoring)就是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构.哪怕你手上有一个糟糕的设计,甚至是一堆混乱的代码,你也可以借由重构把它加工成良好的代码.”

    重构 refactoring 英文 有书签

    ### 重构:改善既有代码设计 #### 知识点概览 1. **重构定义**:重构是指在不改变软件外部行为的前提下,对其内部结构进行调整以提高代码质量的过程。 2. **重构的重要性**:重构有助于提升代码的可读性、可维护性...

    重构(Refactoring)英文版

    ### 重构(Refactoring):改善现有代码的设计 #### 一、重构概念解析 重构(Refactoring)是一种软件工程中的重要技术,它指的是在不改变软件系统外部行为的前提下,通过改进其内部结构来提高代码质量的过程。重构...

    重构(Refactoring)课件PPT

    重构(Refactoring)课件PPT重构(Refactoring)课件PPT重构(Refactoring)课件PPT重构(Refactoring)课件PPT

    重构界面 Refactoring ui 中文版

    《Refactoring UI》是一本由Adam Wathan和Steve Schoger合著的设计书,主要面向开发者,帮助他们在不具备专业设计背景的情况下也能提升UI设计的质量。这本书提供了实用的设计建议和技巧,帮助开发者在日常工作中更好...

    重构手册 Professional Refactoring Workbook

    《重构手册 Professional Refactoring Workbook》是一本专注于软件重构实践的权威指南。本书旨在帮助开发者们理解和掌握重构这一关键技能,以提升代码质量、可维护性和软件设计的灵活性。重构是软件开发过程中的一个...

    重构 学习笔记 refactoring martin fowler

    重构是软件开发过程中的一个重要环节,它涉及到对现有代码的改进,目的是为了提高代码的可读性、可维护性和设计质量,而不改变其外部行为。本文主要围绕重构的关键概念、原则、时机以及面临的挑战展开讨论。 首先,...

    31天重构指南 《31Days Refactoring》中文版

    《31Days Refactoring》是Sean Chambers撰写的一本关于重构技术的著作,中文版由麒麟.Net翻译。重构,作为软件开发中的一个重要环节,是改善代码结构、提高代码可读性和可维护性的一种方法,不改变代码外在行为,却...

    Refactoring(Improving the Design of Existing Code)

    这本书专注于一个非常重要的软件开发实践,即重构(Refactoring)。重构指的是在不改变外部功能的前提下,对软件的内部结构进行改善的过程。该书的描述提到了书中包含的每个重构方法的书签,为读者查找提供了便利。...

    重构 - Refactoring Improving the Design of Existing Code - Martin Fowler

    《重构 - Improving the Design of Existing Code》是马丁·福勒(Martin Fowler)的经典著作,这本书深入探讨了软件开发中的一个重要实践领域——重构。重构是指在不改变代码外在行为的前提下,改善其内部结构,使...

    31天重构指南--代码重构(refactoring)

    ### 31天重构指南——代码重构(Refactoring) #### 一、代码重构的基本概念 代码重构是指在不改变程序外部行为的前提下,对其内部结构进行调整的过程。这一做法旨在提高程序的质量,包括但不限于提高代码的可读性...

    重构与模式 Addison Wesley Refactoring To Patterns

    在阅读《Addison Wesley Refactoring To Patterns.chm》这个电子版文件时,读者可以期待获得以下方面的知识: 1. **重构的基本原则**:了解何时应该进行重构,以及如何避免在重构过程中引入新的错误。 2. **重构的...

    《重构用户界面》- Refactoring UI 中文机翻版

    《重构用户界面》是一本专为程序员和UI界面设计初学者编写的教程,旨在通过深入浅出的方式,解决常见的Web设计问题,提升界面设计的质量和用户体验。书中详细讲解了多种Web设计原则,提供了丰富的实例和对比,以...

    经典书籍《重构》《Refactoring: Improving the Design of Existing Code》

    ### 经典书籍《重构》(Refactoring: Improving the Design of Existing Code) #### 书籍概述 《重构:改善既有代码的设计》是一本由马丁·福勒(Martin Fowler)、肯特·贝克(Kent Beck)、约翰·布兰特(John ...

    重构.pdf_电子版_pdf版

    本资源主要讲解了软件设计中的重构(Refactoring)概念,并提供了一个实际案例来演示如何通过重构来改进代码结构。 什么是重构? 重构是软件设计中一种重要的技术,它的目的是为了使代码变得更加清晰、简洁、易...

    Refactoring To Patterns《重构与模式》英文版

    ### 重构与模式:理论与实践的融合 #### 书籍概览 《重构与模式》是一本由Joshua Kerievsky编写的书籍,由Addison Wesley出版社于2004年8月5日出版,ISBN号为0-321-21335-1,全书共400页。该书旨在将重构技术和...

    Refactoring--Improving the Design of Existing Code(重构,英文清晰版,带完整书签)

    《重构—改善既有代码的设计》是Martin Fowler所著的一本关于软件开发领域重构技术的经典之作。本书详细探讨了如何通过重构改善现有代码的设计,同时不改变软件的外部功能。重构是一种软件开发技巧,通过这种方式,...

    phpactor, PHP重构和自省工具.zip

    phpactor, PHP重构和自省工具 Phpactor 这个项目旨在提供重lifting重构 refactoring和自省工具,可以独立使用或者作为文本编辑器的后端提供智能代码完成。安装Phpactor是通用工具,它不打算作为项目依赖项安装。请...

    重构(Refactoring Improving the Design of Existing Code)

    《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典IT著作,专注于讨论如何在软件开发过程中通过一系列微小的、逐步的改进来优化现有代码的结构和设计,从而提高代码的质量和可维护性。这本书是编程领域...

Global site tag (gtag.js) - Google Analytics