2010-10-19 52 views
1

当谈到属性列表时,我的意思是存储一个类的附加信息的通用列表。你将如何实现属性列表?

最简单的情况:
一个班有一个std::map<std::string, std::string>。第一个字符串命名属性(如"Color"),第二个字符串描述该值(如"Yellow")。
在本例中,使用这些属性的另一个类需要检查映射中是否存在某个特定的属性名称,然后解析该值。
但是,在谈论性能时,这不是最好的概念。

你将如何实现这样一个属性列表?
是否有任何设计模式或库只是做这样的事情?

我特别感兴趣的是C++ - 这样做的方式,但是如果有独立于语言的解决方案,请发布它们。

在类需要动态属性且用户不想为每个属性继承的情况下,可以使用属性列表。
是否有帮助,你可以检查我的有关该主题的其他问题:
Attributelists or inheritance jungle?

编辑:
当然,我忘了一些资料(多亏了注释):
的属性可以被应用到对象。对于同一类的对象可能有不同的属性。对象所具有的属性可能会发生变化(值可能会更改,可能会添加/删除属性)
希望这可以让我们更清楚一点。

+0

这些“属性”是每个类还是它们是每个对象?属性在运行时可能会发生变化吗?你打算如何使用属性?这是一个有趣的问题,但是你没有详细说明属性列表的要求。 – 2010-10-19 06:44:33

+0

在硅片的权利 - 你设计这个基于你的实际要求重新运行的灵活性,内存使用情况,性能等..它可能是一个枚举/字符串/ ints/boost的任何地图:: boost :: any,variants,abstract base类,等等,或者如果你认为你之前关于在这样的“属性列表”和继承之间进行选择的问题是相关的,那么它意味着需求甚至是模糊的。 – 2010-10-19 07:05:43

回答

2

我做了类似的事情。

如果这些属性对于您的类的所有实例都是通用的,请对您的类进行单独的元描述,以在其中描述属性。然后,每个实例提供一个类型为boost :: any的简单向量(我不使用boost :: any,而是我们自己写的类似的东西)。

如果每个实例的属性可能不同,请为每个实例创建一个映射,其中键是原子,值为boost :: any(或类似的东西)。在Windows下原子是一种字符串的数字表示形式。首先使用字符串来表示“属性名称”,然后将其转换为原子并将其用作地图中的键。使用数字原子而不是字符串将加快地图中属性的查找(只要您将原子值保存在某处,并且每次需要属性值时都不需要执行字符串到原子的查找)。

不要使用属性作为存储类数据成员的常规方式。如果你这样做,调试将变成一场噩梦,因为你很难看出你班级的实际价值。同时把观察点也将变得不可能。

仅使用这些属性来存储你不能把一个正常的数据成员的东西,如: - 你不知道的属性事先(例如,它们可以是客户特定的) - 你不希望引入两个类别之间的依赖关系(即使通过名称)

1

请在Boost Property Map中查看dynamic property maps

动态属性具体映射 地址需要到 属性映射,其检查是 延迟到运行时的接口。几个组件 结合起来提供对动态 属性映射的支持。 dynamic_properties 类收集一组异构 对象,该对象为 Boost Property Map库中的概念建模。每个 属性映射图被分配一个 字符串密钥,当它被添加到 集合中时,它可以使用该密钥寻址到 。在内部, dynamic_properties将每个 包含的属性有图有 动态属性映射接口, 提供get和put 可以使用任何类型的 满足几个要求的值来调用的函数。 在内部,动态属性图 将键和值对转换为符合 属性图的要求,或者如果不能,则会通知运行时发生异常 异常。