2010-01-15 96 views
4

我目前完成了一个需要使用C++将数据库信息写入XML的项目的两个阶段之一。虽然使用第三方工具来进行XML标签和数据的实际格式化,但我仍然需要设计一个模型以及业务逻辑来获取数据库表并将它们映射到XML结构中。有没有更好的设计模式/方法使用?

为此,我最终为每个XML结构创建了一个单独的类,导致了大量的类(〜75)。每个类都具有如何读取关联表的知识,并通过第三方工具将自身序列化为XML。最后,系统运行良好(按时和预算),输出错误非常容易找到。

第二阶段几乎完全相同,但不是格式化文本,而是二进制数据。因此,虽然我仍在考虑使用第一阶段中使用的相同策略,但我想问,是否会有更好的方法或设计模式来解决这个问题?尤其是,由于第一阶段的某些XML类别中存在大量的依赖关系,因此单元测试非常困难。

+3

有趣的问题......你为什么选择使用C++和那个工具? - 只是好奇。 – 2010-01-15 15:58:31

+1

我正在使用C++,因为原始系统在SPARC系统上以C++编码,需要将其集成到工具集中。我应该注意到,阶段二的类和数据结构与阶段一不同。所以我不能重复使用它们中的任何一个。因此,为什么我正在寻找一种方法/模式来减少与第一阶段相比我必须编写的新代码的数量。 – Matthew 2010-01-15 16:32:32

+0

您好马修,它现在“闻起来”更多,现在是一个很好的应用程序的发电机或至少一个框架,简化了大量的类的实施...也从您的描述,我仍然不确定,如果你得到你的内部代表权。我认为这应该完全独立于XML - 只有某些作者应该完成XML /二进制部分。正如大卫所写,访问者会很棒 - 但它也可能是基类,特殊界面等的一部分。 – Juergen 2010-01-15 16:58:48

回答

1

的其他的想法,也可能适合:

当性能不是问题,也可以使用通用的数据容器。通用数据容器可以指定一个节点(如XML节点或对象,甚至是表格​​条目)并只存储这样一个容器。

这样,~75类可以被一个或少数几个替代。像序列化这样的服务也可以通用的方式提供。

因此,不同的实例可以扮演不同类别仍然扮演的角色。

尽我所知,所使用的数据基元相当直接且有限。所以这可以实现得相当简单。

+0

我认为你钉了它与这个答案Juergen头,谢谢。 – Matthew 2010-01-15 20:50:51

2

构建一个生成器 - 如果可能的话 - 自动生成类。

生成器当然可以由指定数据如何存储在数据库中的规范语言提供。

这涉及到如何尽可能均匀地存储数据。

更好的是(在开发效率的意义上 - 不是在教育/模式学习意义上):使用已经存在的开发工具(开源或商用开发工具)。

编辑: 有几个图书馆/框架应该做这种工作。尽管我读过书,但还是使用了一个图书馆 - 但它接近它并没有做太多。有持久性层/框架来从数据中写入OO数据。 XML数据不是别的面向对象的表示。可能是,你已经编写了一个图层来达到完整的目标,但使用第三方产品可能是有益的(在许多情况下)。

7

您正在描述Visitor模式的经典应用。您需要两个目的来遍历对象模型,一次输出XML,另一次输出二进制数据。这在gang of four's book中有很好的解释。

模型的每个元素都必须接受一个识别类型的访问者(通常为IVisitor),然后它会调用此访问者通常调用的方法AcceptVisitor。这是将对象转换为XML,二进制数据,可打印格式或其他方法的方法。它也可能引导访问者访问子对象等等。然后你编写一个实现IVisitorXmlVisitor,并用它“访问”你的结构 - 结果是XML。相似地,您可以通过BinaryVisitor“访问”并获得二进制输出。

+0

我从不抱怨得到-1s,但很高兴知道为什么如果答案有问题......有人想详细说明一下吗? – 2010-01-15 16:12:44

+0

伟大的答案大卫,但在这种情况下,我无法重用阶段一中使用的原始〜75类,因为阶段二中的数据结构略有不同。如果我需要更改第一阶段的输出格式,我将继续保留您的建议以供进一步使用。 – Matthew 2010-01-15 16:52:33

+0

嗨大卫,访问者模式是一个好主意,但至少它不会帮助从SQL数据库读取数据的问题。在这种情况下,这不是一个“经典应用程序”。我没有看到,如果OP真正理解他的问题,因为他写道,如果XML将是他的内部表示。在这种情况下,首先得到他的内部代表是正确的,而不是考虑访客模式(我会预见不是一个更好的实现,但它可能会更糟糕......) – Juergen 2010-01-15 16:54:58

相关问题