写点什么

如何进行大规模重构

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

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

关注

评论

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

磁盘有限,Docker 垃圾很多怎么办

newbe36524

C# Docker Kubernetes

全国独家线下面授 | 北京大规模敏捷LeSS认证5月18-20日开班

ShineScrum

less 大规模敏捷

MySql基础-笔记12 -重复数据处理、SQL注入、导入导出数据

MySQL 数据库

10 个值得掌握的 reduce 技巧

devpoint

JavaScript reduce 数组方法

2023年Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)【建议收藏】

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

用reduce高阶函数组装查询表单分隔字符数据

咖啡教室

自动化测试概况和认知

自动化测试 测试工具

降本提效 | AIRIOT设备运维管理解决方案

AIRIOT

物联网 设备运维

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。

王中阳Go

Go golang 架构 高并发 秒杀

Zebec官方辟谣“我们与Protradex没有任何关系”

股市老人

Python json中一直搞不清的load、loads、dump、dumps、eval

Python json 字符串

【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」抽丝剥茧贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)

码界西柚

RocketMQ 消息队列 源码解析 原理解析

fl studio21中文版免费的音乐编曲制作软件

茶色酒

FL Studio21

【FAQ】获取Push Token失败,如何进行排查?

HarmonyOS SDK

HMS Core

2023-02-22:请用go语言调用ffmpeg,保存mp4文件的视频帧,每帧用ppm图片保存。

福大大架构师每日一题

golang ffmpeg 福大大

toFixed和Math.round既不是四舍五入也不是银行家舍入法

咖啡教室

ABBYY FineReader16永久版图片文字识别软件

茶色酒

ABBYY FineReader16

推荐系统[三]:粗排算法常用模型汇总(集合选择和精准预估),技术发展历史(向量內积,Wide&Deep等模型)以及前沿技术

汀丶人工智能

推荐系统 推荐算法 搜索系统

K8S发布应用步骤详解

tiandizhiguai

云原生 k8s

模块七作业

张贺

架构训练营

3 个加强理解TypeScript 的面试问题

devpoint

JavaScript typescript ES6 前端面试

WebUI自动化中截图的使用

Python 自动化测试 unittest 截图

阿里云ECS TOP性能提升超20%!KeenTune助力倚天+Alinux3达成开机即用的全栈性能调优 | 龙蜥技术

OpenAnolis小助手

ECS 龙蜥社区 KeenTune 云场景 全栈性能调优

好用的录屏工具值得免费拥有

穿过生命散发芬芳

录屏工具

Zebec生态持续深度布局,ZBC通证月内翻倍或只是开始

股市老人

CleanMyMac2024免费版系统清理优化软件

茶色酒

CleanMyMac X CleanMyMac2024

秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进

TiAmo

算法 回溯算法 动态回溯算法

Python写入csv出现空白行,如何解决?

Python csv 数据读写

【深度挖掘RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行调度的流程(Pull模式)

码界西柚

RocketMQ 消费原理 运行机制 源码实现

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