【问题标题】:How would you implement attribute lists? [closed]您将如何实现属性列表? [关闭]
【发布时间】:2023-04-02 14:50:01
【问题描述】:

当谈到属性列表时,我指的是一个通用列表,它存储了一个类的附加信息。

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

您将如何实现这样的属性列表?
是否有任何设计模式或库可以做类似的事情?

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

属性列表可以用于类需要具有动态属性并且用户不想为每个属性继承的情况。
如果这有帮助,您可以查看我与该主题相关的其他问题:
Attributelists or inheritance jungle?

编辑:
当然我忘记了一些信息(感谢 cmets):
这些属性可以应用于对象。同一类的对象可能有不同的属性。对象具有的属性可以更改(值可以更改,可能添加/删除属性)
希望这能澄清一点。

【问题讨论】:

  • 这些“属性”是每个类还是每个对象?属性是否有可能在运行时发生变化?你打算如何使用属性?这是一个有趣的问题,但您没有详细说明属性列表的要求。
  • 在 silico 上是对的 - 您可以根据您的实际要求来设计它,包括运行时灵活性、内存使用、性能等。它可能是 enums/strings/ints/boost::any 的映射来提升: :any、变体、抽象基类等,或者如果您认为您之前关于在此类“属性列表”和继承之间进行选择的问题是相关的,那么它意味着要求更加模糊。

标签: c++ design-patterns class-design


【解决方案1】:

我做了类似的事情。

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

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

不要将属性用作存储类数据成员的常规方式。如果你这样做,调试将成为一场噩梦,因为很难看到你的类中的实际值是什么。放置观察点也将变得不可能。

仅使用这些属性来存储无法放入普通数据成员的内容,例如: - 您事先不知道属性(例如,它们可能是特定于客户的) - 你不想在两个类之间引入依赖关系(即使是名称)

【讨论】:

    【解决方案2】:

    看看 Boost Property Map 中的dynamic property maps

    动态属性映射 解决对接口的需求 属性映射,其检查是 延迟到运行时。几个组件 结合起来为动态提供支持 属性图。动态属性 类收集了一组异类 建模概念的对象 Boost 属性映射库。每个 属性映射被分配一个 添加时基于字符串的键 集合,它可以是 使用该密钥解决。在内部, dynamic_properties 适应每个 包含的属性映射与 动态属性映射接口,其中 提供 get 和 put 函数 可以使用任何类型的值调用 满足一些要求。 在内部,动态属性映射 转换键值对以满足 底层证券的要求 属性映射或发出运行时信号 如果不能,则例外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2010-09-05
      相关资源
      最近更新 更多