9

这将是一个通用的问题。组织GUI应用程序

我很努力地设计一个GUI应用程序,处理不同部分之间的相互作用。

我不知道我应该如何处理共享状态。一方面,共享状态不好,事情应尽可能明确。另一方面,没有共享状态会在组件之间引入不必要的耦合。

一个例子:

我想我的应用程序能够伸出的一个Emacs/Vim的排序的方式,通过脚本。显然,某种共享状态需要修改,以便GUI将使用它。我最初的计划是从全球各地进行全球“会议”,但我不太确定。

一个棘手的用例是键绑定。我希望用户能够从脚本指定自定义的键绑定。每个键绑定映射到一个任意的命令,它接收会话作为唯一的参数。

现在,编辑器组件捕获按键。它必须能够访问每个会话的keymappings,因此它需要访问会话。将编辑与会话耦合是一个好主意吗?其他组件也将需要访问键绑定,所以会话现在变成共享,并且可以是单身...

有没有什么好的关于设计超越MVC的GUI应用程序的阅读?

这是Python和wxPython,FWIW。

[编辑]:增加了具体的用例。

回答

3

对不起,这么晚就跳到这个问题上了,但没有,我的意思是什么也没有可以击败查看类似的应用程序的来源。 (我可能会推荐类似http://pida.co.uk的东西,但是有很多可扩展的wx + Python IDEs,因为这听起来像你正在做的)。

如果我可能会几点注意事项:

  1. 消息传递本身不是坏的,它并不一定导致组件之间的耦合,只要组件坚持接口。

  2. 共享状态本质上并不坏,但我会尽可能地与你的直觉一起去使用。既然宇宙本身是有状态的,你完全无法完全避免这种情况。我倾向于使用共享的“Boss”对象,该对象通常是每个应用程序的非单例实例,并负责中介其他组件。

  3. 对于键绑定,我倾向于使用某种“操作”系统。操作是用户可以执行的高级事情,例如:“保存当前缓冲区”,并且可以通过工具栏按钮或菜单项在UI中方便地表示它们。所以你的脚本/插件会创建动作,并将它们注册到一些中心的东西(例如某种注册表对象 - 请参阅1和2)。他们的参与就此结束。除此之外,您还拥有某种键绑定服务,可将键映射到操作(从注册表中列出,按会话或其他方式)。这样你就实现了插件和键绑定代码的分离,编辑器和动作代码的分离。作为额外的奖励,您的“配置快捷方式”或“用户定义的关键地图”的任务变得特别容易。

我可以继续下去,但大部分是我要说的是在PIDA的codebase,所以回到我原来的点...

2

如果你看过MVC,你可能正朝着正确的方向前进。 MVC,MVP,被动视图,监督控制器。这些都是不同的方式,每种方式都有自己的优点和缺点,可以完成你所追求的目标。我发现被动视图是“理想的”,但它会导致你在GUI界面中引入太多的小部件(即IInterface)。总的来说,我发现监督控制器是一个很好的折衷方案。

1

在MVC中,Model stuff 的信息共享状态。

控件是GUI控件设置和对鼠标点击和响应的共享状态。

您的脚本角度可以是

1)更新模型对象。这很好。控件可以是模型对象的“观察者”,并且可以更新视图以反映观察到的更改。

2)更新控制对象。这不太好,但是...控制对象可以对模型和/或视图进行适当的更改。

我不确定MVC出现什么问题。你能否提供一个更具体的设计例子来解决具体的问题或疑虑?