【发布时间】:2017-05-29 08:43:15
【问题描述】:
我有一个项目,我正在实施自动售货机。我有一个对象 VendingMachine,里面有另一个对象,叫做 CoinOp。我希望 CoinOp 对象接受各种价值的硬币。 VendingMachine 可以要求 CoinOp 告诉它用户输入了多少钱。为了让它真正发挥作用,CoinOp 必须能够改变它里面的货币数量。
自动售货机看起来像这样:
class VendingMachine {
val coinOp = new CoinOp()
}
我想以一种功能性的方式来做这件事,它会立即删除 CoinOp 的这个实现作为一个选项:
class CoinOp {
var money = 0.0f
def addCoins(amount: Float) = money += amount
}
相反,我需要做这样的事情:
case class CoinOp(money: Float) {
def addCoins(amount: Float): CoinOp = CoinOp(money + amount)
}
我知道我可以使用 scalaz 来做这样的事情。 scalaz 中的实现并不是这个问题的真正重点。
我的问题是:鉴于我可以在功能上更新 CoinOp 拥有的金额,我如何显示发生变化的 VendingMachine?
在 addCoins 中创建新的 CoinOp 对象非常棒,但它是一个新对象,它不会改变 VendingMachine 引用的对象。这是良好的持久性,都是函数式编程的一部分。但是,我需要 VendingMachine 使用 addCoins() 创建的对象,而不是类定义中的对象。我该怎么做?
我唯一能想到的就是将 VendingMachine 中的 coinOp 对象设为 var,然后我可以设置它以响应对 CoinOp#addCoins 的调用。但这对我来说似乎不是一个好的解决方案。
有人可以解释一下如何设置吗?
【问题讨论】:
-
看来您正在寻找 State Monad。
标签: scala functional-programming scalaz