用于解析二进制文件数据并存储在数据库中的设计模式

时间:2008-08-14 20:36:07

标签: design-patterns fileparse

是否有人建议采用二进制数据文件的设计模式,将其中的部分文件解析为对象并将结果数据存储到数据库中?

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

常见的数据结构包括:

  

(Header)(DataElement1)(DataElement1SubData1)(DataElement1SubData2)(DataElement2)(DataElement2SubData1)(DataElement2SubData2)(EOF)

我认为一个好的设计将包括一种基于文件类型或标题中包含的一些定义的元数据来更改解析定义的方法。因此Factory Pattern将成为Parser部分整体设计的一部分。

4 个答案:

答案 0 :(得分:21)

  1. 使用我想到的任何技术编写文件解析器
  2. 为它编写大量单元测试以确保涵盖所有边缘案例
  3. 完成此操作后,您将真正了解问题/解决方案。

    现在你的理论浮现在脑海中,其中大部分会被误导。

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

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

答案 1 :(得分:4)

我完全同意猎户座爱德华兹,这通常是我解决问题的方式;但最近我开始看到疯狂的一些模式(!)。

对于更复杂的任务,我通常会使用类似interpreter(或strategy)的内容,使用builder(或factory}来创建数据的每个部分

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

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

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

答案 2 :(得分:1)

策略模式可能是您想要查看的模式。策略是文件解析算法。

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

答案 3 :(得分:1)

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