我有一个设计问题:
我正在使用MVC设计模式。但View在我的项目中是I / O部分。这意味着该部分可以向/从硬盘驱动器写入/读取数据,或者在屏幕上打印某些内容。
我提到过,“视图”还应该执行读/写操作。我们的程序需要一些输入数据来执行所需的数值计算。 由于此输入数据也应该是可手动编辑的,因此我们决定将此输入数据设为xml。
然后控制器要求“视图”读取此xml输入数据,以便填充模型。
这种情况看起来像这样:
Controller
/ \
/ \
/ \
View Model
/ \
/ \
/ \
xml reader xml data
所以现在的问题是,在读取输入数据时,从View传递给Controller的是什么?
视图是否应该从模型创建类的实例,并用输入数据填充它们并将这些实例传递给Controller。
或者它应该将枚举和浮点数传递给Controller,以便他可以实现所需的类并将浮点数赋给构造函数?
哪种设计更好,为什么?
编辑:之所以我们认为,视图应该包含输入数据的加载(现在实现为文件的I / O),那就是在未来版本的代码中,我们想拥有一个gui,用户可以点击“点击”来构建输入数据。然后视图获取完全相同的数据(但然后从gui,而不是从文件),并应将其传递给控制器。所以现在,它只是最简单的“视图”(因为用户与xml交互)可能。 这是对MVC的正确理解吗?
编辑2:我们实施了一种数值方法,例如FEM。所以模型包含两件事:一方面它包含数据(部分可以用xml表示),即有限元的表示等等。另一方面,它包含逻辑,即偏微分方程,其参数也应存储在xml中。 因此,模型中的逻辑需要输入数据,而不是视图。
如果需要提供更多信息,请随时提出。
非常感谢提前!
答案 0 :(得分:2)
根据Gang of Four的说法,如果我没弄错的话,Model类就是应该执行IO操作的人。 View是一个演示文稿,允许用户或控制器对模型进行修改,但不应对IO操作负责,因为这会通过暴露模型的内部表示来违反封装。
如果你需要像这样完成它,我仍然建议传递整个Model对象,因为这使得控制器不会意识到内部表示;如果你传递内部数据,所有视图,控制器和模型都需要知道模型的内部,这使得模式的三个部分更加耦合;而使用它的目的是尽可能地将这三个部分分离,从而实现更好的可维护性。
答案 1 :(得分:1)
如果我理解正确你有两个数据模型,那么你应该始终遵循MVC模式。组件的分离是有原因的,如果你想稍后为一个gui切换xml,这将特别有用:
模型处理数据,视图允许您通过它自己的“镜头”来查看它,控制器允许您操作模型。
如果您的视图需要某种输入数据,您可以在其下实现第二个MVC。你最终会得到第二个模型(model2:你的xml数据)和第二个控制器。现在你的控制器是你的第二个模型的“手动编辑”。稍后您的控制器将成为GUI的一部分,它还将在您的第二个模型上有第二个视图。
注意:请参阅评论中的讨论。