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

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

常见的数据结构包括:

(标头) (数据元素 1) (数据元素 1 子数据 1) (数据元素 1 子数据 2) (数据元素 2) (数据元素 2 子数据 1) (数据元素 2 子数据 2) (EOF)

我认为一个好的设计应该包括一种根据文件类型或标头中包含的某些定义的元数据更改解析定义的方法。所以一个 工厂模式 将成为解析器部分总体设计的一部分。

有帮助吗?

解决方案

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

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

现在你脑子里只有一些理论,其中大部分都会被证明是错误的。

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

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

其他提示

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

对于更复杂的任务,我通常使用类似 口译员 (或一个 战略)使用一些 建设者 (或者 工厂)来创建数据的每个部分。

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

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

然而,对于许多较小的任务来说,在某些工厂函数中的 switch 语句中创建对象可能是最简单的方法。另外,我喜欢保持我的数据对象不可变,因为你永远不知道什么时候有人将并发强加给你:)

策略模式也许是您想了解的一种。该策略是文件解析算法。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top