2015-09-15 105 views
2

关于模型 - 视图 - 控制器(MVC)的文献通常指出,模型和视图是相互独立的实体,而控制器介导它们的相互作用,因此强烈依赖于这两者。在模型 - 视图 - 控制器中,视图依赖于模型可以吗?

在理论层面上,最后一条陈述看起来像是一种强制模块化的合理方法。

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

现在,假设您已经编写了使用DocumentView接口的SomeDocumentView类。要创建文档视图,您的应用程序代码必须类似下面的一行:

DocumentView documentView = SomeDocumentView(document) 

现在,在未来的假设,你写的UpdatedDocumentView类,它也采用了DocumentView接口。要做出这样的改变,您只需要将上面的行替换为:

DocumentView documentView = UpdatedDocumentView(document) 

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

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

回答

1

“模型视图控制器”在不同的时间意味着不同的事物。在最初的MVC中,在Smalltalk中,控制器代表用户输入,是的,视图使用模型对象并直接表示它们。

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

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

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

+0

当你说视图“实际上是其他视图的组合和控制器,从而模糊了视图和控制器之间的区别时,你完全正确。”这是我将它的功能分解成两个类的主要动机:负责模型的逻辑/操作的简单控制器和封装整个视图层次结构并在一个干净的界面下处理手势的视图,以使其语义类似于一个观点。该架构感觉更清洁,并更好地坚持SRP。这是一个可接受的方法吗? – robertl

+0

您的想法与MVVM具有相同的动机,但您的责任与此相反。在MVVM中,ViewController封装了他的视图层次结构,而ModelView则负责模型对象的逻辑/操作。每个ViewController包含一个ViewModel并且没有其他模型对象,ViewModel包含所有的模型对象。所以是的,我认为你的想法是合理的,但是与MVVM相比,这种分离比你的方法更简洁,因为ViewController具有一些View类似的行为。 –

+0

可能有所帮助的链接:http://programmers.stackexchange.com/questions/264081/usage-of-mvvm-in-ios –