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

测试驱动开发与遗留代码的问题

  • 2009-11-21
  • 本文字数:1633 字

    阅读完需:约 5 分钟

Allan Baljeu 试图在他庞大的、C++ 遗留代码库中使用 TDD,结果遇到了很大的麻烦,因为:

我们后来得到的类不能完全实现希望其具备的功能,当有人使用这些类时,会想要得到更加完整的实现,然而却会发现原有的设计不够完善,要进行新的设计,有些期望(测试)要做出改变,而之前对这些类的使用也得调整。

他在思考前期大规模设计(BDUF)也许有助于解决这个问题。 George Dinwiddie 敏捷教练,他认为Alan 的设计是在试图告诉他些什么。人们必须要注意“干净代码(clean code)”的基本原则,要注意基本的内聚和耦合性方面的问题(比如 SOLID 原则)。

Mike “Geepaw” Hill 也是 Agile Coach ,他提到:在他指导敏捷团队的这些年来,下列原因之一可能是类似问题的根本原因:

  • 团队在重构方面做得不够,因此你的类没有做到最小化。
  • 团队在“尽量简单”方面的技能还不够,同样如此。
  • 团队还没有采取具备侵略性和快速度的微测试(microtesting,也就是 **单元测试),所以改变常常会破坏测试 **
  • 团队不知道如何处理跨团队、或是公司对公众之间的依赖,比如公布 API 的情况
  • 团队既没有结对,也没有在开放空间中工作,这极大降低了团队层面的知识理解和传递
  • 团队似乎没有具备快速构建的能力
  • 团队可能还在使用老古董级别的工具

Keith Ray 极限编程教练,他提出:有了遗留代码(也就是欠下很高技术债的系统),实现一个故事的成本完全取决于偿还技术债的成本。接下来,他提出一种解决方式:

要让代码的结构更好(偿还技术债务),不管什么时候,当你需要集成一个新功能时,你应该同时注意新旧代码中的异味,并在发现异味时,马上重构,消除异味。 你可以手工采取小而安全的步骤进行重构(即使使用 C++)。要紧跟 Martin Fowler《重构》一书中的步骤,除非你能做到得心应手。带有 gcc 的 Eclipse 有些重构功能可以使用:“抽取方法”和“重命名”。“重命名”能够知道命名所在的范围,所以要比查找和替换更为安全。“抽取方法”和其他的重构功能可能有 bug,使用它们的时候要小心。像改变函数签名这样的东西,“依靠编译器”能够展示出哪里需要改变。

你还需要测试来保证没有破坏现有功能。Michael Feather 的《修改代码的艺术》提供了很多向遗留代码中加入测试的技巧。从更高层面来看,代码异味是破坏优秀设计原则的表现。举例而言:单一职责原则(SRP)认为:每个类、方法、模块只应该有一个意图。还有些原则是与耦合、内聚和管理依赖关系相关的。相比使用这些抽象原则,发现代码异味常常更为容易。“大类”和“大方法”可以通过“抽取类”和“抽取方法 / 移动方法”修改,不过知道 SRP 有助于判断抽取类或方法的哪一部分。

也许“告知,不要询问”是最重要的设计原则:不要分离功能和数据……恶劣的代码常常把功能实现放在一个地方,从其他地方得到需要的数据,这就造成了依赖性方面的问题,同时代码缺少局部性(locality)。其症状就是:“添加一个新功能,要修改多处代码。”代码异味“散弹枪式手术”、“依恋情结”、“参数列表过长”都是这样造成的。

尽快得到反馈能带来更多重构,这最终将会加快新功能的开发。尝试进行并行构建(分布式编译),尝试让源代码文件和头文件更小,降低头文件的复杂度——可使用前向声明、避免内联代码、尝试让每个类只有一个头文件 / 源代码文件。大量使用“指向实现的指针(pimpl idiom)”能降低 10% 的编译时间,但是也可能把“大类”和“依恋情结”这样的代码异味给隐蔽起来。

重构要比重写更好,其优势在于:你总是有可工作的代码。如果你的手工和自动化测试都很好,那你就可以交付代码了,即使目前的状态处于“优秀设计”和“恶劣设计”之间。

