如何保存和加载不同类型的对象?

时间:2008-11-15 14:01:09

标签: language-agnostic oop

在编码过程中,我经常遇到这种情况:

  1. 我有几个具有相同基本类型ConcreteType1的对象(ConcreteType2AbstractType,...),其中包含抽象方法saveload 。通过覆盖save方法,每个对象都可以(并且必须)保存一些特定类型的数据。
  2. 我有一个AbstractType个对象列表,其中包含各种ConcreteTypeX个对象。
  3. 我遍历列表和每个对象的save方法。
  4. 此时我认为这是一个很好的OO设计。 (或者我错了吗?)当我想重新加载数据时问题开始了:

    每个对象都可以加载自己的数据,但我必须事先知道具体的类型,因此我可以实例化右ConcreteTypeX并调用load方法。所以加载方法必须对混凝土类型有很多了解。我通常在调用save之前编写某种标记来“解决”这个问题,加载程序使用它来确定正确的ConcreteTypeX

    我总是对此感到不舒服。感觉就像某种反模式......

    有更好的方法吗?

    编辑: 对不起,我很抱歉,我重新写了一些文字。 我知道序列化,也许在Java / .NET / yourFavoriteLanguage中有一些下一个完美的解决方案,但我正在寻找一个通用的解决方案,与我的概念相比,它可能更好,更“OOP-ish”

3 个答案:

答案 0 :(得分:3)

这是.NET还是Java?如果是这样,为什么不使用序列化?

答案 1 :(得分:2)

如果你不能简单地使用序列化,那么我仍然肯定会将对象加载逻辑从基类中拉出来。你的直觉是正确的,导致你正确识别code smell。更改或添加派生类时,不需要更改基类。

问题是,某些东西必须加载数据并实例化这些对象。这听起来像是Abstract Factory pattern的工作。

答案 2 :(得分:0)

有更好的方法,但让我们退后一步,从概念上看待它。所有对象在做什么?加载和保存。当您从内存中获取对象时,您实际上不必关心它是从文件,数据库还是Windows注册表获取其信息。你只想加载对象。这一点很重要,因为稍后,您的维护程序员将查看LoadFromFile()方法,并想知道“为什么它被调用,因为它实际上没有从文件中加载任何东西?”

其次,你遇到了我们都遇到的问题,它基于分工。您需要一个处理从物理源获取数据的级别;您需要一个操纵此数据的级别,并且您需要一个显示此数据的级别。这是N-Tier Development的关键。我已经非常详细地链接了discusses your problem的文章,并详细介绍了如何创建数据访问层来解决您的问题。还有许多代码项目herehere

如果它是您寻求的Java,只需将'java'替换为.NET并搜索“Java N-Tier development”。但是,除了语法差异外,设计结构也是一样的。