Как сохранить и загрузить разные типы объектов? - PullRequest
1 голос
/ 15 ноября 2008

Во время кодирования я часто сталкиваюсь с такой ситуацией:

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 ноября 2008

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

2 голосов
/ 15 ноября 2008

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

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

0 голосов
/ 15 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...