写点什么

Martin Fowler 讲述重构的工作流程

  • 2014-02-25
  • 本文字数:1541 字

    阅读完需:约 5 分钟

《重构:改善既有代码的设计》一书的作者 Martin Fowler 最近在其个人网站上发表了一篇文章,探讨了如何通过各种工作流程来将代码重构融入到我们日常的编程工作当中。

在文章中他还介绍了如何使用各种不同的工作流程,并且建议“为了最有效地进行代码重构,我们需要结合使用所有的重构工作流程,这样才能使不同的流程无缝地融入到开发工作当中”。

Fowler 将重构定义为“……一项用于对既有代码的主体结构进行调整的专门技术,可以在不影响其外部行为的情况下修改其内部结构”。

Joshua Kerievsky 在其著作《重构与模式》中建议:

通过持续地改善代码的设计,我们可以使代码变得越来越容易维护。这与通常所采用的做法形成了鲜明的对比。通常我们很少做代码重构,而是把大量的注意力放在如何方便快捷地添加新功能上面。如果我们养成了持续重构的良好习惯,就会发现代码变得越来越容易扩展和维护。

虽然在文中 Fowler 讲到重构技术现在已经为人们所熟知,但他还是建议大多数的团队仍然需要去更好地了解实施重构过程中可以使用的各种工作流程,以便在各种情况下都能够选择出最佳的流程加以应用 。

基于 Don Roberts 提出的三次法则,网站 SourceMaking描述了需要进行代码重构的下列几种情形。

“第一次做某件事情时,可以只管去做。第二次做类似的事情时,虽不情愿,但总之还是把同样的事情重复又做了一遍。而第三次做类似的事情时,就要进行重构。”

  • 当添加新函数时
  • 当修复 bug 时
  • 当进行代码评审时

Fowler 使用了“两顶帽子”的比喻,向我们解释了有些时候我们是在添加新的功能(添加功能帽子),而另外一些时候我们是在改善既有代码的质量(重构帽子)。这样的比喻还能够作为我们日常编程工作中的提醒,使我们清楚地认识到自己究竟工作在哪种角色下。在文中他还讲到“在编程过程中,我们可能需要在不同的帽子间频繁地转换,可能每隔几分钟就要转换一次,但我们每一时刻只能带一顶帽子”。

借着上面的比喻,Fowler 描述了第一种工作流程,可能也是使用最为广泛的一种流程,名字叫做“使用测试驱动开发进行重构”。这种流程基于以下循环:开始于绿色状态,编写测试用例(现阶段会执行失败),然后编写程序使之能够通过测试,最后再对代码的质量进行改进。来自 planetgeek.ch 的 Urs Enzler 详细描述了测试驱动开发与重构之间的关系。

“捡垃圾式的重构”是下一种工作流程。Fowler 在文中提出,这种流程可以应用在代码中出现大面积混乱段落时的情景。这种流程的基本原理就是“每次都对我们用到的部分代码进行清理,这样会简化我们下次使用时所需要做的清理工作。这种方法甚至还可以使当前要做的修改也变得容易”。

之后Fowler 还详细地解释了“针对代码可理解性的重构”。这种重构旨在使代码变得简单易懂,进而使程序变得易于使用和维护。文章中还引用了一段 Ward Cunningham 的话来补充这一观点:

每当你不得不去搞明白一段代码究竟做了哪些事情的时候,在你的头脑中就会形成对于这段代码功能的一些理解,而一旦形成了这些理解,你就应该把它们固化到代码中,这样其他人就不必对这段代码再从头理解一遍。

文中还描述了其他三种工作流程,Fowler 认为它们与前面所讲的三种流程同样重要:

  • “准备性的重构”——当我们开始开发一项新功能时可以采用这种方法。
  • “有计划的重构”——当问题代码太多,必须专门花时间来进行重构时可以采用这种方法。
  • “长周期的重构”——当我们需要在几轮迭代过程中替换掉一个较大的模块时可以采用这种方法。

你们是否也一直在做代码重构?

查看英文原文: Martin Fowler Presented Workflows of Refactoring


感谢臧秀涛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-02-25 20:093890

评论

发布
暂无评论
发现更多内容

2022前端高频react面试题集锦

beifeng1996

React

中移链合约常用开发介绍 (一)开发基本流程

BSN研习社

中移链

RocketMQ Connect 构建流式数据处理平台

Apache RocketMQ

RocketMQ Connect

性能最大提升60%,阿里云发布基于第四代英特尔至强的第八代ECS实例

云布道师

阿里云

实现Promise的原型方法--前端面试能力提升

helloworld1024fd

JavaScript

Github上获赞59.8K的面试神技—1658页《Java面试突击核心讲》

架构师之道

编程 程序员 java面试

深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

洛神灬殇

JVM 12 月 PK 榜 调优参数 调优技术

破记录!国产数据库KunDB 单节点TPC-C事务性能超180万tpmC

星环科技

民航二所马勇:数据安全防护体系的探索与思考

极盾科技

数据安全

js事件循环与macro&micro任务队列-前端面试进阶

loveX001

JavaScript

手写一个Redux,深入理解其原理-面试进阶

beifeng1996

React

【12.9-12.16】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动

腾讯前端常考react面试题(持续更新中)

beifeng1996

React

能不能手写Vue响应式?前端面试进阶

bb_xiaxia1998

Vue

社招前端常考手写面试题总结

helloworld1024fd

JavaScript

前端二面高频手写面试题

helloworld1024fd

JavaScript

手把手教你成为荣耀开发者:应用管理指南

荣耀开发者服务平台

前端 快应用 荣耀 honor 应用集成

【敏捷转型,效能提升】敏捷转型实践系列分享

京东科技开发者

敏捷 敏捷团队 效能度量 效能提升 #DevOps

公交车LED电子路牌宣传效果更好吗

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

全球首家!星环科技通过3TB TPCx-AI测试,实现大数据与AI的完美融合

星环科技

重写Nacos服务发现:多个服务器如何跨命名空间,访问公共服务?

LigaAI

Java 测试 nacos 测试环境 12 月 PK 榜

2022面试官常考的前端面试题

loveX001

JavaScript

必会vue面试题总结

bb_xiaxia1998

Vue

几个常见的js手写题,你能写出来几道

helloworld1024fd

JavaScript

星环数据云平台 TDC 3.1 发布,新增滚动重启、存储回收站等八大核心功能

星环科技

你是如何使用React高阶组件的?

beifeng1996

React

每日一题之请描述Vue组件渲染流程

bb_xiaxia1998

Vue

GaiaX开源解读 | 给Stretch(Rust编写的Flexbox布局引擎)新增特性,我掉了好多头发

阿里巴巴文娱技术

开源 rust 后端 rust语言 GaiaX

将渲染计算搬到云端,开启低成本、强交互、沉浸式体验

阿里云视频云

云计算 阿里云 云渲染 串流

XTransfer技术专家亮相Flink Forward Asia 2022

XTransfer技术

百度前端一面必会vue面试题合集

bb_xiaxia1998

Vue

Martin Fowler讲述重构的工作流程_研发效能_Rui Miguel Ferreira_InfoQ精选文章