FinOps有望降低企业50%+的云成本! 了解详情
写点什么

私有方法、测试驱动开发与优秀设计

  • 2008-01-08
  • 本文字数:1146 字

    阅读完需:约 4 分钟

有人说“TDD(测试驱动开发)可以带来优秀的设计”,也有人说“TDD 会对设计有负面影响”。如果有个具体例子的话,讨论起来会实际得多,所以下面我们来看一下私有方法以及它与优秀设计、可测试性的关系——这种对立观点的一个实例。

Szczepan Faber 在博客中写道,私有方法是一种反模式

自从 TDD 诞生之日起,私有方法似乎就有了坏味道。被测试浸染的开发者总想寻找测试私有方法的办法。嗯……这显然是很困难的,所以问题就从“如何”变成了“为何”:为何要测试私有方法?大多数 TDDers 都会立刻回答说:别这么干。于是 TDD 又改变了我们构建软件的方式,对私有方法进行了重新评估 :)

Jay Fields 在博客上描述了在 ruby 中测试私有方法的一种通用方式

……我很少测试私有方法。我更倾向于通过 public API 来进行测试。不过偶尔也有这种时候,如果你可以给一两个私有方法写点测试用例的话,日子就可以过的容易一些。

Michael Feathers 在去年的 The Deep Synergy Between Testability and Good Design 一文中指出,TDD 可以带来优秀的设计,而反过来想,那些不可测试的代码应该引起我们的深思:

在我编写测试时,如果觉得有强烈的冲动促使我去测试一个私有方法,我就会把它看作一种暗示。它告诉我,我的类已经被封装得趋近于封闭了,测试代码无法再通过公共接口来“理解”这个类的行为。我顺从了这个暗示的召唤,重新构建了代码。通常我都会把这个私有方法(可能还有一些相关的方法)挪到一个新的类里面,在那里它不再是私有,可以让测试代码访问。

以上种种想法,都倾向于不鼓励使用私有方法,在天平的可测试性一端加入更多砝码。但它们并不是唯一的声音。实际上在我们所能看到的有关面向对象开发的观点中,很多都是支持少用一些类,极尽所能使用封装。在 public API 中只暴露最小的 API 集合,就会将耦合降低到最小。David West 在 Object Thinking 一书中,引用了 Lorenz 和 Kidd 在 Object Oriented Software Metrics 书中的论述:

  • 一个应用程序应该最多包括 40 个故事,100 个类。
  • 应用程序所属的整个业务领域不应该需要超过 1000 个类来完成。
  • 每一次迭代后都该扔掉 25-30% 的代码。
  • 每个类的职责:平均是 7 个。
  • 每个类的方法数:平均是 12 个。
  • 每个方法的代码行数:平均是 15 个。
  • 需要进行注释的代码行数百分比:60。
  • case 语句的数量:平均为 0。

如果私有方法确实是坏味道,需要把它们挪到自己所应归属的类中,这不就是“为了让测试变得简单,而增加类的数量”么?它势必会造成类的数量急剧膨胀。

那么该拿私有方法怎么办呢?测试它们太折磨人了。我们可否修改一下,把它们暴露给测试代码?或者不去测试私有方法,让设计与可测试性永不相干?或者,私有方法是一种坏味道,它表明一个类做了太多事情?

查看英文原文 Private Methods, Test Driven Development, and Good Design

2008-01-08 23:01905
用户头像

发布了 197 篇内容, 共 50.5 次阅读, 收获喜欢 20 次。

关注

评论

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

白嫖!字节跳动 Java岗顶级面试解析(2023版),GitHub巅峰神作!

三十而立

袋鼠云春季生长大会最新议程来啦!4月20日我们云上见

袋鼠云数栈

大数据 数字化转型

分布式政企应用如何快速实现云原生的微服务架构改造

IT科技苏辞

华为云智能编程助手赋能高校,揭示行业发展新动向

爱尚科技

总结年初到 10 月底 Java 基础、架构面试题,共计 1327 道!涵盖蚂蚁金服、腾讯、字节跳动、美团、拼多多等等一线大厂!

三十而立

第二届“鼎新杯”数字化转型应用大赛申报通道正式开启

信通院IOMM数字化转型团队

数字化转型 鼎新杯

【Meetup回顾第1期】竟是这样的国产数据库,YashanDB技术内幕曝光

YashanDB

用低代码平台可视化设计表单

力软低代码开发平台

升级企业数智化底座,以技术重构企业发展力

用友BIP

技术大会 用友iuap 用友BIP 用友技术大会

爆肝一月!527页文档详解SpringCloud微服务和分布式系统实践

Java你猿哥

数据库 分布式 SSM框架 微服务设计

技术分享 | 如何迅速将分布式政企应用转型为云原生微服务架构

IT科技苏辞

SOA/ESB架构升级之路:从微服务到ServiceMesh,再到Sermant

IT科技苏辞

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年3月刊

墨天轮

MySQL 数据库 oracle postgresql 国产数据库

MobPush Android SDK 集成指南

MobTech袤博科技

2023最新整理上千道Java面试攻略,近500页PDF文档

会踢球的程序源

Java 面试 找工作 java面试 应届生

搭建数据驱动的技术底座,助力企业数智化变革

用友BIP

技术大会 用友iuap 用友技术大会 升级企业数智化底座

selenium源码通读·6 |webdriver/common/alert.py-Alert类分析

虫无涯

Python 源码 自动化测试 selenium

华为云智能编程助手助力哈尔滨工业大学(深圳)学子,引领软件研发新趋势

爱尚科技

2023 Java面试题短期突击攻略,已帮助400+位程序员成功拿到offer

小小怪下士

Java 程序员 面试 后端

低代码平台概念及实操

这我可不懂

低代码 应用开发 JNPF

全面拥抱Serverless,腾讯云大数据Elasticsearch开启云原生新范式

科技热闻

崖山科技通过CMMI3级认证,研发管理能力获国际权威认可!

YashanDB

Mysql分页 vs Oracle分页|非常详细,建议收藏

bug菌

MySQL oracle 三周年连更

五一临近,赋能乡村振兴,低代码也有话讲!

加入高科技仿生人

低代码 数字化 乡村振兴 乡村旅游

集简云软件连接器,实现业务流程自动化

集简云开放平台

低代码开发 低代码平台 数据集成平台

600+ 道 Java面试题及答案整理(建议收藏)

会踢球的程序源

Java 面试 java面试 应届生 Java八股文

华为云智能编程助手助力哈尔滨工业大学(深圳)培养新时代软件研发人才

爱尚科技

仅凭这份 Java 大纲笔记,我如愿拿到了阿里 offer。

三十而立

2023 寻找企业出海“新势力”

Jessie

企业出海 出海

阿里,快手,拼多多等 7 家大厂 Java 面试真题,Java 笔试题及答案详解

三十而立

听说谛听闹退休?感知网络接班啦!

白洞计划

感知网络

  • 需要帮助,请添加网站小助手,进入 InfoQ 技术交流群
私有方法、测试驱动开发与优秀设计_研发效能_Amr Elssamadisy_InfoQ精选文章