8

我经常遇到允许用户获取和设置控制模块操作的各种参数的 API。我现在发现自己正在考虑编写另一个属性 API,但不想重新发明轮子。

以下是典型的基本客户端代码:

setInt("bitrate", 1000);
setEnum("mode", MODE_FAST);
setStr("output file", "music.mp3");

通常可以设置数十个参数,并且此类属性集通常在不断开发中。

一些 API 比其他 API 更智能,更高级的功能包括:

  • 属性的分层分组
  • 属性枚举
  • 具有强制最小值和最大值的数值参数
  • 默认参数值
  • 启用、禁用或只读的设置
  • 动态参数 - 根据其他参数的状态出现、消失、设置最小值/最大值、启用、禁用或只读的设置。
  • 通过 UUID 键而不是文本名称访问的属性

除了上面示例代码中的 C 风格访问器之外,我还遇到了可以:

  • 读取/写入文件的属性(例如 XML)
  • 读/写设置到 Windows 注册表
  • 与系统属性 API 接口,例如IPersistPropertyBag
  • 具有默认的哑 GUI 实现,例如树视图或列表
  • 具有适合最小值/最大值/启用状态的 GUI 扩展,以减少 GUI 代码中的重复。

我很想找到一个设计良好的公共图书馆,它为上述所有内容提供框架,但到目前为止还一片空白。我知道Boost.PropertyTree但它只是一个骨架。还有其他我应该注意的可移植属性 API 框架吗?

4

2 回答 2

2

Qt 属性系统的关键元素之一实际上是变体类型类的一个非常可靠的实现,QVariant它使您能够摆脱 typed setInt, setString... 调用。

如果你持有一个类似的行为良好的类,例如可能是Boost::Variant或类似的东西,使用字符串映射作为支持部分,属性系统相当容易实现。

qt 属性系统的便利之一是您可以覆盖 setter 和 getter 函数,而无需用户知道它们。例如,鉴于您的通用属性设置器是setProperty(name, value). 实现者可以在类声明中表示属性“speed”有自己的设置器setSpeed(float value),这样当您的类的用户调用通用版本时setProperty("speed", 100),系统将调用setSpeed(100)您的实例。

如果您不需要这样的功能,您可能可以实现自己的属性系统。Gamasutra 有一篇关于在 C++ 中实现反射的文章,它也可能对您有所帮助。

于 2011-06-08T16:54:16.923 回答
0

如果你不介意依赖 Qt Core,那么 Qt 有一个设计得相当好的属性系统。这意味着尽管您将依赖 Qt 的MOC

于 2011-06-02T23:28:30.320 回答