Keith 还写了“ Refactoring: Small Steps Guaranteed to Help You Clean Up Your Code ”,该文章发表于 Better Software Magazine,讲述如何重构 C++ 代码。

InfoQ 之前的相关内容:《如何处理遗留代码》《Bob 大叔谈测试驱动开发的适用性》《如何坚持TDD:使用者出现的问题以及解决方案》

查看英文原文: Test Driven Development and the Trouble with Legacy Code

2009-11-21 05:312293
用户头像

发布了 479 篇内容, 共 183.4 次阅读, 收获喜欢 53 次。

关注

评论

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

从痛点到转型:天润融通ZENAVA如何重塑酒店售前咨询

天润融通

Nginx的请求处理

天翼云开发者社区

网络 全站加速 API网关

可信AI存储引热议,金融架构师聚焦稳定性、性能与高可用三大挑战

极客天地

多RID分层路径计算性能优化

天翼云开发者社区

CDN API网关

openresty中使用ngx.sleep(0)防止worker进程阻塞

天翼云开发者社区

API网关

JNPF V6.1重磅发布!颠覆传统,重塑开发效率!

引迈信息

顶会论文解读:时序数据库 Apache IoTDB 中的时序数据压缩优化【VLDB 2025】

Apache IoTDB

微擎:数字化转型的普惠引擎,破解商户经营三大核心命题

微擎应用市场

鸿蒙生态突飞猛进,极验如何牢筑业务安全防线?

新消费日报

华强筑链*昇腾万里|华为&华强半导体2025昇腾AI技术研讨会·深圳站成功举办

极客天地

AI时代下,程序员的发展与进阶

Comate编码助手

程序员 程序员发展 AI 编程 文心快码 AI编程助手

测试同学要求我们产品写用例,然后你们照着测?

测试人

API 管理平台的核心功能有哪些?企业该如何选型?

谷云科技RestCloud

数据安全 API网关 集成平台 API管理 ipaas

过程管理系统

深圳亥时科技

从ROI到战略收益:天润融通告诉你客户联络AI化带来的真实价值

天润融通

用代码书写浪漫,网友直呼“太美了”!

王磊

告别 “盲买”!京东 AI 试穿 Oxygen Tryon:让服饰购物从“想象”到“所见即所得”

京东零售技术

CDN动态加速路径计算集群间数据同步优化方法

天翼云开发者社区

CDN 全站加速

端到端短视频多目标排序机制框架EMER详解

快手技术

推荐算法 大模型 快手 生成式AI

SD-WAN如何帮助公司进行网络升级?

光联世纪

互联网 科普 交流 SD-WAN组网

我们与恶的距离,只隔着一个谄媚的AI

脑极体

AI

PAI-DLC 支持一键提交 DataJuicer 任务,高效进行大规模多模态数据处理

阿里云大数据AI技术

阿里云 模型训练 PAI 多模态数据处理

阿里云 OceanBase 可观测最佳实践

观测云

阿里云

志愿者招募 | 一起为 2025 龙蜥操作系统大会“打 call”

OpenAnolis小助手

AI 操作系统 龙蜥操作系统大会

当Dify遇见Selenium:可视化编排UI自动化测试,原来如此简单

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

2025 ChatBI 爆火,Aloudata Agent 重构智能数据分析决策范式

Aloudata

数据分析 agent ChatBI 智能问数

AI驱动的测试:用Dify工作流实现智能缺陷分析与分类

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

云栖实录|智能哨兵:AI驱动的云平台风险巡检

阿里云大数据AI技术

阿里云 智能运维 大数据AI

mul 与 reduce_sum 的优化实例

地平线开发者

自动驾驶 算法工具链 地平线征程6

BOE(京东方)“百堂故宫传统文化公益课”暨2025照亮成长路收官 推动“科技+教育+文化”可持续发展

爱极客侠

达梦数据库到Greenplum:用ETL工具实现数据仓库迁移

谷云科技RestCloud

greenplum 数据同步 ETL 数据集成平台 达梦数据库

测试驱动开发与遗留代码的问题_研发效能_Mark Levison_InfoQ精选文章