视图和控制器之间接口的习惯用法
idiom for interface between view and controller
我有一个设计问题:
我使用的是MVC设计模式。但视图在我的项目中是I/O部分。这意味着在硬盘上写入/读取数据,或在屏幕上打印内容的部分。
正如我所提到的,"视图"还应该执行读/写操作。我们的程序需要一些输入数据来执行所需的数值计算。由于这个输入数据也应该是手动可编辑的,我们决定将这个输入数据作为xml。
然后控制器要求"视图"读取这个xml输入数据,以便可以填充模型。
这种情况看起来是这样的:
Controller
/
/
/
View Model
/
/
/
xml reader xml data
所以现在的问题是,当控制器读取输入数据时,从视图传递什么?
视图应该从模型中创建类的实例,并用输入数据填充它们,然后将这些实例传递给控制器。
还是应该将枚举和浮点值传递给控制器,这样控制器就可以实例化所需的类并将浮点值提供给构造函数?
哪种设计更好,为什么?
编辑:我们认为视图应该包含输入数据的加载(现在实现为文件的I/O)的原因是,在未来版本的代码中,我们希望有一个gui,用户可以在其中点击来构建输入数据。然后视图获得完全相同的数据(但来自gui,而不是来自文件),并将其传递给控制器。因此,现在,它只是最简单的"视图"(用户与xml交互时)<这是对MVC的正确理解吗>这是对MVC的正确理解吗>
编辑2:我们实现了一种数值方法,如FEM。因此,模型包含两件事:一方面,它包含数据(部分可以用xml表示),即有限元的表示等等。另一方面,模型包含逻辑,即偏微分方程,其参数也应该存储在xml中。因此,模型中的逻辑需要输入数据,而不是视图。
如果需要提供更多信息,请随时询问。
非常感谢!
根据四人帮的说法,如果我没有错的话,Model类是应该执行IO操作的人。视图是一种演示,允许用户或控制器对模型进行修改,但不应负责IO操作,因为这会暴露模型的内部表示,从而违反封装。
如果你需要这样做,我仍然建议绕过整个Model对象,因为这会使控制器不知道内部表示;如果传递内部数据,所有视图、控制器和模型都需要了解model的内部,这使得模式的三个部分更加耦合;而使用它的目的是尽可能地将三个部分解耦,从而提高可维护性。
如果我理解正确,您有两个数据模型,在这种情况下,您应该始终遵循MVC模式。组件的分离是有原因的,如果您稍后想将xml转换为gui,这将特别有帮助:
模型处理数据,视图允许你通过它自己的"镜头"来观察它,控制器允许你操纵模型。
如果您的视图需要某种类型的输入数据,您可以在此基础上实现第二个MVC。您将得到第二个模型(model2:您的xml数据)和第二个控制器。现在,您的控制器是第二个模型的"手动编辑"。稍后,您的控制器将成为GUI的一部分,GUI还将具有第二个模型的第二个视图)。
注意:请参阅评论中的讨论。
- 复制和交换习惯用法与移动操作之间的交互
- 命名参数习惯用法和(抽象)基类
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- C++移动分配可防止复制交换习惯用法
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 使用新线程在类似于 Scott Meyer 的单例习惯用法的实现中实例化单例是否安全?
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- C++迭代器"for loop"习惯用法,其步长> 1 并允许非随机访问反向迭代器
- 访问基类型数组成员(Int-to-type习惯用法)
- 基于智能指针的 CRTP 习惯用法的编译问题
- 通过C接口分配和释放资源的正确习惯用法
- 副本交换习惯用法的有效性
- 视图和控制器之间接口的习惯用法
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- 当涉及分配器时,是否有类似于复制和交换习惯用法的东西
- 是具有复制和交换习惯用法的复制赋值运算符,建议进行自赋值检查
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- 标准::rel_ops的惯用法