【问题标题】:Why does splitting one class into two improve testability?为什么将一个类分成两个会提高可测试性?
【发布时间】:2018-02-02 01:16:21
【问题描述】:

我正在阅读 Paul Chiusana 的《Scala 中的函数式编程》一书。

它给出了一个不纯函数的例子:

class Cafe {
  def buyCoffee(cc: CreditCard): Coffee = {
    val cup = new Coffee()
    cc.charge(cup.price)
    cup
  }
}

作者认为 cc.charge() 调用有副作用,因此代码难以测试。

然后建议一个更好的方法为:

class Cafe {
   def buyCoffee(cc: CreditCard, p: Payments): Coffee = {
    val cup = new Coffee()
    p.charge(cc, cup.price)
    cup
   }
}

作者辩称:“虽然我们调用 p.charge(cc, cup.price) 时仍然会产生副作用,但我们在 至少恢复了一些可测试性。支付可以是一个接口,我们可以写一个mock 适合测试的接口的实现。”

但我们也可以为第一个实现提供类似的基于接口的方法。那么第二种方法如何更好呢?

【问题讨论】:

  • 不要过多看这个例子。你说得有道理,但即使承认这一点,作者仍然说还有更好的东西。
  • 我看到你也在 users.scala-lang.org 上问过这个问题。如果您要在 Internet 上的两个不同地方提出相同的问题,则最好包含来回链接,以免有人在一个地方浪费时间重复您在另一个地方已经获得的信息。跨度>
  • users.scala-lang.org 帖子是users.scala-lang.org/t/impure-functions/2242

标签: scala functional-programming


【解决方案1】:

我认为您获得的只是粒度。如果角色完全分离,则只为需要模拟的内容编写模拟会更容易 - 如果CreditCard 类型既代表信用卡信息并且执行收费,那么你必须模拟它的一半责任,这似乎有点尴尬。相比之下,当你分离类型时,CreditCard 可以只是一个愚蠢的案例类,而Payments 可以是你完全模拟的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2011-04-27
    • 2023-04-09
    • 1970-01-01
    • 2021-12-01
    • 2010-12-09
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多