【问题标题】:How to construct objects based on XML code?如何基于 XML 代码构造对象?
【发布时间】:2010-06-01 17:09:06
【问题描述】:

我有代表 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。
      • 增加内存和运行时开销。
      • 复杂代码

你觉得哪个更好?你们能提出更好的解决方案吗?

【问题讨论】:

    标签: c++ factory factory-pattern


    【解决方案1】:

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

    更多详情请参见我之前的回答。

    【讨论】:

      【解决方案2】:

      我不确定您发布的变体,但最简单的方法(不是最有效的,更像 "get-it-done" 方法)将为boost::serialization 库编写加载包装器。

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

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

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

      【讨论】:

      • 嗯,这可能是个好主意。序列化是仅标头库吗?你能告诉我一个符合我要求的代码 sn-p 吗?我需要为每个小部件添加一个加载包装器吗?另外这种方法有什么好处?有什么不足?
      • 1) 不是,你必须链接适当的静态库 2) 不是那么简单,因为如果你想保存你当前的 xml 格式,你必须编写专门的方法来解析你的 xml 文件,如果您同意使用 boost xml-files,那会容易得多。 3) 如果你写一些简单的包装器,你可能会得到类似widgets.Add(Deserialize("file.xml")); 的东西 4) 序列化技术的优点在整个网络上都有讨论,在这里它们仍然存在。其中主要是您不必拥有一些外部工具,并且编写标准序列化代码非常快
      • 5) 缺点也很明显——拥有静态库(尤其是在boost 情况下可能会让人头疼;速度(如果谈论.xml 文件,二进制序列化要快得多)不足以序列化/反序列化巨型对象;另外,boost-xml-serialized 对象的格式不像您发布的 xml 代码那么明显(但仍然可编辑且易于理解)
      • @Kotti:问题是我需要为系统中的每个小部件编写序列化函数吗?并非所有小部件都共享相同的设置器。
      • @the_drow 这可能是个好主意,Qt 的工作方式如下。我以前从未这样做过,我认为你需要玩很多宏/等,但我可以说它比小部件工厂好(在代码复杂度方面)。
      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多