如何在将小部件混合在一起的现代GUI系统中实现MVC风格的程序设计?

问题描述

我对此很疑惑。我现在已经有一段时间感兴趣并玩过游戏了-尽管也承认有些沮丧,因为这里一些最有知识的看似帖子很难理解,因为它们涉及到很多我不熟悉的术语。时间,即类似这样的时间:

How should a model be structured in MVC?

在描述它时,尽管这可能更多是由于我的编码背景,因为与台式机和移动领域相比,我的编码背景要比Internet / Web领域多得多(但最好将类似的信息文章“翻译”为或什至更好的上下文,它在解释所有概念(例如“域对象”等)时更具概念性和更详细。MVC是一种非常广泛适用的模式)-“模型-视图-控制器”或MVC模式布置一个软件,我现在可以通过以下方式了解它:

  • 该软件由三个“层”组成。最高层是模型层,或“业务逻辑”层。这是制作程序应该制作的东西的所有“细节”(例如,就像在计算机游戏中一样,这是所有游戏逻辑都会去的地方)。另外两层是数据层和UI层;这些实际上负责将模型层转换为系统输出,分别转换为永久存储和计算机的用户界面外围设备(例如屏幕,键盘/鼠标/触摸板等)。
  • 模型层分为四个部分:域对象,其中包含实际的业务逻辑; 数据映射器,其抽象化对持久性存储(可能是数据库)的访问,例如Android的Room Persistence Library [sql wrapper]或桌面/服务器空间中的文件系统),存储库,用于保存数据映射器并提供类似于“库”的界面例如,您可以在其中通过键(例如“ findSomething()”方法)以及 services (它们是模型层与UI和数据层之间的接口)查找并获取域对象。
  • 用户界面层分为 View Controller 组件,其中View组件将模型层数据的 presentation 交给用户 Controller 组件接管模型层数据的 mutation ;也就是说,它们将命令发送到模型层中的服务,这会产生副作用。正是由于这一点以及Model层的存在,才产生了整个模式的名称

我的问题涉及与现代GUI系统有关的模式的最后部分-包括移动和台式机,例如Android(由于没有钱,我对Apple零经验)。特别是在我看来,实现这一目标的逻辑方法是合理的(如果我拥有正确的部分,正如我所说,这些帖子往往很难理解,因为它们不仅涉及所有这些专门术语,而且还涉及我的解释。尝试在线查找它们是同样不透明的)是建议将Views与负责显示模型状态的GUI小部件相关联,而将Controller与用户将与之交互以导致事情发生的控件相关联在大多数情况下,这意味着必须在模型层中发生某些事情。

但是,问题是,在现代GUI系统中,由于它们之间的混合程度很高,因此似乎很难安排它们-更糟糕的例子之一是,例如,文档编辑器的主窗口小部件,该窗口小部件融合了编辑职责并将其显示在GUI的单个元素中,因此它必须更改并显示(大概)保存在模型层中的文档。此外,可以显示哪些 controller 小部件又取决于模型层的状态,因为某些功能在某些状态下可能会或可能不可用,我们可能希望UI反映出来,这好像是视图(演示)功能。 (根据给定的功能是否可以访问给定的功能或在给定的模型状态下使按钮变灰为灰色)。

如果使用的是几乎所有GUI系统都提供的预制窗口小部件系统,那么最佳的做法是将View(访问)和Controller(变异)所关注的问题尽可能地分开为您提供了一个如此融合的界面?最终,创建诸如包含这些经常混合使用的小部件的窗口之类的东西到底要去哪里?是视图,控制器还是UI系统的其他部分在类别的MVC模式之外?

或者在这里我还想念更多的东西,就像我之前提到的关于发现现有材料相当难以理解的东西一样,这似乎很有可能吗?

(我还要补充一点,如果有的话,将相关的MVVM模式[模型-视图-视图模型]应用于现代GUI系统似乎更容易,因为它们不会拆分访问/突变;但是似乎组织模式的选择不应该取决于您打算针对的特定UI框架,因为那样做会破坏目的。的确,Android似乎非常暗示它通过提供一种称为viewmodel的方法来“希望” MVVM模式除了它的片段和活动(MVVM的视图)之外,MVVM的视图并不受绑定元素和突变元素的这种分离的束缚,尽管如此,对我而言,访问/突变拆分似乎是合乎逻辑的,我要问的只是如何在这些系统中如何实现?)

解决方法

我认为在Model-View-Controller(MVC)模式中,Controller是关于处理事件(例如,用户输入或网络)以及(如有必要)更改模型的,如以下架构模式图所示:

enter image description here

这是有关Android中MVC模式的原始文章,也是基于意见的:

https://medium.com/upday-devs/android-architecture-patterns-part-1-model-view-controller-3baecef5f2b6