我正在尝试了解如何正确使用被动视图。在我看来,我在Passive View上看到的每个例子都违反了得墨忒耳法则:
//In the presenter code
myview.mytextfield.text = "whatever";
那么什么是被动视图的更好实现?
答案 0 :(得分:4)
首先,与大多数编程规则一样,德米特定律更多地是一个原则或指南,并且有时候该原则不适用。话虽如此,Demeter法并不真正适用于被动观点,因为在这种情况下法律的原因不是问题。
Demeter法则试图阻止依赖链接,例如:
objectA.objectB.objectC.DoSomething();
显然,如果objectB的实现更改为使用objectD,那么它将破坏objectA的依赖性并导致编译错误。如果采取极端措施,只要链条受到实施变更的干扰,你就会完成霰弹枪手术。
在被动视图
的情况下所以你给出的例子通常会被实现:
//from presenter
view.MeaningfulName = "data";
虽然视图类似于:
//from view
public string MeaninfulName
{
get
{
return someControl.text;
}
set
{
someControl.text = value;
}
希望这能澄清一些事情。
答案 1 :(得分:1)
好吧,是的,确实打破了Demeter法则,它基本上说对象的接口不应该揭示对象的实现。但是,第二个也为实现提供了许多暗示。
我认为是时候问一下你是否拥有合适的界面。 这些文本字段是什么?谁在视图中设置它们?视图不应该向模型询问数据,而不是相反吗?
也许您需要观察者模式 - 模型会保留一份感兴趣的参与者列表,并在其内部状态发生变化时通知他们。
啊, 被动视图。在很长一段时间没有看过那个。基本上,我看到两个部分:其中一个是通过使Controller(而不是模型)驱动所有更新,为(我推测)效率他暴露特定的字段方法来更新这些字段。这确实违反了得墨忒耳法,毕竟这只是一种隐喻意义上的“法律”,如墨菲定律。不过,这通常是一个好主意。在这种情况下,我将重做View并将其用作外观以将更新包装到单个字段中。
你不需要Observer模式,因为现在你已经让Controller进行了所有更新。它为整个代码增加了一些复杂性和错误倾向,因为现在你需要编写Controller来进行并行更新。
答案 2 :(得分:1)
更好的实现方式是在Presenter和View之间建立API。 Presenter会通过单个方法(在View的界面中定义)将数据推送到View。 View将根据一些内部逻辑管理新输入。
因此,演示者不必了解有关视图的任何信息,并且德米特定律是安全的。