C++ 视图和控制器之间接口的习惯用法

C++ 视图和控制器之间接口的习惯用法,c++,model-view-controller,enums,C++,Model View Controller,Enums,我有一个设计问题: 我使用的是MVC设计模式。但是视图在我的项目I/O部分中。这意味着该部分,向硬盘驱动器写入/读取数据,或在屏幕上打印某些内容 如前所述,“视图”还应该执行读/写操作。我们的程序需要一些输入数据来执行所需的数值计算。 由于这个输入数据也应该可以手动编辑,所以我们决定将这个输入数据设置为xml 然后控制器要求“视图”读取该xml输入数据,以便填充模型 这种情况看起来是这样的: Controller

我有一个设计问题:

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

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

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

这种情况看起来是这样的:

                                  Controller
                                   /     \
                                /           \
                             /                 \
                           View               Model
                          /    \
                       /          \
                    /                \
                xml reader         xml data
所以现在的问题是,当它读取输入数据时,从视图到控制器传递什么

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

或者它应该将枚举和浮点数传递给控制器,以便控制器可以实例化所需的类并将浮点数传递给构造函数

哪种设计更好,为什么

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

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

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


非常感谢

根据四人帮的说法,如果我没有弄错的话,模型类应该执行IO操作。 视图是一种表示,允许用户或控制器对模型执行修改,但不应承担IO操作的费用,因为这通过公开模型的内部表示违反了封装


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

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

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

如果您的视图需要某种类型的输入数据,那么您可以在此基础上实现第二个MVC。您将得到第二个模型(model2:您的xml数据)和第二个控制器。现在,您的控制器是第二个模型的“手动编辑”。稍后,控制器将成为GUI的一部分,GUI还将在第二个模型上显示第二个视图)


注意:请参阅评论中的讨论。

我不确定您是否正确理解模型视图。模型应该保存(并且很可能也读取)任何必要的数据,视图应该只在那里向用户表示这些数据。@arne:我也不确定我是否正确理解了它:),所以问题可以扩展到这一部分:“MVC中的I/O属于哪里?”请参阅我对原始帖子的编辑。记住这一点(我在编辑中写的事实),您仍然建议将I/O放入模型中吗?好的,编辑2肯定强化了我的观点;由于逻辑很复杂,在同一个类中完成序列化可以更轻松地序列化/反序列化类。Edit1可以通过在模型上使用静态工厂来解决(如果我理解正确的话!),控制器可以通过视图中可用的数据来利用该工厂。在视图中拥有IO也意味着在创建不同视图时必须复制(或继承)IO;修改内部模型表示将迫使您更改视图,反之亦然。从对另一个答案的评论来看,我可能没有领会您的观点。我认为模型应该有从流中的数据构造自身的方法——xml或其他;控制器应该…控制外部资源并传递模型使用的流。基本上,视图和模型都非常具体:视图是表示;模型是内在逻辑;控制器处理这两个人和世界其他地方之间的互动。我想我明白你的意思。因此,建议控制器调用xml_读取器将一个流(stringstream?)传递给模型,模型从该流构造自身。对吧?是的。对于假设的未来,我将向模型添加一个工厂方法,当传递必要的数据时,它将构造正确的对象。通过这种方式,您可以从流中获取内容并利用现有工厂。将来,你可能会有JSON,或者控制器本身,或者你称之为同一工厂的东西。这就是为什么我把单词
view
用引号括起来。但我想,我有其他的原因