6

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

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

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

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

我认为一个好的设计将包括一种根据文件类型或标题中包含的一些已定义元数据更改解析定义的方法。因此,工厂模式将成为 Parser 部分整体设计的一部分。

4

4 回答 4

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

完成此操作后,您实际上将对问题/解决方案有一个合理的想法。

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

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

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

于 2008-08-14T21:20:18.213 回答
4

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

对于更复杂的任务,我通常使用解释器(或策略)之类的东西,它使用一些构建器(或工厂)来创建数据的每个部分。

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

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

However, objects created in a switch statement in some factory function is probably the simplest way for many lesser tasks. Also, I like keeping my data-objects immutable as you never know when someone shoves concurrency down your throat :)

于 2008-08-24T16:03:41.410 回答
1

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

然后,您需要一个单独的数据库插入策略。

于 2008-08-14T20:37:15.193 回答
1

Use Lex and YACC. Unless you devote the next ten years exclusively to this subject, they will produce better and faster code every time.

于 2008-09-26T04:15:37.537 回答