Folks,
实现像这样的注册表最合适的方法是什么
trait Registry {
def registerComponent( name: String, obj : Any ) : Unit
def getComponent( name: String ) : Any
def unregisterComponent( name: String ) : Unit
}
遵循功能模式。(例如不变性等(
我想到的是
- State Monad:其中Monad的状态表示已注册对象(如
Seq
或类似对象( - Builder-(类似(-Pattern,但将当前注册表上下文从一个构建器步骤复制到下一个
例如:注册表遵循类似生成器的模式:
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 ) )
}
}
哪些其他解决方案/模式是合理的或可用的?
干杯,
Martin
State Monad如果您想将注册表保存在内存中,看起来是最合适的。它看起来类似于您编写的Builder实现,但将以更具功能性或更少语法噪音的方式传递上下文/注册表。
如果您想将副作用推到程序的边界,但仍有副作用,如将注册表保存在数据库或某些可变结构中,则可以使用ReaderMonad。
这里有一个关于Scalaz的好文章的链接,该文章首先讨论了状态问题,然后展示了如何使用state monad。