QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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:093996

评论

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

基于GPU的ANN检索

百度Geek说

百度 检索 ann #GPU

业务系统的基石:数据库是如何构建数字世界的?

Taylor

Permute 3:全格式媒体转换大师,一键开启无缝转换之旅

理理

Sound Control for Mac(音量控制软件)

Mac相关知识分享

Photoshop 2023 for mac(PS 2023)中文版

Mac相关知识分享

鸿蒙网络编程系列50-仓颉版TCP回声服务器示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

1688商品详情数据接口(1688.item_get)丨1688API接入指南

tbapi

1688商品详情接口 1688API

开源低代码平台推荐!10款优秀的开源低代码平台!

JeeLowCode低代码平台

合合信息线下技术交流日报名启动!超多福利等你来领!

合合技术团队

技术交流 书籍 扫描 聊点技术 智能文档识别

Kafka集群管理:如何实现数据均衡与性能最大化

敏捷调度TASKCTL

hadoop 数据迁移 集群部署 Kafk 大数据运维

轻量级低代码:为复杂业务场景打造灵活解决方案

天津汇柏科技有限公司

低代码平台

史宾格平台荣获信通院“首批” 个人信息保护合规审计产品能力验证

百度安全

Waves15 Complete下载 附 激活补丁 后期混音效果全套插件

理理

小间距LED显示屏的五大核心技术

Dylan

技术 应用 LED显示屏 全彩LED显示屏 led显示屏厂家

TechTool Pro mac 实现系统硬件监测(CPU、内存、硬盘、网络、USB等)

理理

Microsoft Remote Desktop Beta for Mac(实用的远程桌面连接软件

Mac相关知识分享

文心智能体的乌镇时间,指路AI新十年

脑极体

AI

Downie 4 - 智能解析视频链接,极速下载不等待

理理

Mac平台有好用的PDF文件打印软件 Print to PDF Pro v5.3.8 激活版

理理

DNS滥用:全球网络安全的新挑战

国科云

Dynamic Wallpaper - 当创意邂逅 Mac 壁纸,动态之花绚烂绽放于桌面

理理

Mac 平台矢量图形编辑软件 Boxy SVG v4.49.1激活版

理理

探索1688API宝藏:关键字搜索直击商品与店铺全貌的实战攻略

代码忍者

API 接口 pinduoduo API

过等保三级需要堡垒机吗?为什么?

行云管家

等保 堡垒机 等保测评 等保三级

实战 Vector:开源日志和指标采集工具

Greptime 格睿科技

日志 vector 指标

聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题

左诗右码

Hit‘n’Mix RipX DAW PRO for Mac(专业音频处理软件)v7.5.0激活版

理理

SecureCRT for mac(好用的终端SSH仿真工具)

Mac相关知识分享

山西大同等保测评机构地址在哪里?电话多少?

行云管家

等保 等级保护 等保测评 大同

Topaz Gigapixel AI(人工智能图片放大工具) v8.0.3 完美激活安装教程

理理

SmartSVN for Mac(SVN客户端)

Mac相关知识分享

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