写点什么

如何进行大规模重构

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

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

关注

评论

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

iOS面试--拼多多最新iOS开发面试题

一意孤行的程序员

ios swift 面试 ios开发 知识分享

GitHub开源的AI下五子棋

不脱发的程序猿

人工智能 GitHub 开源 AI 五子棋

「技术人生」第2篇:学会分析事物的本质

阿里巴巴中间件

技术 工具 技术人 技术人生 一号位

记十亿级Es数据迁移mongodb成本节省及性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

网络攻防学习笔记 Day24

穿过生命散发芬芳

5月日更 网络攻防

ETL-KETTLE工具使用

this

Java 数据 数据同步 ETL

这么狠,私塾在线架构师系列课程全都免费发放

InfoQ_d2212957090d

Java

首届HarmonyOS开发者创新大赛颁奖典礼于深圳召开

科技汇

字节跳动Java岗一二三面全经过分享

北游学Java

Java 字节跳动 面试

技术干货 | 基于MindSpore更好的理解Focal Loss

华为云开发者联盟

函数 mindspore Focal Loss 样本

M1 Dock智能硬件环境搭建(MaixPy安装及使用)

不脱发的程序猿

人工智能 开发板 智能硬件 AIOT M1 Dock

「DataPipeline」完成数千万B轮融资,加速构建中国的世界级数据中间件产品

DataPipeline数见科技

融资

并发王者课 - 青铜 3: 双刃剑-理解多线程带来的安全问题

MetaThoughts

Java 多线程 并发 王者并发课

Hive窗口函数与分析函数

大数据技术指南

hive 5月日更

做一次黑客,入侵一次服务器

叫我阿柒啊

Docker 入侵 docker远程 redis注入

每个开发人员都应该知道的 10 个 GitHub 仓库

LeanCloud

GitHub web开发

☕【JVM技术之旅】你真正掌握了Java对象创建的流程吗?

码界西柚

JVM java对象分析 java对象 对象创建 5月日更

云小课|聊一聊DRS的数据过滤特性

华为云开发者联盟

数据库 DRS 数据复制服务 数据过滤 数据库引擎

2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯

CODING DevOps

DevOps CI/CD

极光开发者周刊【No.0521】

极光GPTBots-极光推送

MindSpore:不用摘口罩也知道你是谁

华为云开发者联盟

算法 人脸识别 口罩 mindspore 口罩人脸

新思科技为中兴通讯提供BSIMM软件安全评估

InfoQ_434670063458

5G 新思科技 中兴 软件安全 BSIMM

2021年中国信创生态报告发布 指引未来信创产业发展

融云 RongCloud

Nginx的11个执行阶段详解

运维研习社

nginx 运维 源码剖析 5月日更

阿里P9架构师强烈推荐:想拿60W以上年薪必看,Java高并发四套小册。

Java架构追梦

Java 阿里巴巴 架构 面试 高并发

Spark知识点简单总结

五分钟学大数据

大数据 spark 5月日更

我粉了!阿里大牛从内部带出来的百亿级高并发系统,从基础到实战、面面俱到

Java 程序员 架构 面试

WizTree——一个扫描快似Everything的硬盘空间分析工具

吴脑的键客

DevOps windows

LRU 和 LFU

且听且吟

BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点

不脱发的程序猿

图像格式

玩转直播系列之消息模块演进(3)

vivo互联网技术

Java 服务器 消息系统 直播技术

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