2008-11-15 2 views
1

Во время кодирования я часто сталкиваюсь с этой ситуацией:Как сохранить и загрузить различные типы объектов?

  1. У меня есть несколько объектов (ConcreteType1, ConcreteType2, ...) с тем же базовым типом AbstractType, который имеет абстрактные методы save и load. Каждый объект может (и должен) сохранять некоторые данные определенного типа, переопределяя метод save.
  2. У меня есть список AbstractType объектов, который содержит различные ConcreteTypeX объектов.
  3. Я просматриваю список и метод save для каждого объекта.

На данный момент я считаю, что это хороший дизайн OO. (Или я не прав?) Проблемы начинаются, когда я хочу перезагрузить данные:

Каждый объект может загружать собственные данные, но я должен знать конкретный тип заранее, поэтому я могу создать экземпляр справа ConcreteTypeX и позвонить метод load. Поэтому метод загрузки должен много знать о конкретных типах. Я обычно «решал» эту проблему, написав какой-то маркер перед вызовом save, который используется загрузчиком для определения правильного ConcreteTypeX.

У меня всегда было/было плохое чувство об этом. Это похоже на какой-то анти-шаблон ...

Есть ли лучшие способы?

EDIT: Прошу прощения за путаницу, я переписал часть текста. Я знаю сериализацию, и, возможно, в Java/.NET/yourFavoriteLanguage есть некоторое совершенное решение, но я ищу общее решение, которое может быть лучше и более «OOP-ish» по сравнению с моим концепция.

ответ

2

Если вы не можете просто использовать сериализацию, я бы все же определенно вытащил логику загрузки объекта из базового класса. Ваш инстинкт верен, что позволяет правильно идентифицировать code smell. Базовый класс не должен изменяться при изменении или добавлении производных классов.

Проблема заключается в том, что что-то должно загрузить данные и создать экземпляр этих объектов. Это звучит как работа для Abstract Factory pattern.

3

Это либо .NET, либо Java? Если да, то почему вы не используете сериализацию?

+0

Ирония, я обычно заклинаю ее с помощью 's', поскольку я - британский! – 2008-11-15 14:36:40

+0

Ах, ха! Поэтому мы терзаем вас. Когда вы начинаете пить кофе вместо чая, тогда мы можем претендовать на победу! – 2008-11-15 14:39:58

0

Есть лучшие способы, но давайте сделаем шаг назад и посмотрим на него концептуально. Что все объекты делают? Загрузка и сохранение. Когда вы получаете объект из памяти, вам действительно не нужно заботиться о том, получает ли он свою информацию из файла, базы данных или реестра Windows. Вы просто хотите, чтобы объект был загружен. Это важно помнить, потому что позже ваш программист maintanence будет смотреть на метод LoadFromFile() и задаться вопросом: «Почему он называется так, поскольку он действительно ничего не загружает из файла?»

Во-вторых, вы сталкиваетесь с проблемой, с которой все мы сталкиваемся, и она основана на делении работы. Вам нужен уровень, который обрабатывает получение данных из физического источника; вам нужен уровень, который управляет этими данными, и вы хотите, чтобы уровень отображал эти данные. Это главный вопрос N-Tier Development. Я подробно рассказал о статье discusses your problem и подробно о том, как создать уровень доступа к данным для решения проблемы.Есть также многочисленные проекты кода here и here.

Если вы ищете Java, просто замените «java» на .NET и найдите «Java N-Tier development». Однако, помимо синтаксических различий, структура дизайна одинакова.

Смежные вопросы