如何在遵守函数式编程不变性和"rules"的同时实现目录/注册表?



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。

相关内容

最新更新