组织一个GUI应用程序

9
这是一个通用问题。
我在设计GUI应用程序方面遇到了困难,特别是在处理不同部分之间的交互时。
我不知道我该如何处理共享状态。一方面,共享状态很糟糕,事情应该尽可能明确。另一方面,没有共享状态会引入组件之间不必要的耦合。
例如:
我希望我的应用程序可以通过脚本以类似于Emacs / Vim的方式进行扩展。显然,需要修改某种共享状态,以便GUI将使用它。我的初始计划是拥有一个全局“会话”,可以从任何地方访问,但我对此并不确定。
一个棘手的用例是键绑定。我希望用户能够从脚本中指定自定义键绑定。每个键绑定映射到一个任意命令,该命令接收会话作为唯一参数。
现在,编辑器组件捕获按键。它必须访问键映射,这些映射是每个会话的,因此它需要访问会话。将编辑器与会话耦合在一起是一个好主意吗?其他组件也需要访问键绑定,因此会话现在变成了共享对象,并且可以是单例...
有没有关于设计GUI应用程序的良好阅读材料,超越MVC?
这是Python和wxPython,FWIW。
[编辑]:添加具体用例。
3个回答

2
抱歉回答这个问题有些晚了,但是没有什么,我是说没有什么比查看执行类似操作的应用程序源代码更好的了。(我可能会推荐像http://pida.co.uk这样的可扩展wx+Python IDE,不过有很多其他的IDE也可以满足您的需求)。
如果我可以提出一些建议:
  1. 消息传递本身并不是不好的,只要组件遵守接口,就不会导致组件之间的耦合。

  2. 共享状态本身并不是不好的,但是我会听从您的直觉,尽可能少地使用它。由于宇宙本身是有状态的,所以您无法完全避免这种情况。我倾向于使用一个共享的“Boss”对象,通常是每个应用程序的非单例单个实例,并负责调解其他组件。

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

我可以继续说下去,但是我大部分要说的都在PIDA代码库中,所以回到我的原始观点...

2

如果你已经研究了MVC,那么你可能正在朝着正确的方向前进。MVC、MVP、被动视图和监控控制器都是实现你要达成目标的不同方式,每种方式都有其优缺点。我发现被动视图是“理想”的,但它会导致你在GUI接口(即IInterface)中引入过多的小部件。总的来说,我认为监控控制器是一个不错的折衷方案。


1

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

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

您的脚本可以:

1)更新Model对象。这很好。Control可以是模型对象的“观察者”,并且View将更新以反映观察到的更改。

2)更新Control对象。这不太好,但是Control对象可以对Model和/或View进行适当的更改。

我不确定MVC存在什么问题。您能否提供更详细的设计示例,并指出具体的问题或关注点?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接