【问题标题】:idiom for interface between view and controller视图和控制器之间接口的成语
【发布时间】:2014-01-16 23:35:29
【问题描述】:

我有一个设计问题:

我正在使用 MVC 设计模式。但是视图在我的项目中是 I/O 部分。这意味着向硬盘驱动器写入/读取数据或在屏幕上打印某些内容的部分。

我提到过,“视图”还应该执行读/写操作。我们的程序需要一些输入数据来执行所需的数值计算。 由于这个输入数据也应该可以手动编辑,我们决定把这个输入数据设为 xml。

然后控制器要求“视图”读取这个xml输入数据,以便填充模型。

这种情况看起来像这样:

                                  Controller
                                   /     \
                                /           \
                             /                 \
                           View               Model
                          /    \
                       /          \
                    /                \
                xml reader         xml data

那么现在的问题是,当 View 读取输入数据时,要向 Controller 传递什么?

视图是否应该从模型创建类的实例并用输入数据填充它们并将这些实例传递给控制器​​。

还是应该将枚举和浮点数传递给控制器​​,以便他可以实例化所需的类并将浮点数提供给构造函数?

哪种设计更好,为什么?

编辑:我们认为视图应该包含输入数据的加载(现在实现为文件的 I/O)的原因是,在代码的未来版本中,我们想要有一个 gui,用户可以在其中点“n”单击来构建输入数据。然后视图获得完全相同的数据(但随后来自 gui,而不是来自文件)并应将其传递给控制器​​。所以现在,它只是可能的最简单的“视图”(当用户与 xml 交互时)。 这是对 MVC 的正确理解吗?

编辑 2: 我们实现了一种数值方法,例如 FEM。所以模型包含两件事:一方面它包含数据(部分可以用 xml 表示),即有限元的表示等。另一方面,它包含逻辑,即偏微分方程,其参数也应存储在 xml.xml 中。 因此模型中的逻辑需要输入数据,而不是视图。

如果需要提供更多信息,请随时询问。

非常感谢!

【问题讨论】:

  • 我不确定您是否正确理解了模型视图。模型应该保存(并且很可能还读取)任何必要的数据,并且视图应该只用于向用户表示这些数据。
  • @arne:我也不确定我是否理解正确 :) 所以问题可以扩展到那部分:“MVC 中的 I/O 属于哪里?”

标签: c++ model-view-controller enums


【解决方案1】:

根据四人组的说法,如果我没记错的话,应该执行 IO 操作的是 Model 类。 View 是一种表示形式,允许用户或控制器对 Model 进行修改,但不应负责 IO 操作,因为这会通过暴露 Model 的内部表示而违反封装。

如果您需要这样做,我仍然建议传递整个模型对象,因为这会使控制器不知道内部表示;如果你传递内部数据,所有的视图、控制器和模型都需要了解模型的内部结构,这使得模式的三个部分更加耦合;而使用它的目的是尽可能将这三个部分解耦,从而提高可维护性。

【讨论】:

  • 请查看我对原帖的编辑。牢记这一点(我在编辑中写的事实),您是否仍然建议将 I/O 放入模型中?
  • 嗯,Edit2 确实强化了我的观点;由于逻辑很复杂,因此在同一个类中完成序列化可以更轻松地对类进行序列化/反序列化。 Edit1 可以通过在模型上使用静态工厂来解决(如果我理解正确的话!),控制器可以通过视图中可用的数据来利用该工厂。在视图中拥有 IO 也意味着在创建不同的视图时必须复制(或继承)它;并且修改内部模型表示将迫使您更改视图,反之亦然。
  • 从 cmets 的另一个答案来看,我可能错过了你的观点。我认为模型应该具有从流中的数据构建自身的方法 - xml 和其他;控制器应该...控制外部资源并传递流以供模型使用。基本上视图和模型都是非常具体的:视图是表示;模型是内部逻辑;控制器处理这两者与世界其他地方之间的交互。
  • 好的。我想我明白你的意思了。因此,您建议控制器调用 xml_reader 将流(字符串流?)传递给模型,模型从该流中构造自己。对吗?
  • 是的。对于假设的未来,我会在模型中添加一个工厂方法,在传递必要的数据时构造正确的对象。通过这种方式,您可以从流中获取内容并利用现有工厂。将来,您可能拥有 JSON,或者控制器本身,或者您所称的同一个工厂。
【解决方案2】:

如果我理解正确,您有两个数据模型,在这种情况下,您应该始终遵循 MVC 模式。组件的分离是有原因的,如果您想稍后将 xml 切换为 gui,这将特别有帮助:

模型处理数据,视图允许您通过它自己的“镜头”查看它,控制器允许您操作模型。

如果您的视图需要某种输入数据,您可以在其下实现第二个 MVC。您最终会得到第二个模型(model2:您的 xml 数据)和第二个控制器。现在您的控制器是您的第二个模型的“手动编辑”。稍后,您的控制器将成为 GUI 的一部分,GUI 也会对您的第二个模型有第二个视图)。

注意:参见 cmets 中的讨论。

【讨论】:

  • 这也是我的想法:将视图实现为on MVC。这就是为什么我把view 这个词放在引号里。但我认为,除了你之外,我还有其他原因......我不太明白你所说的“两个数据模型”是什么意思?我的模型包含数据(部分可以用 xml 表示)和进行计算的业务逻辑。视图本身不需要输入数据。这是需要它的逻辑。此外,您还没有回答主要问题:当我使视图成为自己的 MVC 时,我应该将枚举或对象传递给我的控制器吗?还是我误会了你?
  • 好的,我把你的问题搞错了。你只有一个 MVC。如果您正确遵循 MVC 模式,您的视图不会加载任何数据(它只显示您的模型),模型代表数据。模型执行 I/O(读取 xml 或文本或从数据库中)并以视图和控制器可以处理的方式表示它。看看这篇来自 QT 的文章:qt-project.org/doc/qt-4.8/model-view-programming.html。也许在那之后事情会更清楚。
  • 好的,假设我会以这样一种方式实现模型,即从 xml 文件加载数据。我以后将如何实现这种方式,即以前通过 xml 文件提供的这些数据是通过 gui 构造的?然后作为视图的 gui 必须将此信息传递给模型(可能通过控制器,对吗?)。所以在我看来,我应该两次实现模型的构建(一次从 xml 读取,另一次通过视图构建它)。而且我了解到两次实施某些东西真的很糟糕,不是吗?
  • 不,如果你遵循这个模式,你会实现一次模型和两次控制器。一次您的控制器是“xml 阅读器”,另一次是 UI 组件。将模型视为应用程序的内部数据表示。控制器是该数据表示的操纵者。我认为混淆源于我们经常出于方便而合并这些功能(模型+控制器或视图+控制器在一个类中实现)。
  • 好的。所以让我们看看我是否得到它:控制器调用 xml-reader 来读取 xml 文件,然后他从 xml 读取器中获取值并填充模型。正确的?这一切都是由控制器完成的?对我来说似乎有点不对...
猜你喜欢
  • 2014-04-10
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多