【问题标题】:Determining the representation-class for a data object based on its specialized type? [closed]根据特定类型确定数据对象的表示类? [关闭]
【发布时间】:2010-07-08 20:22:59
【问题描述】:

我倾向于有一个类来描述一个一般概念和子类来描述该概念的差异。例如,Polygon Rectangle、Triangle 等}。

然而,我经常发现我有这些层次结构的各种表示。例如,我想将图形表示(例如,QPolygon)或物理表示(质量、centerOfMass)等与我拥有的另一个表示分开。

在我的例子中,我有一个纯数据对象的层次结构(Command WaitCommand,UnknownCommand,等等}),并且每个数据类都有一个匹配的 GUI 表示(WaitCommandPanel, UnknownCommandPanel)。

我的问题是,一旦我构建了数据表示,我需要实现从数据到 GUI 的飞跃

给定一个数据对象列表,我希望能够构造相应的 GUI 元素,但将两种表示分开。

一个[糟糕的]解决方案是让每个Command 有能力(即Command::getPanel())返回其GUI 表示。我不喜欢这样,因为我的数据类现在有表示代码。

另一个解决方案(我暂时采用的)是进行查找。也就是说,在启动 GUI 时,给定 Commands 的列表(泛化),该函数根据其特殊类型确定要创建的对象。我也不喜欢这个。

有什么建议吗?

【问题讨论】:

    标签: design-patterns oop code-separation


    【解决方案1】:

    恕我直言,数据类和渲染类都没有责任决定将哪个渲染器用于给定的数据对象。我更喜欢你的第二个选择。我通常使用将数据类型映射到渲染器类的映射。另请注意,此类映射是特定于上下文的(Web 渲染将使用与 destop 应用程序或健身上下文不同的渲染器)。

    这种映射可以自动构建,例如使用属性(在 .Net 中)或命名约定(在 Lua 中)。或者使用外部 XML-config 文件。

    总结:必须有人做出决定,根据 SRP,渲染器和数据对象都不应为此负责。这种逻辑是特定于应用程序上下文的,因此应该“高于”这两个参与者(即渲染器和数据)。

    【讨论】:

    • 我已经为我的 GUI 做了套娃(主窗口有项目面板,项目面板有命令面板等)。每个级别都不知道它嵌套在哪里/上面的级别。但是,每个级别都知道下面的级别(这是较低级别存在的上下文)我想我会把它留给面板用于决定的级别。我不需要任何花哨的 XML,因为类的配对不会改变(X 将始终使用XPanel 作为 GUI 表示。)此外,这很容易在 python 中使用字典进行关联:type(X) => XPanel 的构造函数。谢谢。
    • 特别是对于 Python,您可以使用命名约定来进行关联。遍历范围并填充您的渲染器查找图,以便将任何类型的表单 (?.*)Renderer 注册为:type(obj) => type(objRenderer)。这样您只需要定义类 MyData 和 MyDataRenderer - 它们将自动关联。 (恕我直言,这种方法很酷,但不实用 - 会导致比它解决的问题更多的问题)
    【解决方案2】:

    您可能希望研究使用控制反转 (IoC) 容器来构建您的类。

    每个类都包含其关联类的接口。然后,IoC 容器会根据您的配置方式将该类的实现注入到您的对象中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 2017-04-30
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多