假设我的模型类Person
具有name
属性。
我还有一个相应的PersonView
,其中包含NameView
作为其子视图之一。
PersonView
还会保留对某人(其模型)的引用,而NameView
会保留对该名称(其模型)的引用。
如果我在PersonView
内,我现在有两种方法可以得到这个名字:
self.person.name
或
self.nameView.name
所有参考文献都很自然。然而,这似乎违反了DRY。上述路径应该产生相同的名称。但如果事情不同步,他们可能不会。
上面的例子比实际上往往更简单。例如,该人可能是Family
对象的一部分,而FamilyView
对象又由FamilyView
对象引用。现在有三条不同的路径,从{{1}}到特定人的名字。随着树的增长,它只会变得更糟。
处理这种情况的最佳方法是什么?
答案 0 :(得分:1)
我认为,在这种情况下,你必须在违反DRY或放弃松散耦合之间做出选择。我认为你不能避免这两种情况。
如果NameView
不包含自己的数据副本,那么它需要一个指向数据的指针。现在你已经收紧了耦合,因为NameView
不能单独使用。
另一方面,如果NameView
保留了模型数据的副本,那么您违反了DRY,最终可能会遇到同步问题。许多GUI框架都有一个“绑定”概念,可以使模型和视图之间的值保持同步。
就个人而言,我会选择松耦合加绑定。如果您使用的绑定有任何好处,则不应出现任何同步问题。在许多不同的语言和框架中广泛使用绑定表明这是一种不错的方法。
至于是否使用self.person.name
或self.nameView.name
,这取决于您是尝试修改模型状态还是查看状态。如果您尝试更改模型,则只需更改self.person.name
即可。视图应该以某种方式观察模型以进行更改,并且应该能够相应地更新自身。如果您想更新GUI而不关心模型,请使用self.nameView.name
。