【问题标题】:Design pattern for parsing binary file data and storing in a database解析二进制文件数据并存储在数据库中的设计模式
【发布时间】:2010-09-05 21:59:36
【问题描述】:

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

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

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

(标题) (DataElement1) (DataElement1SubData1) (DataElement1SubData2)(DataElement2) (DataElement2SubData1) (DataElement2SubData2) (EOF)

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

【问题讨论】:

    标签: design-patterns fileparse


    【解决方案1】:

    策略模式可能是您想要了解的一种。策略是文件解析算法。

    那么你需要一个单独的数据库插入策略。

    【讨论】:

      【解决方案2】:
      1. 只需编写文件解析器,使用想到的任何技术
      2. 为其编写大量单元测试以确保涵盖所有边缘情况

      一旦你这样做了,你就会对问题/解决方案有一个合理的想法。

      现在你脑子里只有一些理论,其中大部分会被误导。

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

          使用Lex 和 YACC。除非你在接下来的十年里专门致力于这个主题,否则他们每次都会产生更好更快的代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多