c++ - 简单形式的 Idomatic QT 架构?
问题描述
我目前正在从事一个中型项目,该项目需要使用许多类似表单的对话框。我正在使用 Qt5 小部件开发此应用程序。(我正在尝试为基于类的网络协议实现调试工具)。表单背后的大部分逻辑都非常简单。
表单的视图如下所示:
基本上,当按下发送时,它只是使用表单中的数据构造一个数据包,并将其插入到消息缓冲区中,以便稍后在程序中适当时发送出去。我想在开发这个时使用正确的编码习惯,因为我正在使用这个项目来熟悉 GUI 编程。
我担心的是,我不知道如何以一种可扩展、可测试和健壮的方式惯用地构造我的代码。我不希望我的对话框直接负责将数据插入发送流,也不应该处理与之相关的任何业务逻辑。
我天真地想象视图应该做很少的逻辑,而不是与用户编辑某些内容或按下按钮的过程的其他部分进行通信,也许它可以验证文本的格式是否正确。该过程的另一部分将是我想象的“模型”,因此(我相信)遵循 MV 架构。这导致了几个问题:
- 像这样的大多数教程似乎都希望用户实现 a
QAbstractListModel
或 aQAbstractTableModel
,甚至可能是 aQAbstractItemModel
,但这些似乎都不需要或与我正在使用的数据类型相关,此外,它们的界面似乎对我认为是简单的数据流——我是否需要对其中之一进行子类化才能正确实现 MV 架构,还是我可以自己管理连接?如果我自己管理连接,我应该创建一个演示者类来处理这个问题并因此实现一个 MVP 架构吗? - 数据应该如何从这个表单传递到应用程序的其余部分?如果合理/正确,我宁愿避免任何/所有全局/静态设计。在发送时,应该构建一个数据包并将其插入发送缓冲区,但是应该在这个对话框的模型中完成吗?该模型是否应该提供对缓冲区或其控制接口的引用并对其进行操作?是否应该将相关数据传递或返回到处理缓冲区操作的外部模型?
- 这些形式的数据基本上是1对1的,其中包含构造发送缓冲区消息所需的信息,以至于您可以合理地使用或调整现有接口成为功能模型,但是,我觉得这将是代码味道——对吗?我应该创建一个基本上反映我的消息类的新类,以便更好地分离关注点吗?
感谢大家提供的任何见解或资源。这在很大程度上是我对问题的过度思考,但我想在实现 60 多个对话框之前确保我的设计理念是合理的,以便该应用程序可以完全覆盖协议的标准。
解决方案
我不希望我的对话框直接负责将数据插入发送流
确切地。它应该只负责将数据传递给一些负责发送消息的服务,即关注点分离和单一责任。
像这样的大多数教程似乎都希望用户实现 QAbstractListModel 或 QAbstractTableModel,甚至可能是 QAbstractItemModel,但这些似乎都不需要或与我正在使用的数据类型相关,
您的数据是否将在表格/列表/树中表示。如果是,那么您可以使用其中之一/子类化它们。或者,您可以使用不使用模型视图设计的QListWidget
/等。QTreeWidget
如果不是,那么这些显然不适合您。这取决于数据以及您希望如何呈现数据,并且只有您知道数据,因此您必须做出决定。
数据应该如何从这个表单传递到应用程序的其余部分?
使用信号/槽机制。以图中的表格为例。上面的send
按钮不应该发送任何东西。它应该只接受输入到表单中的数据,然后通过信号将该数据传递给其他服务,例如 MessageSender 服务或 ValidationService。这就是表单应该做的所有事情。
如果合理/正确,我宁愿避免任何/所有全局/静态设计。
这很好,除非没有其他办法,否则您应该避免使用它们。例如,在程序的整个生命周期中,程序中的任何地方都需要日志服务,我会将其设为单例。
在发送时,应该构建一个数据包并将其插入发送缓冲区,但是应该在这个对话框的模型中完成吗?该模型是否应该提供对缓冲区或其控制接口的引用并对其进行操作?
使用信号/插槽。对话框应该只接受输入,它不应该发送数据或做其他事情。它应该接受输入并将其传递。考虑到这一点,设计您的类/对象。
推荐阅读
- ruby - attr_accessor 在 procs 中使用时不起作用
- actions-on-google - Dialogflow 未触发所需参数的提示
- regex - Notepad++ 正则表达式重新排序字符串
- sql - 提取过去 7 天的数据(不能使用 current_date 函数)
- javascript - 使用 javascript 在 MVC 视图的页面加载上设置页面滚动位置
- gitlab-ci - 跨越多个阶段的 CI 作业
- php - 记住递归函数值
- javascript - 查找 Aws S3 存储桶位置
- java - Intellij 不正确加载项目
- javascript - ForEach 百里香 javascript