Scala 如何在遵守不变性和;规则“;函数式编程?
各位 实现类似注册表的最合适的方法是什么Scala 如何在遵守不变性和;规则“;函数式编程?,scala,design-patterns,functional-programming,immutability,catalog,Scala,Design Patterns,Functional Programming,Immutability,Catalog,各位 实现类似注册表的最合适的方法是什么 trait Registry { def registerComponent( name: String, obj : Any ) : Unit def getComponent( name: String ) : Any def unregisterComponent( name: String ) : Unit } 遵循功能模式。(如不变性等) 我想到的是 State Monad:其中Monad的状态表示注册的对象(如Seq或类似)
trait Registry {
def registerComponent( name: String, obj : Any ) : Unit
def getComponent( name: String ) : Any
def unregisterComponent( name: String ) : Unit
}
遵循功能模式。(如不变性等)
我想到的是
- State Monad:其中Monad的状态表示注册的对象(如
或类似)Seq
- Builder-(like)-Pattern,但将当前注册表上下文从一个Builder步骤复制到下一个步骤
case class Registry(registered: Map[String, Any]) {
def register( name: String, obj: Any ) : Registry = {
copy( registered = this.registered + ( name -> obj) )
}
def unregister( name : String ) : Registry = {
copy (registered = this.registered.filterKeys( !_.equals(name)))
}
// How to deal with return values????
// Tuple return is quite ugly
//
def getComponent( name: String ) : (Registry, Option[Any]) = {
(this, registered.get( name ) )
}
}
哪些其他解决方案/模式是合理的或可用的
干杯
如果您想将注册表保存在内存中,MartinState Monad看起来是最合适的选择。它看起来与您编写的Builder实现类似,但将以功能更强大或语法噪音更小的方式传递上下文/注册表 如果您想将副作用推送到程序的边界,但仍然有副作用,如将注册表保存在数据库或某些可变结构中,那么您可以使用Reader Monad
这是一篇关于Scalaz的好文章,首先讨论了状态的问题,然后展示了如何使用状态单元格。< /P>你认为如何以及在哪里使用这个注册表?里面有什么?谁调用这些方法,谁创建注册表实例?也许你只是想要全局可变状态。二,。作为一些较大例程的上下文,注册表保存元信息。3.四,。我调用注册表并触发注册表的创建。备注:只是想避免可变状态。您是指那些例程周围的上下文,还是那些例程内部的上下文?可以从这些例程中访问的上下文。这些例程可能希望改变上下文,或者只访问它(
getComponent()
)?如果你能举一个简单的例子来说明你在处理易变性,这可能会很有帮助。Aleksey,关于状态和读卡器或IO monad,你是绝对正确的。尽管如此,我还是对已经证明自己的其他方法、模式或最佳实践感兴趣。