【问题标题】:Pattern for varying data structures [closed]不同数据结构的模式[关闭]
【发布时间】:2014-10-06 16:24:44
【问题描述】:

我正在处理一个需要将固定长度文件反序列化为对象结构的项目。

该文件具有以下基本结构:

-- 文件头数据
----- 团体
----------详情

通常这将是一件容易的事,但是这种特殊的文件格式有大约 10 种不同的子格式用于详细记录。例如,如果详细信息行以代码“7”开头,则其格式为 ABC,其字段与 XYZ 格式(以“8”开头的行)大不相同。

所以我的问题是,我可以使用什么设计模式以优雅的方式实现它?

我的第一个想法是创建一个具有 DetailType 枚举属性的通用细节类,并且还有一个名为 SpecData 的 IDetailSpec 类型的属性。 IDetailSpec 实际上只是一个标记接口。然后,每当我使用 Detail 对象时,我都会检查 DetailType 属性并根据上下文对 SpecData 属性进行强制转换。

然而,这感觉“错误”:)

欢迎提出任何想法!

【问题讨论】:

  • 如何存储数据将取决于您实际需要使用它做什么。在不知道您需要如何处理数据的情况下,无法真正做出关于如何存储数据的明智决定。
  • 你可能想要工厂模式,工厂的参数是格式类型,并且创建的类型知道如何反序列化特定类型的详细记录
  • @Servy 存储的所有数据都将在应用程序中使用,具体取决于手头操作的上下文。例如,有一个返回详细记录的概念,因此我们将有一个 MarkForReturn() 方法,然后将更改详细记录的字段。被更改的字段以及将它们更改为什么值都取决于详细记录的格式。换句话说,这些操作很常见,但它们的实现方式因格式而异。
  • @antlersoft 这很有道理,但我更想知道 Detail 类在结构上会是什么样子。它是否由子对象组成,每种格式一个。或者它是否只有一个 IDetailSpec 数据字段,您必须根据格式类型进行转换。
  • @Digitalfront 你为什么说选角?你不应该施放任何东西。

标签: c# design-patterns file-format


【解决方案1】:

我建议创建一个基类来处理在所有不同详细信息类型之间保持相同的字段。 (现在,更改的数据将“反序列化”为单个字段。)然后,您应该为每种类型的详细记录创建不同的子类,并使用工厂类型模式根据详细信息创建适当子类的实例行的代码。每个子类都会从基类对象的“详细数据”字段中反序列化。

【讨论】:

  • 我非常喜欢这个想法。谢谢!
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2011-08-20
相关资源
最近更新 更多