速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

如何进行大规模重构

  • 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:473853
用户头像

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

关注

评论

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

双十一入手华为云Flexus云会议后,我总结了中小企业无法拒绝的3大优势

轶天下事

《Django 5 By Example》阅读笔记:p54-p75

codists

Python django

一文读懂Pencils Protocol的Auction产品,以及其背后的价值支撑

加密眼界

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413解决方案

百度搜索:蓝易云

原生鸿蒙政务行业应用开发模板上线,近200个政务服务应用已上架

最新动态

七招提升工作效率

俞凡

生产力

为中小企业量身定制的云会议!华为云Flexus版云会议亮相828

轶天下事

可能是全网第一个MySQL Workbench插件编写技巧

LLLibra146

Python MySQL

革新农业未来!Dimitra生态币价双双腾飞在即

股市老人

MySQL修改时间添加时间自动更新

百度搜索:蓝易云

NocoBase 本周更新汇总:提升工作流易用性

NocoBase

开源 低代码 零代码 无代码 版本更新

PHP中哪个框架最适合做API?

科普小能手

php API PHP框架 PHP开发 API 接口

30 秒!用通义灵码画 SpaceX 星链发射流程图

阿里云云效

阿里云 云原生

双十一轻松实现云上高效沟通!华为云Flexus云会议实测体验领先

轶天下事

重新理解RocketMQ Commit Log存储协议

百度搜索:蓝易云

vLLM×Milvus:如何高效管理GPU内存,减少大模型幻觉

Zilliz

Milvus LLM vLLM PagedAttention

极速启动,函数计算弹性降本能力再升级

阿里巴巴云原生

阿里云 云原生 函数计算

双十一低成本上车!详谈华为云Flexus云会议为我们中小企业带来了什么

轶天下事

一文读懂Pencils Protocol的Auction产品,以及其背后的价值支撑

大瞿科技

如何快速制作精美ppt图表?详细的保姆级教程来了!

职场工具箱

效率工具 职场 PPT 可视化分析 AI生成PPT

PHP通过pem文件校验签名异常

百度搜索:蓝易云

全球司库|规划与创新创景:引领业务、高效运营、战略增值

用友智能财务

金融 科技 企业数智化 司库

30 秒!用通义灵码画 SpaceX 星链发射流程图

阿里巴巴云原生

阿里云 云原生

多源异构数据源融合怎么做?Join操作篇(2)

RestCloud

数据分析 join ETL 多源异构数据融合

哪些技术项目管理工具最适合开发团队?9大推荐

爱吃小舅的鱼

技术项目管理工具

php循环读取txt里面关键词并按页数

百度搜索:蓝易云

润开鸿骆敏清:软件定义新“智” 硬件,以开源鸿蒙发行版驱动行业顶层创新

科技热闻

项目变更管理必备技巧:4大实践策略助力成功

爱吃小舅的鱼

项目管理 项目变更 项目变更管理

一文读懂Pencils Protocol的Auction产品,以及其背后的价值支撑

股市老人

鸿蒙NEXT开发案例:光强仪

zhongcx

双十一企业协作效率再升级!华为云Flexus版云会议299元_年起

轶天下事

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