Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在遵守不变性和;规则“;函数式编程?_Scala_Design Patterns_Functional Programming_Immutability_Catalog - Fatal编程技术网

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 ) )
  }
}
哪些其他解决方案/模式是合理的或可用的

干杯


如果您想将注册表保存在内存中,Martin

State Monad看起来是最合适的选择。它看起来与您编写的Builder实现类似,但将以功能更强大或语法噪音更小的方式传递上下文/注册表

如果您想将副作用推送到程序的边界,但仍然有副作用,如将注册表保存在数据库或某些可变结构中,那么您可以使用Reader Monad


这是一篇关于Scalaz的好文章,首先讨论了状态的问题,然后展示了如何使用状态单元格。< /P>你认为如何以及在哪里使用这个注册表?里面有什么?谁调用这些方法,谁创建注册表实例?也许你只是想要全局可变状态。二,。作为一些较大例程的上下文,注册表保存元信息。3.四,。我调用注册表并触发注册表的创建。备注:只是想避免可变状态。您是指那些例程周围的上下文,还是那些例程内部的上下文?可以从这些例程中访问的上下文。这些例程可能希望改变上下文,或者只访问它(

getComponent()
)?如果你能举一个简单的例子来说明你在处理易变性,这可能会很有帮助。Aleksey,关于状态和读卡器或IO monad,你是绝对正确的。尽管如此,我还是对已经证明自己的其他方法、模式或最佳实践感兴趣。