ore*_*tis 9 python architecture model-view-controller user-interface wxpython
这将是一个普遍的问题.
我正在努力设计GUI应用程序,尤其是.处理不同部分之间的相互作用.
我不知道应该如何处理共享状态.一方面,共享状态很糟糕,事情应该尽可能明确.另一方面,没有共享状态会在组件之间引入不需要的耦合.
一个例子:
我希望我的应用程序可以通过脚本以Emacs/Vim的方式扩展.显然,需要修改某种共享状态,以便GUI使用它.我最初的计划是有一个可以从任何地方访问的全球"会话",但我不太确定.
一个棘手的用例是键绑定.我希望用户能够从脚本中指定自定义键绑定.每个键绑定映射到一个任意命令,该命令接收会话作为唯一参数.
现在,编辑器组件捕获了按键.它必须能够访问每个会话的键映射,因此需要访问会话.将编辑器与会话结合起来是一个好主意吗?其他组件也需要访问键绑定,因此会话现在变为共享,可以是单个...
关于设计超出MVC的GUI应用程序有什么好的阅读吗?
这是Python和wxPython,FWIW.
[编辑]:添加了具体的用例.
很抱歉这么晚才提出这个问题,但是没有什么比查看具有类似功能的应用程序的源代码更好的了。(我可能会推荐类似http://pida.co.uk 的东西,但是有很多可扩展的 wx+Python IDE,因为这听起来就像你正在做的那样)。
如果我可以做一些笔记:
消息传递本质上并不是坏事,只要组件遵守接口,它就不一定会导致组件之间的耦合。
共享状态本质上并不是坏事,但我会遵循你的直觉并尽可能少地使用。由于宇宙本身是有状态的,因此你无法真正完全避免这种情况。我倾向于使用共享的“Boss”对象,它通常是每个应用程序的非单例单个实例,并负责代理其他组件。
对于键绑定,我倾向于使用某种“动作”系统。操作是用户可以执行的高级操作,例如:“保存当前缓冲区”,并且可以通过工具栏按钮或菜单项在 UI 中方便地表示它们。因此,您的脚本/插件创建操作,并将它们注册到中心的东西(例如某种注册表对象 - 参见 1 和 2)。他们的参与到此为止。除此之外,您还有某种将键映射到操作的键绑定服务(它从注册表、每个会话或其他方式列出)。这样,您就实现了插件和键绑定代码的分离、编辑器和操作代码的分离。作为额外的好处,您的“配置快捷方式”或“用户定义的按键映射”任务变得特别容易。
我可以继续说下去,但我要说的大部分内容都在 PIDA 代码库中,所以回到我原来的观点......