英文原文:What Refactoring is, and what it isn’t,翻译:外刊IT评论 有时候,会有程序员跑到我这里说他们不喜欢某个东西的设计,“我们需要给它来个全面的重构”,来纠正里面的错误。哦,哦。这听起来可不是个好主意。而且这听起来也不是重构… 重构(Refactoring)这个词最初由Martin Fowler 和 Kent Beck给下的定义,它是 一种修改,使软件的内部结构更容易理解,在不改变软件的可见行为方式前提下使软件更容易变更…它是一种有节制的整理代码、使bug产生几率最小化的方法。 重构的结果是引用了快捷方法、去除了重复代码和死代码,使设计和逻辑更加清晰。是在更好的、更聪明的使用编程语言。是在优势利用你现在知道、但 当时的开发程序员并不知道——或并没有加以利用的信息。不断的简化代码,让它们更容易理解。不断的使它们在将来的变更变得更容易、更安全。 在这个过程中发现了bug、修改bug,这不是重构。优化不是重构。强化异常捕捉、增加预防性代码不是重构。让代码更容易测试不是重构——尽管重构能达到相同的效果。这些所有的事都是有益的。但这些都不是重构。 程序员,特别是做维护工作的程序员,清理代码是他们的日常工作之一。这是基本工作,是必须要做的。Martin Fowler等人的贡献是使重构代码的最佳实践方法格式化,并把常见的、证明切实有效的重构模式——重构的目标和重构的步骤——进行归档分类。 重构很简单。尽可能在写代码前先写测试能够防止你犯错误。小规模的、独立的、稳妥的对代码进行结构上的调整,每次调整完后都要进行测试,确保你 没有改变代码的行为特征——功能和以前一样,只是代码上看着不同。重构模式和现代化的IDE里的重构工具使重构变得容易、安全和代价低廉。 不要为了重构而重构 重构可以被当成一种能给你的代码变更带来帮助的措施。代码重构应该在你进行代码变更前进行,这样能让你确信你对代码理解了,使你更容易、更安全 的把变更引入代码。对你的重构动作进行回归测试。然后进行纠正或变更。再次测试。之后可能需要对更多的代码进行重构,使你代码变更的意图变得更加清晰。再 次进行全面测试。重构,再变更。或变更,然后重构。 你不是为了重构而重构,你重构是因为你想做其它的事情,而重构能帮助你完成这些事情。 重构的范围应该受你需要实施的代码变更或代码修正来决定——为了让代码变更更安全和更简洁,你应该做些什么?换句话说:不要为了重构而重构。不要对那些你不打算进行变更或不会变更的代码进行重构。 为理解而做简略重构(Scratch Refactoring) Michael Feather的《Working Effectively with Legacy Code》这本书里提到了简略重构(Scratch Refactoring)的概念;Martin Fowler称之为“为理解而重构”。这是用来对付那些你不理解的(或不能忍受的)代码,清理它们,这样在你打算真正动手修改它前,你能对它们是干什么的 有了更好的理解,同样也对你debug这些代码有帮助。一旦你能清楚了一个变量或方法的真正意图,重命名它们,给它们一个更合适的名称,删除那些你不喜欢 看的(或觉得没有用的)代码,拆解复杂的条件语句,把长程序分解成数个容易理解的小程序。 不要惦记着复查或测试这些改动。这是为了让你的重构快速的推进——这能让这些代码以及它们的运行原理在你的大脑里产生一个快速但不完备的原型。 从中学习,然后丢掉它们。简略重构还能让你尝试各种不同的重构途径,学到更多的重构技巧。Michael Feathers建议说,在这个过程中要留意那些看起来没什么用处、或者特别有用的东西,这样当你完成此练习后、要真正修改它们时,才能把事情做正确—— 修改时一点一点来,讲究方法,边修改边测试。 什么是“大规模”重构? 对代码进行简单的但又明显的重构:消除重复,修改变量和方法名称使其更有意义,提炼方法使代码更易懂、更易复用,简化条件逻辑,把无意义的数字换成命名的变量,把相似的代码集中到一起。通过这些重构,在代码的可理解性和可维护性上,你能得到巨大的回报。 相对于这些较小的、行内的重构,更加重大的设计上的重构与之有明显差异——这就是Martin Fowler所指的”大型重构”。大的、代价很高的变动,附带有大量的技术风险。这不是你编程过程中的清理代码和设计改进:这是根本性的重新设计。 有些人喜欢把对一个系统的重新设计或重写或重新搭建平台或返工叫“大规模重构”。因为技术上讲,这些并不改变软件功能特征——业务逻辑、软件输 入和输出仍和以前一样,“只是”设计和代码实现变了。它和常规重构的区别看起来就是:一个是重写了一段代码,一个是重写了一个系统,只要你是一步一步做下 来的,你都可以称之为“重构”——不管你是长年累月被困于将一个老系统换成新代码,还是对系统架构进行大规模的改造。 “大规模重构”会变的很糟糕。你可能需要花数周、数月(甚至数年)才能完成,需要你对软件的很多部分进行改动。软件会因此不能运行,需要分多次发布这些变更,需要你做临时的台架(scaffolding)和变通方案——尤其是你采用短周期的敏捷开发方法时。这时Branch by Abstraction这样的实践方法就派上用场了,它能帮你在长周期内管理代码中的变化。 而且在开发新代码的同时你还要维护旧代码,这使得代码版本控制很麻烦,变更起来不方便,致使代码很脆弱,易犯错——这正和重构所预期的目的背道 而驰。有时这样的情况会一直持续下去——这种新旧代码交替的过程永远不能完成,因为能获得最大利益的部分都是最先完成,或者因为最初带来这个想法的顾问已 经干别的去了,或者是预算被消减,而且你也讨厌维护这样一个拖拉的项目。 这些是重构——那些不是 在这种重型的项目开发过程中混入重构的概念是不对的。它们从根本上就是另外一种工作,带有完全不同的开发成本和风险。它混淆了人们对什么是重构、重构能干什么的认识。 重构可以、也应该融入到你写代码或维护代码的过程中——作为日常开发/质量管理的组成部分,就像写测试和代码审查一样。重构应该被安静的,持续 的和低调的完成。它需要我们把工作精力分出一部分给它,它需要在我们的工期评估和风险评估中考虑到它的存在。如果做的正确,你不需要去解释或向外人验证这 部分工作。 花几分钟、一两个小时做重构,就像是你开发过程中的一种修改,是工作的一部分。如果它让你花了数天时间,或者更长,那不是重构;那是重写,或重 新设计。如果你需要明确的留出一部分时间(或整个sprint周期)来重构代码,如果需要为清理代码而申请批准,或把清理代码作为一个开发需求,那你不是 在重构——即使你用了重构的技术和工具,你仍然做的是另外一种工作。 有些程序员认为对代码进行根本的、重大的修改是他们的权利和义务,在重构的名义下进行重新设计、重写,为了将来,也不辜负自己的技艺。重新设计和重写有时候是你正确的该做的事情。但出于坦诚和表述清楚,请不要把这些活动赋以重构的名义。

