【发布时间】: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