东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

如何进行大规模重构

  • 2010-08-30
  • 本文字数:1144 字

    阅读完需:约 4 分钟

从定义上看,重构意味着改变程序的内部结构,而不改变外部的功能行为。 这样做大多是为了提高程序的非功能性属性,从而提高代码的质量。然而,即便是经验丰富的敏捷开发者,在进行大规模的重构时也是如履薄冰。社区中的成员对掌控大规模重构的几种方式进行了讨论。

在最近的讨论中,Andreas 想要知道三种可能完成大规模重构的方法中哪种最好。他的方式包括,

  • 一次完成——定义最终状态的结构,然后将代码一次完成。
  • 分而治之——将一大团乱七八糟的代码分为两段,然后重复这样的操作,直至完成……
  • 压制(Strangling)——压制类

大多数回应者都认为“一次完成”几乎不会成功的。 Aaron Digulla 指出他在整个职业生涯中一直使用压制的方法。这种想法是要慢慢地将不好的代码变为崭新的优质代码,并在过程中用测试来保证转换的正确性。这种策略的优势在于,因为你是从小片段慢慢开始的,因此风险很小。David Hall 和 Shane MacLaughlin 强调了分而治之方法的重要性,但也要针对程序所有修改的部分编写充分的测试。一些人建议完全推倒重写,但是正如 InfoQ 之前的一篇文章所说的,那会让你面临一系列的挑战

Sibylle Peter 和 Sven Ehrke 提到,他们使用的方法是,先对工作进行评估,然后为大规模的重构制定主要计划。对于每个重构步骤,他们都会遵循以下三步:

  • 分析: 定义 想要的结果,并找到达到目的的方法。
  • 实现: 应用重构技术 来相应地改变代码。
  • 稳定: 应用一些方法, 确保实现的结果是 持久的。

另一种让大规模重构得以进行的方法是“天皇牌”(Mikado)方法。回顾天皇牌方法的历史,我们会发现它与 Daniel Brolund Ola Ellnestam 所做的工作有关,而它的名字来自于天皇牌游戏。根据这个方法,

修改代码就像进行天皇牌游戏一样。当你想要对代码库做出修改时,几乎无法以正确的方式做出准确的修改 你需要做些准备、移动代码、抽取类等等。我们很少会第一次就抓到天皇牌。 更多的是,在“重构天皇”可用之前,你需要做一系列的变动,有条不紊地向你的牌堆的底部进发,以达到目的。

使用天皇牌方法,首先要记住最终的目的。对于任何需要重构的代码,我们首先要创建一幅依赖图,在上面写下最终的目标。下一步是识别出想要达到目标所需要的直接前提,然后以这种方式继续识别依赖关系,直到达到没有任何前提或者依赖的叶子节点。 这可能是开始重构最好的方式。一旦有了依赖关系图,那么核心思想就是从叶子节点一步一步回溯,直到达到目标。

这种方法强调了撤销操作的重要性,团队不应该害怕因为回退而抛弃一些改变。他还建议不要停止分析,而应该从最基本步骤开始,然后理解顺序。现在他们已经提供了关于“天皇牌”方法的书的草稿版本。

因此,大规模重构很难做,做好这项工作的关键在于要识别出起点,然后沿着路线小步前进。

查看英文原文: How To Do Large Scale Refactoring

2010-08-30 08:473751
用户头像

发布了 340 篇内容, 共 126.0 次阅读, 收获喜欢 13 次。

关注

评论

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

深度学习应用篇-元学习[15]:基于度量的元学习:SNAIL、RN、PN、MN

汀丶人工智能

人工智能 深度学习 元学习 元强化学习 6 月 优质更文活动

以商业实践反哺开源技术跃升|2023开放原子全球开源峰会开源商业化创新发展分论坛成功举行

开放原子开源基金会

开源 开源商业化 开放原子全球开源峰会

柏睿向量存储查询引擎基于LLM实现特定垂直领域的知识问答功能

新消费日报

DEVONthink Pro 3 for Mac:Mac强大的文档管理工具

背包客

macos 文档管理软件 Mac软件 DEVONthink Pro DEVONthink

STM32L0 ADC使用HAL库关于校准问题的说明

矜辰所致

STM32L051 ADC 6 月 优质更文活动

中国科学院院士梅宏:推进构建面向全球的开源生态治理体系

开放原子开源基金会

开源 开放原子 梅宏

TS接口类型

不叫猫先生

6 月 优质更文活动

VSD Viewer for Mac:Visio绘图文件阅读器

背包客

macos Mac软件 Visio文件查看工具 Visio Viewer for Mac VSD Viewer

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

股市老人

激活SBOM内生价值 推动供应链体系建设健康有序|2023开放原子全球开源峰会软件物料清单(SBOM)分论坛成功举办

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 软件物料清单(SBOM)

NestJs 管道(Pipe)

小鑫同学

typescript 后端 nestjs 6 月 优质更文活动

深入理解 ABAP Reference 变量

Jerry Wang

SAP abap Netweaver 6 月 优质更文活动

基于STM32设计的智能灌溉控制系统

DS小龙哥

6 月 优质更文活动

行业翘楚论道未来想象|2023开放原子全球开源峰会云原生分论坛圆满落幕

开放原子开源基金会

开源 云原生 开放原子

华为云数据库GaussDB:给世界一个更优选择

YG科技

WWDC2023 Session系列:探索XCode15新特性 | 京东云技术团队

京东科技开发者

xcode wwdc session WWDC 2023 企业号 6 月 PK 榜

【C/C++】extern 的一些注意事项

sidiot

c 6 月 优质更文活动

PDF Expert for mac:pdf编辑工具中文最新

背包客

macos PDF Mac软件 PDF Expert PDF Expert for Mac

这项国家级安全检测,腾讯云慧眼安全能力再获认可!

牵着蜗牛去散步

人工智能 腾讯云 网络安全 腾讯云AI 腾讯云慧眼人脸核身

Alibaba官方上线!SpringBoot+SpringCloud全彩指南

互联网架构师小马

Java 微服务 Spring Cloud Spring Boot

阿里资深专家撰写出的Nginx底层与源码分析手册,GitHub已爆赞

互联网架构师小马

nginx

华为云数据库GaussDB:数字化转型和可持续发展的更优选择

YG科技

华为云数据库GaussDB:数字化转型的可信之选

YG科技

深度学习应用篇-元学习[16]:基于模型的元学习-Learning to Learn优化策略、Meta-Learner LSTM

汀丶人工智能

人工智能 深度学习 元学习 元强化学习 6 月 优质更文活动

关于 SAP ABAP 字符变量和字符串变量字符个数的一个知识点,和一个血案

Jerry Wang

后台开发 abap Netweaver 字符串处理 6 月 优质更文活动

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

EOSdreamer111

对线面试官-Sychronized和ReentrantLock

派大星

Java 面试题

2023开放原子全球开源峰会OpenCloudOS社区年会顺利举行

开放原子开源基金会

开源 开放原子 OpenCloudOS社区

聚焦企业实践一线与个体职业成长|2023开放原子全球开源峰会OSPO分论坛成功举办

开放原子开源基金会

开源 开放原子全球开源峰会 OSPO 开放原子

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

西柚子

【Netty】「萌新入门」(三)ChannelFuture 与 CloseFuture

sidiot

Java 后端 Netty 6 月 优质更文活动

如何进行大规模重构_研发效能_Vikas Hazrati_InfoQ精选文章