在理想的MVC中,视图应该知道模型吗?

时间:2010-09-18 14:19:54

标签: model-view-controller design-patterns language-agnostic

我的问题是理想的或原始的MVC解释 http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html

由于MVC的目标是减少依赖关系,View应该知道模型吗?那么什么会阻止它变胖,直接调用模型方法而不问控制器?

更新:当我阅读下面的答案时,我会举一个具体的例子:

假设您创建了一个复杂的计算器(不仅仅是一些简单的计算器,让我们说股票市场的一个选项价格)。它只需要股票价格,利率,波动率等投入。那么为什么我要创建一个包含视图中方法的整个模型的引用,因为我只需要这些输入变量?

为什么控制器不会在视图中发生变化时通知,然后仅使用输入回调视图中的方法?

例如,我在这里看到View有一个对整个模型的引用:

http://leepoint.net/notes-java/GUI/structure/40mvc.html

private CalcModel m_model;

5 个答案:

答案 0 :(得分:18)

视图不应该知道 business 模型,这取决于控制器。但是,视图应该知道 data 模型。还有什么必须呈现它?

另见:

答案 1 :(得分:8)

  

那会阻止它成为什么   胖子直接打电话给模特方法   没有询问控制器?没有询问控制器?

我发现这有点幽默。观点没有他们自己的想法,但程序员可以。他们是做出错误决定的人,并允许View做它做的事情。

View必须足够了解Model才能显示。如果您的程序员无法控制自己,一个答案可能是使他们的Model对象不可变。

另一种可能是使用AOP。编写一个方面,以防止对服务层的调用不是来自其他服务或控制器。

还有另外一个观点:AJAX就是关于视图将事情掌握在自己手中并在未经任何人许可的情况下调用服务,以异步方式执行操作并提高响应性以获得更好的用户体验。这是的事情。

不要太挂在建筑纯度上。 MVC是一个很好的模式,在适用的地方非常有用。了解规则;知道什么时候打破规则是合适的。不要那么教条 - 在编程或生活中。

答案 2 :(得分:4)

是的,在MVC中,视图知道模型。实际上,视图的作业是显示模型,因此它必须知道模型。模型应该相当简单,并且不应该是状态的容器(即字符串,整数等属性) - 它应该没有真正的方法。

控制器知道视图和模型 - 控制器的工作是获取适当的模型并将其传递给适当的视图。

该模型应该不知道控制器或视图。

这是MVC(SoC)中典型的关注点分离,其中每个组件都有明确定义的“工作”。

答案 3 :(得分:1)

在MVC中,重点并不是你不应该在M-V-C之间进行交流。重点是保持模型与视图(和控制器)分离,以便您可以轻松地更改/替换组件。

http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller

答案 4 :(得分:0)

视图的目标是渲染从模型派生的数据。所以答案是不应该的。另一方面,模型不应该关心如何呈现这些数据。

例如,业务逻辑可能是:

  view->report->annual_revenue =
    this->first_quarter_rev +
    this->second_quarter_rev +
    this->third_quarter_rev +
    this->fourth_quarter_rev;

虽然表示逻辑:

  if (!this->report->annual_revenue) {
    print('No information')
  }
  else {
    print(format('# ###', this->report->annual_revenue) + '$');
  }