设计问题:持有动态查找的类元数据

时间:2010-04-13 18:25:08

标签: c++ design-patterns oop qt4

我有几个基类/接口类,每个类都有几个派生类。我需要在每个派生类上存储元数据,这些派生类有很多重叠,但值不同。

我还有一个Factory类,用于创建派生类的实例,这些派生类实现为单例并具有一些宏。例如,您:

REGISTER_COMPONENT("MyComponent", MyComponentClass);
// create an instance of each component
BaseComponent *base;
foreach(QString component, ComponentRegister::componentList())
{
  base = ComponentRegister::create(component);
  // do stuff with base
}

问题是:从稳固的设计角度来存储元数据的方式和位置。

我可以将数据作为QMap结构存储在ComponentRegister中。当有人注册组件时,他们也可以用

之类的东西注册其元数据
REGISTER_COMPONENT_METADATA("MyComponent", MyMap);

如果特定键的QVariant :: isValid(),您知道元数据已设置且可用。

另一种方法是静态类变量或静态类QMap。

我看到了两者的优点和缺点。大多数元数据都是“这个类的QResources的路径”,它没有与类本身的业务逻辑紧密耦合。

静态类变量方法的另一个问题是继承。您不能像使用纯虚函数那样强制覆盖静态类变量。因此,如果有人忘记了......可能不清楚继承树中的值来自何处。如果您需要通过一系列纯虚拟“getter”访问元数据,那么MetaData的设置将分布在Base类的所有实现中。

如果您需要进行更改(例如更改资源的根路径),则在Register中保存,设置和查找数据,您可以在单点注册调用中执行此操作...可能是标头或包含在应用程序实用程序功能中。使用静态数据,您必须编辑每个类声明。

欢迎提出建议并致谢!

1 个答案:

答案 0 :(得分:0)

如果与对象相关的数据不是特定于单个实例的,作为示例中的路径,我的设计通常包含一个管理我的对象集合的类。这就是我放置元数据的地方。

示例:

class zoo { std::vector<animals> zoo_animals; size_t count; }

count是关于动物的元数据。