是否应该通过MVC模式中的视图创建模型对象?

时间:2013-07-19 01:47:22

标签: design-patterns model-view-controller

在MVC模式中,我看到组成数据模型的类与驱动系统的这些类的实例之间存在区别。我的团队恭敬地不同意我的观点,我想澄清一下。

我有一个Employee类,它是模型中唯一的类。控制器有一个类的实例,该实例驱动视图。

我会调用控制器“模型”所拥有的Employee类的一个实例,我会调用Employee类的任何其他不驱动系统的实例“不是模特“。

为什么我要做出这种区分是因为我的团队认为视图不应该创建模型。我同意,但我认为该视图应该能够创建Employee类的实例以传递给控制器​​。

例如,如果我在控制器中有一个方法setCoworker(employee : Employee),我认为视图创建Employee的新实例并将其传递给控制器​​是完全可以的。

MVC模式最佳实践有哪些要求?我不应该从视图中创建实例吗?

3 个答案:

答案 0 :(得分:3)

这取决于您正在关注的 MVC模式(有很多风格)。但是,一般而言,View的唯一职责应该是从人工输入转换为对Controller的调用,以及从模型保存到人类输出的任何数据状态。

所以我必须同意你的团队。您可能在视图中有一个按钮OnClick处理程序等,然后调用controller.BuildANewModel(),但您不会让视图自己实例化新模型。

那就是说,上次我查了一下,四人帮挂了他们的棒球棒和轮胎铁杆,并没有把那些没有按照这些图案的人打下去,无论什么对你有用。 。 。 :)

答案 1 :(得分:2)

我同意你的团队:

限制视图甚至不应该知道控制器及其内部实现的依赖关系,因此它将无法将创建的员工传递给控制器​​。
应该只有一个通知机制 - 委托或其他松散耦合机制 - 其中视图通知控制器,它应该创建一个新员工,或差分措辞:视图将通知控制器一些特定的输入或事件和控制器将决定创建一名新员工 在您的解决方案视图中,控制器将紧密耦合在一起,实际上可以将其视为组件:MVC模式将被破坏。


总之MVC:模型保存数据,控制器具有逻辑,视图与用户交互。唯一知道两者的组件是控制器。模型对视图或控制器一无所知,视图对模型一无所知,只与控制器非常松散地耦合。只是告诉它输入和类似。你当然可以创建其他构造,但那不再是MVC。你的问题是关于MVC的。

这描述了Cocoa中的MVC模式,词汇可能不熟悉,但或多或​​少MVC看起来应该是这样的。绿色表示控制器关于模型和视图的知识,而黄色表示不同的松耦合机制。在不同的语言和框架中,这可能会有所不同。

MVC

在此处找到:What should own the model in an MVC pattern?

答案 2 :(得分:2)

视图不应该向控制器传递任何内容。控制器不应该向视图传递任何内容。模型层不应该向控制器返回任何内容。以下是如何在MVC中实现信息流:

enter image description here

来源:wikipedia

此外,模型是一个层。不是一个类或对象。包含多个结构的图层,每个结构都有不同的责任。你称之为Employee的不是模型(甚至是#34;模型")。相反,它只是众多domain objects中的一个。

您的视图和控制器都不应该直接访问域对象。相反,他们应该通过服务层与模型层进行交互,服务层包含"应用程序逻辑" (模型层内的域和存储结构之间的交互)。

  

这将是我在这个问题上的两分钱,但我会将其标记为“太宽”"因为人们可以写一本关于MVC实现主题的书(和一些人)。