如何使用不可变设计跟踪依赖关系?

时间:2016-03-01 17:15:10

标签: scala functional-programming immutability

当对象之间存在依赖关系时,以功能方式设计软件的方法是什么?

class Link(val name: String, val links: Vector[Link] = Vector()){

    def changeName(newName: String): Link = {
        new Link(newName, links)
    }

    def connect(other: Link): Link = {
        new Link(name, links :+ other)
    }
}

object Main
{
    def main(args: Array[String]): Unit = {
            val A = new Link("A")
            val B = new Link("B")
            val Alinked = A connect B 
            val updatedB = B changeName "B2"
            println(Alinked.links.contains(updatedB))
    }
}

输出

  

我连接A和B,但是B正在被更改。这意味着,我必须将新对象重新连接到之前的对象。在复杂的层次结构中,很难控制这些更新。

如何进行自动重新连接?代表们?演员?

1 个答案:

答案 0 :(得分:1)

如果您需要将对象的不可变副本的标识保持在一起,我认为一种解决方案是引入唯一标识符:

case class Link(id: Int)(val name: String, val links: Vector[Link] = Vector()) {
  def changeName(newName: String): Link =
    new Link(id)(newName, links)

  def connect(other: Link): Link =
    new Link(id)(name, links :+ other)
}

def test(): Boolean = {
  val A         = Link(0)("A")
  val B         = Link(1)("B")
  val Alinked   = A connect B 
  val updatedB  = B changeName "B2"
  Alinked.links.contains(updatedB)
}

assert(test())

也就是说,一旦创建了一个对象,你就会在所有副本中携带相同的id。这里的case class可以确保通过查看equals字段正确定义id

相关问题