在MVC模式中,我看到组成数据模型的类与驱动系统的这些类的实例之间存在区别。我的团队恭敬地不同意我的观点,我想澄清一下。
我有一个Employee
类,它是模型中唯一的类。控制器有一个类的实例,该实例驱动视图。
我会调用控制器“模型”所拥有的Employee
类的一个实例,我会调用Employee
类的任何其他不驱动系统的实例“不是模特“。
为什么我要做出这种区分是因为我的团队认为视图不应该创建模型。我同意,但我认为该视图应该能够创建Employee
类的实例以传递给控制器。
例如,如果我在控制器中有一个方法setCoworker(employee : Employee)
,我认为视图创建Employee
的新实例并将其传递给控制器是完全可以的。
MVC模式最佳实践有哪些要求?我不应该从视图中创建实例吗?
答案 0 :(得分:3)
这取决于您正在关注的 MVC模式(有很多风格)。但是,一般而言,View的唯一职责应该是从人工输入转换为对Controller的调用,以及从模型保存到人类输出的任何数据状态。
所以我必须同意你的团队。您可能在视图中有一个按钮OnClick
处理程序等,然后调用controller.BuildANewModel()
,但您不会让视图自己实例化新模型。
那就是说,上次我查了一下,四人帮挂了他们的棒球棒和轮胎铁杆,并没有把那些没有按照这些图案的人打下去,无论什么对你有用。 。 。 :)
答案 1 :(得分:2)
我同意你的团队:
限制视图甚至不应该知道控制器及其内部实现的依赖关系,因此它将无法将创建的员工传递给控制器。
应该只有一个通知机制 - 委托或其他松散耦合机制 - 其中视图通知控制器,它应该创建一个新员工,或差分措辞:视图将通知控制器一些特定的输入或事件和控制器将决定创建一名新员工
在您的解决方案视图中,控制器将紧密耦合在一起,实际上可以将其视为组件:MVC模式将被破坏。
这描述了Cocoa中的MVC模式,词汇可能不熟悉,但或多或少MVC看起来应该是这样的。绿色表示控制器关于模型和视图的知识,而黄色表示不同的松耦合机制。在不同的语言和框架中,这可能会有所不同。
答案 2 :(得分:2)
视图不应该向控制器传递任何内容。控制器不应该向视图传递任何内容。模型层不应该向控制器返回任何内容。以下是如何在MVC中实现信息流:
来源:wikipedia
此外,模型是一个层。不是一个类或对象。包含多个结构的图层,每个结构都有不同的责任。你称之为Employee
的不是模型(甚至是#34;模型")。相反,它只是众多domain objects中的一个。
您的视图和控制器都不应该直接访问域对象。相反,他们应该通过服务层与模型层进行交互,服务层包含"应用程序逻辑" (模型层内的域和存储结构之间的交互)。
这将是我在这个问题上的两分钱,但我会将其标记为“太宽”"因为人们可以写一本关于MVC实现主题的书(和一些人)。