我在使用 Python 制作“比简单的脚本和东西更大”的应用程序时遇到了一些问题。我有一个叫做 WinMain 的类,一个叫做 Engine 的类,一个叫做 State,另一个叫做 Element。它的布局是这样的:

WinMain 是程序的主类,它有一个 mainLoop 函数和其他各种东西。

引擎是一个包含图像和渲染代码等数据的对象。

State 是一个由 Engine 持有的对象,每次调用 Engine 的 step 函数时都会调用它的 update 方法。

元素是 State 持有的对象,例如 gui 按钮和要渲染的图片。

由于我的渲染功能在 Engine 中,我将如何让我的元素(由状态持有)来渲染事物?我想我可以为每个 Element 提供 Engine 的实例,但这似乎有点麻烦,因为我必须做这样的事情:picture = Element(engine, (0, 0), 'gui_image')(不好)

我宁愿做 picture = Element((0, 0), 'gui_image'),还有一些如何让 Element 使用 Engine 渲染事物的方法。

这似乎是我在开始的大多数项目中遇到的一个主要结构性问题,而且我似乎无法找到解决方法(除了通过类和函数的参数传递大量变量)。我该怎么做?

最佳答案



这听起来像是一个上帝类:它们在 GUI 代码中很常见,而您遇到的问题就是它的常见影响。

Engine 中不同东西之间的概念关系是什么?它是否需要紧密耦合,或者引擎可以只是在状态、渲染器和其他一些东西之间进行协调?

然而,这一点崩溃了,通过状态机传递引擎(或渲染器,或其他)是避免当前架构全局(或单例)的唯一方法。

打破这种依赖关系的常用方法是使用类似 MVC(模型/ View / Controller )模式的东西。具体来说,听起来引擎已经大致是一个 Controller ,状态和元素已经覆盖了模型部分。然而,引擎、状态和元素也在处理渲染/表示部分:这引入了耦合。

如果你能找到一种方法将 State 的变化发布给某个观察者(故意留下那个模糊的,因为我们不希望 State 逻辑过于依赖观察者的细节),你可以让一个 Renderer 监听 State(模型)更新并绘制它们。现在,观察者可以是你想要的任何东西,所以它很容易模拟,而且它也与引擎分离。

关于Python 结构问题 : Giving an 'engine' class to everything,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12848684/

10-13 06:41