点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

TDD 会破坏架构吗?

  • 2017-04-05
  • 本文字数:1157 字

    阅读完需:约 4 分钟

作为敏捷宣言的共同作者,我们熟知的鲍勃大叔 Bob Martin,在最近发表的一篇文章中对 TDD 是否会损害架构进行了评估。文中大部分讨论围绕着遵循测试驱动方法对高层设计和实现代码的总体可维护性是否会产生消极影响。Martin 认为,虽然 TDD 是重要的守则,但良好的设计来源于解耦、分离和隔离等原则。

Ruby on Rails 的作者 David Heinemeier Hansson 曾发表过一篇有关测试破坏了设计的文章。Martin 对此观点作了进一步探索。这篇文章基本上是对以下两种设计进行比较,其一是 Hansson 所倡导的设计,另一个则是 Ruby 的贡献者和布道者 Jim Weirich 所倡导的更易于测试的设计。Martin 鼓励读者选择更适合自己的设计,并写道:

  • 争论的焦点在于隔离性和间接性。 DHH 的优秀设计理念最小化了上述两点,而 Weirichdd 设计则将这两点最大化。

Martin 还撰写了一篇测试脆弱性问题。文章中提到对实现代码的细微改动都可能会对数以百计的相关测试用例造成影响,从而不得不把它们全部更新。

Martin 在阐释他的观点时首先指出,不论是否遵循了 TDD,测试代码都需要像产品代码那样精心设计:

  • 应用在测试上的设计原则应当和普通代码一样多。测试是系统的一部分,必须和系统中的其他部分那样维持相同的标准。

Martin 还解释道,对 TDD 的一个常见误区就是测试和实现是一一对应的。这可能意味着一个实现类对应一个测试类,一个实现方法对应一个测试方法。这种做法的不足之处主要在于,它将测试和实现紧紧绑在了一起,导致很难进行重构和梳理。

Martin 认为高层架构和设计不会从 TDD 中浮现:

  • 坦白讲,系统的高层设计和架构会从 TDD 中浮现这一说法听起来很荒谬。在动手编码之前,你就应当对软件项目具备一定的架构视野。而这是 TDD 无法带给你的。

另一方面,Martin 认为那些实现代码级别的低层设计确实来源于 TDD 的实践过程。换句话说,在测试代码保持不变的同时,实现代码可以进行重构和结构化,使得代码更具有可维护性。Martin 认为这会导致事物向两个方向发展:“一方面测试变得越来越具体,另一方面产品代码则越来越通用。”

除了这些差别之外,Martin 坚信 TDD 是一条守则。不管是否实践 TDD,开发者本身才能决定良好的设计:

  • TDD 不会导致坏的设计,也不会导致好的设计。开发者才是设计好坏的决定因素。TDD 只是一条守则,是组织工作的方法,是确保测试覆盖率的途径,是在应对特殊性的同时确保适当通用性的手段。

Martin 的观点总结起来就是,TDD 产出的设计事实上就是开发者的设计。TDD 的主要优势在于测试覆盖率和应用程序的可靠性。真正良好的设计来源于解耦、分离和隔离等原则。

查看英文原文 Does TDD Harm Architecture?


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-05 19:003098

评论

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

年初入职 字节跳动 的Java面试经验分享(文档)

Java 程序员 后端

强烈推荐10本程序员必读的书

Java 程序员 后端

实战:第十一篇:StringRedisTemplate获取redis信息

Java 程序员 后端

实时数据库 架构图

Java 程序员 后端

将项目转成MAVEN项目

Java 程序员 后端

已开源!阿里巴巴SpringCloud微服务原理与架构项目实战,请签收

Java 程序员 后端

干货第一弹-教你如何利用阿里开源工具进行排查线上CPU居高问题

Java 程序员 后端

年前三面美团百度挂了,疫情间啃完阿里面试宝典,成功斩获offer

Java 程序员 后端

开发新人有必要考虑在工作一年后跳槽

Java 程序员 后端

开源爆款,阿里P7技术笔记《k8s+docker》

Java 程序员 后端

Kubernetes 给容器化部署和管理带来的好处

后台技术汇

Kubernetes 11月日更

工作三年的Java程序员应该达到什么水平?

Java 程序员 后端

架构实战营 - 第三期 - 模块三作业

lucian

架构实战营

开发进阶加薪利器:美团架构师最新版的深入理解JVM底层和源码PDF

Java 程序员 后端

开发十年面试过1000个人,总结出这份高薪Java 面试秘诀

Java 程序员 后端

异步编程的取消机制 竟然还有这样的效果, 要不要了解一下?

Java 程序员 后端

当场折服,这份阿里P8大牛给我的JUC知识总结真的超详细

Java 程序员 后端

实战spring自定义属性(schema)

Java 程序员 后端

实现一个百万级推送服务,除了它,还有谁

Java 程序员 后端

将CSV的数据发送到kafka(java版)

Java 程序员 后端

带你了解代理模式

Java 程序员 后端

应届生想要找到一份Java开发的工作,需要达到什么水平?

Java 程序员 后端

开发做了一两年了,感觉遇到了瓶颈,公司已经学不到太多东西,如何成长为技术大牛

Java 程序员 后端

应用服务器集群的Session管理

Java 程序员 后端

架构实战营 - 第三期 - 模块三作业

岚哲

极客时间 架构 架构实战营

常见的社会潜规则有哪些?

Java 程序员 后端

幸亏有了这本623页的微服务框架实战笔记,一举拿下腾讯美团滴滴offer

Java 程序员 后端

应云而生,幽灵的威胁 - 云原生应用交付与运维的思考

Java 程序员 后端

张总:“必须要裁掉那些老家伙”中年程序员真的只能坐等被裁吗?

Java 程序员 后端

常见的SQL面试题:经典50例

Java 程序员 后端

干掉GuavaCache:Caffeine才是本地缓存的王

Java 程序员 后端

TDD会破坏架构吗?_语言 & 开发_Andrew Morgan_InfoQ精选文章