2008-08-14 57 views
6

有没有人推荐过一种设计模式来获取二进制数据文件,将其中的一部分解析成对象并将结果数据存储到数据库中?解析二进制文件数据和存储在数据库中的设计模式

我认为可以使用类似的模式来获取XML或制表符分隔的文件并将其解析为代表性的对象。

一个常见的数据结构将包括:

(报头)(DataElement1)(DataElement1SubData1)(DataElement1SubData2)(DataElement2)(DataElement2SubData1)(DataElement2SubData2)(EOF)

我认为一个良好的设计将包括一种方法来根据文件类型或包含在标题中的一些定义的元数据来更改解析定义。所以Factory Pattern将成为解析器部分整体设计的一部分。

回答

21
  1. 只写你的文件分析器,使用任何技术来介意
  2. 编写大量的单元测试它,以确保您所有的边缘案件涉及

一旦你做到了这一点,你实际上会对问题/解决方案有一个合理的想法。

现在,你只是有理论在你的脑海中浮动,其中大部分将被误导。

第3步:无情地重构。你的目标应该是删除你的代码的大约一半

你会发现你的代码在最后将或者类似于现有的设计模式,或者你将创建一个新的代码。然后,您将有资格回答这个问题:-)

1

战略模式可能是你想看的一个。策略是文件解析算法。

然后你想要一个单独的数据库插入策略。

4

我完全同意Orion Edwards,通常是我解决问题的方式;但最近我开始看到一些疯狂的模式(!)。

对于使用一些builder(或factory)创建的每部分数据更复杂的任务,我通常使用类似的interpreter(或strategy)。

对于流数据,整个解析器看起来像adapter,从流对象适配到对象流(通常只是一个队列)。

对于您的示例,可能会有一个针对内部使用内部数据元素的构建器(由解释器提供)的完整数据结构(从头到EOF)的构建器。一旦遇到EOF,就会发射一个对象。

但是,某些工厂函数的switch语句中创建的对象可能是许多较小任务的最简单方法。另外,我喜欢保持我的数据对象不变,因为你永远不知道什么时候有人将并发性推下你的喉咙:)

1

使用Lex和YACC。除非您专门将这个主题用于未来十年,否则每次都会生成更好更快的代码。