设计具有不变性(在Scala中)

Cok*_*aka 5 functional-programming scala immutability

由于强调Scala等编程语言的不变性(避免使用"var"),我的对象中的"状态修改方法"是否必须返回实例的副本(具有新状态)?

我们来考虑龟.我想像这样移动我的乌龟:

val turtle = new Turtle(0, 0, "north")
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2)
Run Code Online (Sandbox Code Playgroud)

这里turtle2不会指向同一个Turtle实例(它们是两个独立的实例).事实上,在这一系列运动中,创造了4个临时物体.这就是我实现方法turnLeft的方法,例如:

def turnLeft {
  self.copy(orientation = self.orientation match {
    case "north" => "west"
    case "east" => "north"
    case "south" => "east"
    case "west" => "south"
  })
}
Run Code Online (Sandbox Code Playgroud)

这是一种正确的设计方法吗?

如果是,那么(在每个方法调用上创建新对象)效率/效率如何?如果不是,那么什么是正确的?我对不变性方面(或者一般的函数式编程)的理解有什么不对/缺失?

提前谢谢,拉卡

Dim*_*ima 9

创建大量短暂的物体是scala的标志性特征.它通常不是很昂贵,只要你在具有足够大小的堆的JVM上运行它,具有足够的年轻代内存以容纳所有的流失.

话虽如此,不变性不是宗教.常识应占上风,并指导设计决策,坚持"范式"变得过于沉重.