我目前已经完成了一个项目的两个阶段之一,需要我使用C ++将数据库信息写入XML。虽然使用第三方工具来实际格式化XML标签和数据,但我仍然需要设计一个模型以及业务逻辑来获取数据库表并将它们映射到XML结构中。
为此,我最终为每个XML结构创建了一个单独的类,从而产生了大量的类(~75)。每个类都知道如何读取其关联表并通过第三方工具将自身序列化为XML。最后,系统运行良好(按时和按预算),输出错误非常容易找到。
第二阶段几乎完全相同,但它不是格式化文本,而是二进制数据。因此,虽然我仍在考虑使用第一阶段使用的相同策略,但我想询问一下,这是一个更好的方法或设计模式,可以解决这个问题吗?特别是,由于第一阶段中某些XML类的大量依赖性,单元测试非常困难。
答案 0 :(得分:7)
您正在描述Visitor模式的经典应用程序。您需要两个目的来遍历对象模型,一次输出XML,另一次输出二进制数据。在gang of four's book中已经很好地解释了这一点。
模型的每个元素都必须接受具有已识别类型的访问者(通常为IVisitor
),然后在此访问者上调用通常为AcceptVisitor
的方法。这是将对象转换为XML,二进制数据,可打印格式等的方法。然后它也可以将访问者引导到子对象等等。然后你编写一个实现XmlVisitor
的{{1}},并用它“访问”你的结构 - 结果是XML。同样,您可以使用IVisitor
“访问”并获取二进制输出。
答案 1 :(得分:2)
构建生成器 - 如果可能 - 自动生成类。
当然,生成器可以通过规范语言提供,该语言指定数据如何存储在数据库中。
这涉及考虑如何尽可能统一地存储数据。
更好(从发展效率的角度来看 - 不是在教育/模式学习的意义上):使用已经存在的发电机(开源或商业发电机)。
编辑: 有几个库/框架应该完成这些工作。你还在使用一个库,就像我读到的那样 - 但它接触它并没有那么多。存在用于从/向数据写入OO数据的持久性层/框架。 XML数据不再是面向对象的表示。可能是,您已经编写了一个层来达到完整目标,但使用第三方产品可能是有益的(在许多情况下)。
答案 2 :(得分:1)
另一个想法,也可能适合:
如果性能不是问题,也可以使用通用数据容器。通用数据容器可以采用一个节点的规范(如XML节点或对象甚至表条目),只存储这样的容器。
这样,~75个类可以被一个或几个替换。序列化等服务也可以通用方式提供。
因此,不同的实例可以扮演不同类别现在仍然扮演的角色。
据我所知,所使用的数据原语相当直接且有限。所以这可以很简单地实现。