4

我有代表部分 HTML 代码的 XML 文件。
这些 XML 文件也有小部件声明。
示例 XML 文件:

 <message id="msg">
   <p>
     <Widget name="foo" type="SomeComplexWidget" attribute="value">
        inner text here, sets another attribute or 
        inserts another widget to the tree if needed...
     </Widget>
   </p>
 </message>

我有一个主要的 Widget 类,我的所有小部件都继承自该类。
问题是我将如何创建它?
这是我的选择:

  1. 创建一个编译时工具,它将解析 XML 文件并创建必要的代码来将小部件绑定到所需的对象。
    • 好处:
      • 不会给系统带来额外的运行时开销。
      • 绑定设置器很容易。
    • 缺点:
      • 向构建链添加另一个步骤。
      • 很难维护,因为系统中的每个小部件都应该添加到解析器中。
      • 使用宏来绑定小部件。
      • 复杂的代码
  2. 找到一种将所有小部件自动注册到工厂的方法。
    • 好处:
      • 所有的绑定都是完全自动完成的。
      • 比选项 1 更容易维护,因为每个新小部件只需要调用注册它的 WidgetFactory 方法。
    • 缺点:
      • 不知道如何在不引入可维护性噩梦的情况下绑定 setter。
      • 增加内存和运行时开销。
      • 复杂的代码

你认为什么更好?各位大神能推荐一个更好的解决方案吗?

4

2 回答 2

1

我不确定您发布的变体,但最简单的方法(不是最有效的,更像是“完成”方法)是为boost::serialization库编写加载包装器。

在这种情况下,您必须调用反序列化例程,指向文件(或其映射部分)并检索可以在小部件容器中注册的构造对象。

请注意,您可能不需要编写适当的保存(序列化)例程,只需编写加载例程即可。

另请注意,您可以将一些简单的(可能是自行实现的)解析器与反序列化例程结合起来,例如,第一个解析器获取与您相关的代码Widget,第二个解析器从中构造一个对象。

于 2010-06-01T17:25:25.227 回答
1

创建工具,将其包含在您的构建步骤中,一切都会好起来的。

有关更多详细信息,请参阅对我之前的答案的评论。

于 2010-06-02T12:16:40.093 回答