代码之家  ›  专栏  ›  技术社区  ›  Anurag Uniyal

如何分离小部件的模型/视图

  •  2
  • Anurag Uniyal  · 技术社区  · 15 年前

    我正在编写一个应用程序,用于绘制小部件/菜单/控件等以创建应用程序模型。每个屏幕都表示为小部件的集合,并且每个小部件都是简单的类,例如

    class Model(object):
        def __init__(self):
            self.widgets = []
    
    class Widget(object):
        def __init__(self):
            self.x, self.y = 0, 0
            self.w, self.h = 100,20
            self.text = "Widget"
    

    现在,用户可以在编辑器中编辑x、y、w、h,并在许多视图(位置)中渲染它,渲染本身可能会更改w和h,因为我们希望至少显示最佳匹配。 例如,在不同的视图中,文本“小部件”可能需要宽度200或205。

    问题:

    所以问题是渲染/视图本身修改了模型,如何避免呢?现在我有了主视图和主模型,任何其他视图如果想渲染副本模型并渲染它,就避免了主模型中的更改。

    这种方法很简单,代码也很简单,但需要不必要的模型副本,我已经考虑了很多避免这种情况的方法,但是所有方法都会使代码复杂化,而且可能没有那么有效,因为无论如何,如果不复制模型,则渲染时间属性需要放置在某个地方,例如每个小部件的每个渲染器中。

    我正在用Python实现它,但这与答案无关。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Ned Batchelder    15 年前

    如果模型中渲染更改的唯一内容是x、y、w、h,那么您有几个选项:

    1. 复制这些字段:x、y、w、h和x_-drawn、y_-drawn等。渲染可以更改绘制的值,并使模型不介意它们已更改。例如,保存模型时,不要保存绘制的值。然后模型可以在渲染过程中更改,但这并不重要。

    2. 将X、Y、W、H移动到renderedgeometry类中,并为每个模型提供一个实例。现在您仍然可以复制模型,但它可以是一个浅副本,再加上renderedgeometry类的一个新副本,从而减少了必须复制的数量。

    3. 将字段复制到一组X_原始字段和Y_原始字段中。在渲染之前,将x,y复制到\u原始字段中。渲染后,将它们复制回去。模型实例本身不需要复制,只需要复制少量数据。