【发布时间】:2014-06-07 02:42:44
【问题描述】:
想要重构我刚刚遇到的这个面向对象的代码。代码的作者说 MySave 类仅作为 keys 和 inserts 地图的占位符创建。
MySave 类的客户端总是根据每个请求创建 MySave 的新实例,并使用 add() 方法填充键和插入地图。
然后另一个函数将使用 MySave() 的 keys 和 inserts vals 从相应的地图中检索这些值,然后将它们发送到持久层等。
即使在这种 OO 设计中已经存在缺陷(例如,尽管当前的用法是为每个新请求创建 MySave 对象,但以下设计并不能阻止仅创建单个类实例并使用共享状态产生线程安全问题,并且它通过公共vals 等泄漏共享状态。我不想修复 OO 设计,而是想将其转换为功能代码。
在转换为 FP 范式时,您的方法是什么?我刚刚开始了解 Scalaz 状态 monad,但这听起来像是这个 OO 代码的一个很好的 FP 替代方案,还是比这更微不足道的东西可以工作?
class MySave {
val keys = mutable.Map[Entity Int]()
val inserts = mutable.Map[Entity, String]()
def add(d: Entity, value: String): \/[Throwable,Unit] = {
//this is a side effecting method which either updates `keys` or `inserts` map
// by simply reassigning `keys` or `inserts` vars e.g. keys += d ->value
}
}
【问题讨论】: