【问题标题】:In Model-View-Controller, is it ever okay for the view to depend on the model?在 Model-View-Controller 中,视图依赖于模型是否可以?
【发布时间】:2015-12-12 08:59:51
【问题描述】:

关于模型-视图-控制器 (MVC) 的文献通常指出模型和视图是相互独立的实体,而控制器调节它们的交互,因此强烈依赖于两者。

在理论上,最后一条语句似乎是一种加强模块化的合理方法。

但是假设您编写了一个允许用户创建、编辑和保存文档的应用程序。这些文档比简单的文本文档更复杂,由多个字段组成,并非所有字段都属于同一类型。然后你会想到,为了多态地支持同一个文档的多个可视化表示,你可以定义一个 DocumentView 接口,任何具体的视图子类都可以采用它来指示它能够显示一个文档。

现在,假设您已经编写了采用 DocumentView 接口的 SomeDocumentView 类。要创建文档视图,您的应用程序代码将具有类似于以下的一行:

DocumentView documentView = SomeDocumentView(document)

现在假设将来你已经编写了UpdatedDocumentView 类,它也采用了DocumentView 接口。要进行更改,您只需将上面的行替换为:

DocumentView documentView = UpdatedDocumentView(document)

瞧!您的应用程序代码通过 DocumentView 接口自动支持您的 UpdatedDocumentView。

但是这样的设计是否违反了 MVC,因为视图的实现现在显式地依赖于模型?为什么这一定是坏事?如果您的模型在未来发生变化,无论您采用何种方法,您都必须更改代码。

【问题讨论】:

    标签: ios model-view-controller application-design


    【解决方案1】:

    “模型视图控制器”在不同的时间有不同的含义。在最初的 MVC 中,在 Smalltalk 中,控制器代表用户输入,是的,视图采用模型对象并直接代表它们。

    Apple's MVC 更像是MVP 的别名,正如您所说,演示者/控制器充当模型和视图之间的中间人。

    这种模式允许独立开发视图。可能在您的DocuentView 的情况下,它实际上是几个其他视图的组合和控制器,从而模糊了视图和控制器之间的区别。

    UIViewController 被称为这样的原因之一是因为它处理许多视图职责,即用户输入手势。不过,在现代代码中使用这些功能通常是不受欢迎的。 Apple 现在提供了更多的离散机制。

    【讨论】:

    • 当你说视图“实际上是几个其他视图的组合和控制器,从而模糊了视图和控制器之间的区别”时,你是完全正确的。这是我将其功能分离为两个类的主要动机:一个负责模型的逻辑/操作的简单控制器和一个封装整个视图层次结构并在一个干净的界面下处理手势的视图,因此它的语义类似于那些单一视图。这种架构感觉更干净,并且更符合 SRP。这是可以接受的方法吗?
    • 你的想法和 MVVM 有相同的动机,但是你的职责与之相反。在 MVVM 中,ViewController 封装了视图层次结构,而 ModelView 负责模型对象的逻辑/操作。每个 ViewController 包含一个 ViewModel 而没有其他模型对象,ViewModel 包含所有模型对象。所以是的,我认为你的想法是合理的,但是 MVVM 的分离比你的方法更清晰,因为 ViewController 有一些类似于 View 的行为。
    • 一个可能有帮助的链接:programmers.stackexchange.com/questions/264081/…
    • 我所在的地区已经很晚了。我明天会发帖让你知道 MVVM 是否解决了这个问题。感谢到目前为止的讨论。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-03-26
    • 2014-01-10
    • 2011-09-09
    • 1970-01-01
    • 2010-11-20
    • 2015-05-14
    相关资源
    最近更新 更多