Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 模型对象应该在MVC模式中通过视图创建吗?_Design Patterns_Model View Controller - Fatal编程技术网

Design patterns 模型对象应该在MVC模式中通过视图创建吗?

Design patterns 模型对象应该在MVC模式中通过视图创建吗?,design-patterns,model-view-controller,Design Patterns,Model View Controller,在MVC模式中,我看到了组成数据模型的类与驱动系统的这些类的实例之间的区别。我的团队不同意我的观点,我想澄清一下 我有一个Employee类,它是模型中唯一的类。控制器有一个类实例,该实例驱动视图 我将控制器拥有的Employee类的一个实例称为“模型”,并将不驱动系统的Employee类的任何其他实例称为“非模型” 我之所以做出这种区分,是因为我的团队认为视图不应该创建模型。我同意,但我认为视图应该能够创建Employee类的实例以传递给控制器 例如,如果我在控制器中有一个方法setCowor

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

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

我将控制器拥有的
Employee
类的一个实例称为“模型”,并将不驱动系统的
Employee
类的任何其他实例称为“非模型”

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

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

MVC模式的最佳实践规定了什么?我不应该从视图中创建实例吗?

这取决于您遵循的MVC模式(有很多种风格)。不过,通常情况下,视图的唯一职责应该是将人工输入转换为对控制器的调用,并将模型持有的任何数据状态转换为对人工的输出

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


这就是说,上次我检查时,“四人帮”已经挂上了棒球棒和轮胎熨斗,不打算对那些不按规矩办事的人进行打击,所以无论什么对你有用……:)

我同意你的团队:

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


MVC简而言之:模型保存数据,控制器拥有逻辑,视图与用户交互。唯一知道两者的组件是控制器。模型对视图或控制器一无所知,视图对模型一无所知,只与控制器松散耦合。只是告诉它关于输入和a-like的信息。您当然可以创建其他构造,但这不再是MVC了。你的问题是关于MVC的

这描述了Cocoa中的MVC模式,词汇表可能不熟悉,但MVC或多或少应该是这样的。绿色表示控制器对模型和视图的了解,黄色表示不同的松耦合机制。这在不同的语言和框架中可能被称为不同的


在此处找到:

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

资料来源:

另外,模型是一个层。不是类或对象。包含多个结构的层,每个结构具有不同的职责。你所说的
Employee
不是模型(甚至不是“模型”)。相反,它只是众多中的一个

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

这将是我在这个主题上的两分钱,但我将把它标记为“太宽泛”,因为人们可以写一本关于MVC实现的书(以及一些人已经写过的书)


我欣赏你的想法。但是,如果BuildANewModel()需要大量直接来自人工输入(即视图)的参数,该怎么办?我们可以将所有参数传递到函数中,但这会变得难以管理,如果我们创建一个包含所有参数的单独对象,我们实际上是在重复模型中已经存在的类。。你认为呢?这通常是在控制器的接口中定义的,要么作为参数,要么作为某种数据对象。就像我说的,没有人会因为使用数据对象的模型而打断你的膝盖骨,但这与你的问题所涉及的模式不符。我有点喜欢控制器公开数据对象的想法。类似于
EmployeeCreationArgs
。如果视图不关心或不应该关心
Employee
类的某些部分,这可能很有价值。感谢您的输入:)方法调用并不意味着视图耦合到控制器的内部实现。您可以使用接口来抽象向视图公开的控制器的行为。该视图没有耦合到接口的任何特定实现。这并没有回答我关于模型的具体问题。当然,一个接口将是一个很好的解决方案。但是,如果视图成为新对象的创建者,它将完成属于控制器的任务。所以它将包含c