2013-07-19 31 views
0

在MVC模式中,我看到了组成数据模型的类和驱动系统的这些类的实例之间的区别。我的团队恭敬地不同意我的意见,我想澄清一下。模型对象是否应通过MVC模式中的视图创建?

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

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

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

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

MVC模式最佳实践指令是什么?我不应该从视图创建实例吗?

回答

3

这取决于一点哪个你正在关注的MVC模式(有很多口味)。但是,一般来说,视图的唯一职责应该是将人的输入转化为对控制器的调用,以及将模型保存到输出中的任何数据状态。

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

这就是说,上次我查了一下,四人帮把他们的棒球棒和轮胎铁杆挂起来了,并没有把那些不遵循图案的人扔下去,所以无论你为什么工作。 。 。 :)

+0

我很欣赏你的看法。但是如果BuildANewModel()需要很多直接来自人类输入(即视图)的参数呢?我们可以将所有的参数传递给函数,但是这会变得很难管理,而且如果我们创建一个包含所有参数的单独对象,我们基本上会重复已经存在于模型中的类。您怎么看? – Samuel

+0

这通常在控制器的界面中定义,无论是作为参数还是作为某种数据对象。就像我说的那样,没有人会为了使用该数据对象的Model而打破僵局,但它不符合模式,这就是您的问题所在。 – Paul

+0

我有点像控制器暴露的数据对象的想法。像'EmployeeCreationArgs'。如果视图没有或不应该关注的“员工”类的某些部分,这可能很有价值。感谢您的输入:) – Samuel

2

我想与您的团队一致认为:

限制依赖性的观点甚至不应该知道的控制器和它的内部实现的,所以它不能够创建员工传递给控制器。
应该有只是一个通知机制 - 授权或某种其他松散联接机构 - 其中所述视图通知控制器,它应该创建一个新的雇员,或差分表述:视图将通知一定的输入或事件的控制器和控制者会决定创建一个新员工。
在您的溶液视图和控制器将被紧密地耦合在一起,它实际上可以被看作是对组成:MVC模式将被破坏。


MVC总之:型号保存数据,控制器具有逻辑,考虑到与用户进行交互。唯一知道两者的组件是控制器。模型一无所知视图或控制器,视图一无所知模型,并只与控制器加上非常松散。只是通知它有关输入和类似。你当然可以创建其他结构,但那不是MVC。你的问题是关于MVC。

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

MVC

这里找到:What should own the model in an MVC pattern?

+0

方法调用并不意味着视图耦合到控制器的内部实现。您可以使用一个接口来提取暴露给视图的控制器的行为。该视图不与接口的任何特定实现耦合。这并没有回答我关于模型的具体问题。 – Samuel

+0

当然,一个界面将是一个很好的解决方案。但是如果视图会成为新对象的创建者,它将完成属于控制器的任务。所以它将包含控制器将依赖的代码:控制器将分散在多个对象上。 – vikingosegundo

+0

你可以阅读我对保罗的帖子关于传递参数的第一条评论吗?你对此有何看法? – Samuel

2

意见不应该通过什么控制器。控制器不应该将任何事情传递给视图。模型层不应该返回任何东西给控制器。这里是如何的信息流应该在MVC实现:

enter image description here

来源:wikipedia

此外,模型是一个层。不是课堂或对象。包含多个结构的图层,每个结构都有不同的责任。你所称的Employee不是模型(甚至是“模型”)。相反,它只是众多的domain objects之一。

无论你的观点和你的控制器应该对域对象的任何直接访问。相反,他们应该通过服务层与模型层交互,该层包含模型层中的“应用程序逻辑”(域和存储结构之间的交互)。

这些将是关于这个问题我的两分钱,但我会被标记这是“过于宽泛”,因为人们可以写一本书(和一些 - 拥有)对MVC实现的主题。

+0

只需注意帮助人们避免混淆 - 这里是_classical_ MVC。例如,Backbone.js在更广泛的意义上使用“视图”,其中这种“视图”确实将所有用户交互传递给其他组件。 –

+0

@DmitriZaitsev Backbone与主题相关的是怎样的? –

+0

在迂腐的一面,我理解你。但人们通常认为MVC有各种口味。骨干只是一个例子来说明其他口味的观点,这可能或可能不是一个困惑的读者相关,但是另一个图书馆或框架可能会。 –

相关问题