当对象之间存在依赖关系时,以功能方式设计软件的方法是什么?
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正在被更改。这意味着,我必须将新对象重新连接到之前的对象。在复杂的层次结构中,很难控制这些更新。
如何进行自动重新连接?代表们?演员?
答案 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
。