【问题标题】:OO design - propagating attributesOO 设计 - 传播属性
【发布时间】:2009-04-01 13:24:06
【问题描述】:

我是一名经验丰富的 C 程序员,涉足 OO 设计(特别是 C++)。我有一段特别讨厌的代码,想用 C++ 来清理。

代码实现了一个用于 3D 图形应用程序的显示树。它是条目的链接列表,其中有一个类型字段,指定条目是窗口、几何特征还是灯光等。特别是几何特征可以是子特征集合的单个几何,由存在一个单独的结构。

作为一个链表,它是一个平面结构,但顺序意味着层次结构。此外,每个条目都有一个属性结构,可以在列表中向下传播。

一个单独的函数允许遍历此列表,并在遍历列表时执行提供的函数指针。以这种方式使用的每个函数都必须适当注意维护属性结构,因为它在列表中传播,这是呈现错误的常见原因(通常没有意识到它们应该被重绘,因为它们是一组条目的一部分,例如)

虽然 OO 设计的某些方面让我眼前一亮,但我很想听听:

  1. 我将如何最好地实现能够将函数指针向下传递到列表(或向量 - STL 向量适用于这样的列表吗?)

  2. 将窗口和几何特征实现为相关(甚至相同)类是否正确

  3. 如何最好地设计一个可以拥有自己的集合的类

  4. 关于对象之间属性转移的任何建议(例如颜色、比例)。期望的行为是修改特征将改变该特征及其包含的任何子特征的属性,而修改子特征只会修改该特征。

我知道这是一个冗长而广泛的问题,因此感谢您对上述任何问题的看法。 谢谢!

【问题讨论】:

    标签: c++ oop


    【解决方案1】:

    1) 使用boost::functionfor_each count_if 等stl 算法
    2)从视图中划分模型。会没事的。
    3) GoF design pattern Composite
    4) 要对更改做出反应,请查看GoF design pattern Observer

    【讨论】:

      【解决方案2】:
      1. 你可以有你的函数指针,但通常在 OO 中每个对象都应该知道如何处理它的数据,并且对于特殊的 c(l)as(s)es 存在多态性

      【讨论】:

        【解决方案3】:

        你的观点

        1:我将如何最好地实现能够将函数指针向下传递到列表(或向量 - STL 向量是否适用于这样的列表?)

        不要。改用一个接口(或多个接口)。使用所有类都可以实现的“draw”方法创建一个“Renderable”接口。您需要多个接口,或具有不同名称和方法集的接口。

        2:将窗口和几何特征实现为相关(甚至相同)类是否正确

        我不确定您的“几何特征”到底是什么,但这可能是子类化的情况。创建一个“显示”类,它可以由您的各种几何要素类和窗口类进行子类化。另一方面,您可能将模型和视图混为一谈(请参阅MVC)。

        3:如何最好地设计一个可以拥有自己的集合的类

        您可能希望该集合属于上面提到的“显示”超类(或您为超类选择的任何内容),甚至可能是一个接口。这在 GUI 框架中经常发生。

        4:关于对象之间属性传递的任何建议(例如颜色、比例)。期望的行为是修改一个特征将改变该特征及其包含的任何子特征的属性,而修改子特征只会修改该特征

        这个功能听起来应该是 Renderer 类的一部分。此类将遍历您的链表(或树)并在每个类上调用上述“绘制”方法。它还可以做一些事情,比如从定义了给定属性的最后一个祖先缓存属性。这应该允许覆盖您所描述的那种属性或功能。

        一般

        虽然不直接适用,但检查现有的 OO GUI 系统可能对您有指导意义。 Java.NET 都有几个。

        【讨论】:

          猜你喜欢
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 2011-12-15
          • 2010-12-13
          相关资源
          最近更新 更多