【问题标题】:Questioning about Contra-variance in TDD质疑 TDD 中的逆变换
【发布时间】:2020-07-09 22:19:12
【问题描述】:

我目前正在学习 TDD,我想知道 Bob 叔叔关于与 TDD 相关的 refato step 的句子的真正含义。该主题讨论了 TDD 中的测试反方差,来自他的 Clean Coder 博客。

上下文: 假设我开始编写一个新类。称它为 X。我首先编写了一个名为 XTest 的新测试类。 随着我向 XTest 添加越来越多的单元测试,我向 X 添加了越来越多的代码,并通过从 XTest 调用的原始函数中提取私有方法来重构该代码。

然后我也必须重构测试。 (这是我误会的地方)

关于这一步,鲍勃叔叔说:

我研究了 XTest 和 X 之间的耦合,并努力将其最小化。我可以通过向 X 添加构造函数参数或提高传递给 X 的参数的抽象级别来做到这一点。我什至可以在 XTest 和 X 之间强加一个多态接口。

我的问题是: 如何识别耦合? 他所说的“将构造函数参数添加到 X 或提高我传递给 X 的参数的抽象级别”是什么意思?和“XTest 和 X 之间的多态接口”。

非常欢迎提供示例代码! :):)

相关博客文章的链接:https://blog.cleancoder.com/uncle-bob/2017/10/03/TestContravariance.html

提前致谢。

【问题讨论】:

    标签: unit-testing testing refactoring tdd contravariance


    【解决方案1】:

    如何识别耦合?

    从这个启发式开始:如果这里的更改要求您也在那里进行更改,那么您在两者之间存在耦合。

    耦合本身并不一定是坏事:我有很多十年前的代码与 java 集合库紧密耦合,而且这些代码很好。我不会被烧死,因为我耦合的东西是稳定的

    与不稳定的事物紧密耦合是一种悲惨的存在。

    当不稳定的东西是我们自己的代码时,我们有时可以通过改变我们的设计来解决问题,使耦合点变得稳定,而不是不稳定。

    广义地说,“他的意思是……”是在测试和测试对象之间建立稳定的契约。测试主体必须满足契约,但契约描述的是行为(你可以从黑盒子外面看到的)而不是实现。

    如果不是从“我需要 FooClass,因此需要 FooTest”开始,而是从“我需要 FooBehavior,因此需要 FooTest”开始;那么您就更接近于拥有一个错误检测器的目标,您可以在迭代该行为的实现时使用 unchanged

    另一方面,当行为本身不稳定时,这将无济于事。在这种情况下,您将需要其他技术。请参阅 Rich Hichey 的演讲 Spec-ulation,其中他谈到了吸积的力量。

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2011-08-11
      • 1970-01-01
      • 2017-03-13
      • 2020-08-01
      相关资源
      最近更新 更多