转载于:https://www.cnblogs.com/Qbit/archive/2012/10/15/2778298.html

什么是重构,什么不是重构相关推荐

  1. 重构是提高可测试性的主要手段 《设计模式》《代码重构》《从重构到模式》 《反模式》 重构时机 编写测试时候 修改BUG时候

    l重构是提高可测试性的主要手段 <设计模式><代码重构><从重构到模式> <反模式> 重构时机 编写测试时候 修改BUG时候

  2. .NET重构—单元测试的代码重构

    阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1.1.公用的MOCK对象: ...

  3. 代码重构(二):类重构规则

    在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp ...

  4. 代码重构之道,重构即重生,让你的代码起死回生

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:代码重构之道,重构即重生,让你的代码起死回生 | .Net中文网. 概述 有人曾经说过:不优雅的代码是对编译器的侮辱. 内容 科技美文 ...

  5. 重构手册阅读笔记:重构的含义

    重构是安全地改善既有代码设计的一门艺术.有以下几种含义: 重构并不包括对系统的所有修改.如果修改是对设计的改善, 或是增加新的功能, 则均不能被认为是重构. 例如, 极限编程(XP)使用了测试驱动开发 ...

  6. 为什么要重构,何时进行重构

    重构的目的 代码重构是DevOps软件开发方法中使用的过程,该过程涉及编辑和清除以前编写的软件代码,而不更改代码的功能.代码重构的基本目的是使代码更加有效和可维护.这是降低技术成本的关键,因为现在清理 ...

  7. 系统重构的原则代码重构的原则

    作者:[美]马丁•福勒(Martin Fowler) 译者:熊节, 林从羽 前一章所举的例子应该已经让你对重构有了一个良好的感觉.现在,我们应该回头看看重构的一些大原则. ##2.1 何谓重构 一线的 ...

  8. 系统重构的未来:重构工具 Coca 一周年

    一年前,在公司大佬的指点之下,我开始写系统级重构工具 Coca (https://github.com/phodal/coca) .哦,不,不对,是刚开始学习 Golang,因为我的第一次提交是从一个 ...

  9. java代码重构工具_代码重构什么意思 Java代码重构的几种模式

    指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果. 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方.在极限编程的方法学中,重构需要单元测试来支持. 在软件工程 ...

  10. 【Java设计模式 规范与重构】 六 代码重构小结

    最近趁着学习劲头足,如饥似渴的把代码重构部分也学习完了,可以说9月份属实非常充实,貌似也只有学习才能导致生活没有那么无聊. 代码重构博客目录 序号 文章列表 1 [Java设计模式 规范与重构] 一 ...

最新文章

  1. ngnix mysql 缓存清除_利用Proxy Cache使Nginx对静态资源进行缓存
  2. IplImage简介
  3. php session 释放,php中删除Session和销毁Session的方法
  4. DockPanel 类
  5. 【DevCloud · 敏捷智库】Scrum和看板如何选择
  6. strcat第二个参数变吗_您能解决这3个(看似)简单的Python问题吗?
  7. Linux命令整理-Ubuntu
  8. oracle ebs工单入库,ORACLE-EBS_库存功能点操作模块.doc
  9. 量子化信息素蚁群优化特征选择算法
  10. linux 文本编辑器vi常用命令
  11. jquery weui 上拉加载,下拉刷新,问题解答。
  12. 网络安全策略管理架构
  13. keras的model保存和载入
  14. 一周热图|陈飞宇成天梭表形象代言人;朱一龙赵丽颖登陆欧舒丹星球;张信哲代言欧宝娱乐...
  15. 偶然发现,Javascript中双重否定的写法
  16. Yigo平台中系统自带的五个系统字段值
  17. PTA 7-85 根据输入的空气污染指数,输出相应的信息。
  18. 人类数据总量_人类已产生五十亿GB数据 X一代贡献的数据总量最大
  19. 永洪Desktop实例分享|星巴克数据指标体系建设及炫酷可视化大屏搭建
  20. 我的兄弟姐妹中感人的亲情

热门文章

  1. Tomcat9 (catalina.bat)控制台日志乱码
  2. 【Apache】 配置 (http协议的) vhost
  3. php psr4 控制器调用模型,控制器中调用模型添加数据
  4. 返回值类型与函数类型不匹配_golang基础语法,定义函数类型 为已存在的数据类型起别名...
  5. mongodb 查询效率_2020年9个好用的MongoDB 图形化界面工具
  6. CentOS 环境下配置MySQL8.0
  7. pb 执行存储过程带参数_数据库存储过程
  8. php求平均值的函数_国二常用函数(二)
  9. python怎么调用方法_python中怎么调用自己的方法
  10. 聚合型神器!有了他,手机里app可以删一半