在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

如何进行大规模重构

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

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

关注

评论

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

“敏捷教练进阶课程”2024年4月26-27日 · A-CSM认证在线

ShineScrum

ChatGPT加持,需求分析再无难题

测试人

人工智能 软件测试 ChatGPT

开源语言大模型

百度开发者中心

人工智能 机器学习 大模型

LLama2大模型指令微调实操:解锁AI生成文本的新境界

百度开发者中心

人工智能 机器学习 大模型 llama2

硬件标准化之道:Linux社区与硬件厂商的协同创新

GousterCloud

硬件 Linux Kenel 设备

《射雕》热度不减!英特尔锐炫A750亮眼帧率展现高性价比优势!

E科讯

怎么用OpenAI Sora?最全分析-新手小白必看

蓉蓉

openai ChatGPT sora

9 年蝉联 IM 第一!艾瑞咨询发布最新报告,融云持续引领专业通信云行业

融云 RongCloud

融云荣获 ToB 行业头条「实力先锋企业」

融云 RongCloud

行云绽放与瀚高完成兼容性认证,携手推进国产化进程

行云管家

信创 堡垒机 国产化 瀚高

目前拉萨等保测评公司有几家?在哪里?

行云管家

等保 等保测评 拉萨

详解从ERP传到MES系统的数据

万界星空科技

系统集成 ERP 生产管理系统 mes

阿里云首个 AI 员工入职,围观开发工程师使用反馈

阿里云云效

阿里云 Serverless 云原生 通义灵码

有手就会?记一次绕过防重放的漏洞挖掘

权说安全

漏洞挖掘

阿里云ACK One GitOps:轻松实现多团队多集群应用交付

阿里巴巴云原生

阿里云 云原生 容器服务

万界星空科技MES系统对生产追溯的好处

万界星空科技

生产管理系统 mes 万界星空科技 生产追溯 追溯管理

DevOps已死?2024年的DevOps将如何

禅道项目管理

程序员 DevOps 自动化测试 知识分享

一站式解读多模态——Transformer、Embedding、主流模型与通用任务实战(上)

飞桨PaddlePaddle

百度 BAIDU 百度飞桨 多模态 多模态学习

ChatGPT加持,需求分析再无难题

测吧(北京)科技有限公司

测试

你的代码是干的还是湿的?

敏捷开发

项目管理 敏捷开发 代码 代码人生 bug管理

阿里云首个 AI 员工入职,围观开发工程师使用反馈

阿里巴巴云原生

阿里云 AI 云原生 通义灵码

不惜血本、重金打造的数据平台为何效果平平?

feng

数据平台 企业数据化运营

避雷指南:11个常见 Kubernetes 误区详解

SEAL安全

Kubernetes 容器 云原生

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