【问题标题】:How to decouple model/view for widgets如何解耦小部件的模型/视图
【发布时间】:2009-09-12 04:07:22
【问题描述】:

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

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 中实现它,但这与答案无关。

【问题讨论】:

    标签: design-patterns model model-view-controller


    【解决方案1】:

    如果模型中渲染变化的唯一因素是 x,y,w,h,那么您有几个选择:

    1. 复制这些字段:x、y、w、h 和 x_drawn、y_drawn 等。渲染可以更改 _drawn 值,并使您的模型不介意它们已更改。例如,保存模型时,不要保存 _drawn 值。然后模型可以在渲染过程中改变,但没关系。

    2. 将 x,y,w,h 移动到 RenderedGeometry 类中,并为每个模型提供一个实例。现在您仍然可以复制模型,但它可以是浅拷贝,加上 RenderedGeometry 类的新副本,从而减少了您必须复制的数量。

    3. 将这些字段复制到一组 x_original、y_original 字段中。在渲染之前,将 x,y 复制到 _original 字段中。渲染后,将它们复制回来。模型实例本身不需要复制,只需少量数据即可。

    【讨论】:

    • +1 用于 3 个选项,但我认为这三个选项都会使代码复杂化,数字 1 本来很有希望,但我在线程中进行渲染也意味着我可能需要每个渲染器 x_drawn,这将进一步把事情复杂化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多