Passive View是否打破了得墨忒耳的规律?

时间:2009-05-26 17:26:29

标签: law-of-demeter passive-view

我正在尝试了解如何正确使用被动视图。在我看来,我在Passive View上看到的每个例子都违反了得墨忒耳法则:

//In the presenter code
myview.mytextfield.text = "whatever";

那么什么是被动视图的更好实现?

3 个答案:

答案 0 :(得分:4)

首先,与大多数编程规则一样,德米特定律更多地是一个原则或指南,并且有时候该原则不适用。话虽如此,Demeter法并不真正适用于被动观点,因为在这种情况下法律的原因不是问题。

Demeter法则试图阻止依赖链接,例如:

objectA.objectB.objectC.DoSomething();

显然,如果objectB的实现更改为使用objectD,那么它将破坏objectA的依赖性并导致编译错误。如果采取极端措施,只要链条受到实施变更的干扰,你就会完成霰弹枪手术。

被动视图

的情况下
  • 演示者依赖于一个接口,因此只要界面保持不变,视图的实现就可以改变。
  • 视图通常将属性公开为通用数据类型,例如系统类型和集合。这允许您在不影响演示者的情况下对UI进行更改。
  • 对于演示者,视图只显示为数据结构,检索和转储数据的位置。由于视图非常简单,因此演示者甚至不能进行依赖关系链接。

所以你给出的例子通常会被实现:

//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将根据一些内部逻辑管理新输入。

因此,演示者不必了解有关视图的任何信息,并且德米特定律是安全的。