OO设计 - 传播属性

时间:2009-04-01 13:24:07

标签: c++ oop

我是一位经验丰富的C程序员,在OO设计中蘸我的脚趾(特别是C ++)。我有一段我讨厌的特定代码,并希望使用C ++进行清理。

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

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

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

虽然OO设计的某些方面突然出现在我身上,但我很想听到:

  1. 我怎样才能最好地实现能够将一个函数指针传递给列表(或者向量 - 这样的列表的STL向量是否正常?)

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

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

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

  5. 我意识到这是一个冗长而广泛的问题,所以感谢您对上述任何问题的看法。 谢谢!

3 个答案:

答案 0 :(得分:2)

1)使用boost::function和stl算法,例如for_each count_if
2)从视图中划分模型。一切都会安好的。
3)GoF design pattern Composite
4)要对变化做出反应,请查看GoF design pattern Observer

答案 1 :(得分:0)

  1. 你可以拥有你的函数指针,但通常在OO中每个对象应该知道如何处理它的数据,并且特殊c(l)的多态性为(s)es

答案 2 :(得分:0)

至你的要点

1:我怎样才能最好地实现能够将一个函数指针传递给列表(或者向量 - 这样的列表的STL向量是否正常?)

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

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

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

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

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

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

此功能听起来应该是Renderer类的一部分。这个类将遍历你的链表(或树),并在每个类上调用上面提到的'draw'方法。它也可以执行诸如定义了给定属性的最后一个祖先的缓存属性之类的事情。这应该允许覆盖您正在描述的属性或特征。

一般

虽然不能直接应用,但检查现有的OO GUI系统可能会有所帮助。 Java.NET都有几个。