写点什么

如何进行大规模重构

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

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

关注

评论

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

内部im聊天,实现企业安全私密聊天

BeeWorks

即时通讯 IM 私有化部署 企业级应用

成功案例丨新一代热管理:预测并降低热风险,避免代价高昂的过度设计和组件故障

Altair RapidMiner

仿真 CAE hyperworks Simlab PSIM

从数字化到智能化,百度 SRE 数智免疫系统的演进和实践

Baidu AICLOUD

SRE

通过利益相关者管理提升财务规划的发展可持续性

智达方通

全面预算管理 财务管理 财务转型

[方式举例]快速把电脑excel电子表格联系人号码一键批量导入手机通讯录里

一码平川

Apache IoTDB V2.0.2/V1.3.4 发布|新增表模型权限管理、UDF、嵌套查询功能

Apache IoTDB

使用Gone MCP 组件编写MCP Server

大鹏

golang MCP Gone依赖注入

教你几招判断LED显示屏的好坏

Dylan

LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家 户内led显示屏

在 Amazon Graviton 上运行大语言模型:CPU 推理性能实测与调优指南

亚马逊云科技 (Amazon Web Services)

CFD专栏丨空调管路流动噪声LBM仿真

Altair RapidMiner

CAE Hypermesh CFD 流体仿真 振动噪声

ScaleFlux入选CRN【2025存储百强】榜单

ScaleFlux

NVMeSSD 企业级存储 硬件存储

Spine 动画教程:皮肤制作

北桥苏

动画制作 Spine

【转】 FMEA

虚实的星空

Hume 推出 Octave TTS 即时模式,250 毫秒响应;客服语音智能体 Sona:简单集成、高度自定义丨日报

声网

探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”

程序员洲洲

[方法分析]如何把大批量电话号码存入到手机通讯录,导入华为手机、小米手机、苹果iphone通讯录

一码平川

鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解

威哥爱编程

HarmonyOS HarmonyOS NEXT HarmonyOS5.0

利用DevEco Profiler定位性能瓶颈,优化资源占用

威哥爱编程

HarmonyOS HarmonyOS NEXT HarmonyOS5.0

国际知名半导体研究机构SemiAnalysis称:华为云CloudMatrix 384领先英伟达和AMD的产品一代

极客天地

.NET Core 服务实现监控可观测性最佳实践

观测云

.net core

SQL优化的这15招,真香!

量贩潮汐·WholesaleTide

数据库 sql

Arthas tt(方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)

刘大猫

Arthas java 阿里监控 tt 时空隧道

企业内部即时通讯软件有哪些?这款IM工具值得拥有

BeeWorks

即时通讯 IM 私有化部署

豆包 1.5 · 深度思考模型上线边缘大模型网关,百万 Tokens 免费领

火山引擎边缘云

深度思考 火山引擎 豆包 边缘智能

邮件自动回复助手(Rasa/SMTP)实现教程

不在线第一只蜗牛

前端 教程 邮件

Sentinel源码—ProcessorSlot的执行过程(二)

电子尖叫食人鱼

JavaScript

RAG 实战|用 StarRocks + DeepSeek 构建智能问答与企业知识库

StarRocks

数据库 数据检索 StarRocks ;RAG DeepSeek

Apipost自动化测试实战:用户充值系统API零代码高效测试与CI/CD集成全攻略

数据追梦人

《Operating System Concepts》阅读笔记:p735-p737

codists

操作系统

为什么科技巨头纷纷推出编程 Agent?背后是一场关于“生存方式”的重构

Ryan Zheng

秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全

数据追梦人

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