Каков наилучший шаблон для обработки структуры данных таблицы? - PullRequest
0 голосов
/ 10 ноября 2009

Факты

У меня есть следующая структура данных, состоящая из таблицы и списка атрибутов (упрощенно):

class Table {
    List<Attribute> m_attributes;
}

abstract class Attribute {}

class LongAttribute extends Attribute {}
class StringAttribute extends Attribute {}
class DateAttribute extends Attribute {}
...

Теперь я хочу выполнить различные действия с этой структурой данных:

  • распечатать в формате XML
  • распечатать в текстовом виде
  • создать оператор вставки SQL
  • создать оператор обновления SQL
  • инициализировать его из набора результатов SQL

Первая попытка

Моя первая попытка заключалась в том, чтобы поместить все эти функции в Attribute, но затем Attribute был перегружен очень разными функциями.

Альтернативные

Такое ощущение, что шаблон посетителя может вместо этого выполнить работу очень хорошо, но с другой стороны это выглядит излишним для этой простой структуры.

Вопрос

Какой самый элегантный способ решить эту проблему?

Ответы [ 4 ]

1 голос
/ 10 ноября 2009

Я бы посмотрел на использование комбинации JAXB и Hibernate .

JAXB позволит вам маршалировать и демаршировать из XML. По умолчанию свойства преобразуются в элементы с тем же именем, что и у свойства, но этим можно управлять с помощью аннотаций @XmlElement и @XmlAttribute.

Hibernate (или JPA) - это стандартные способы перемещения объектов данных в базу данных и из нее.

1 голос
/ 10 ноября 2009

Я не знаю, почему вы сами в эти дни сохраняете вещи в базе данных, а не просто используете hibernate, но вот мой звонок:

LongAttribute, DateAttribute, StringAttribute, & hellip; все они имеют разные внутренние компоненты (то есть, специфичные для них поля отсутствуют в классе Attribute), поэтому вы не можете создать один универсальный метод для их сериализации. Теперь XML, SQL и обычный текст имеют разные свойства при сериализации к ним. На самом деле нет способа избежать написания O (# подклассов Attribute # выходных форматов) * различных методов сериализации.

Посетитель - неплохой шаблон для сериализации. Правда, это немного излишне, если используется на нерекурсивных структурах, но случайный программист, читающий ваш код, сразу поймет, что он делает.

Теперь для десериализации (из XML в объект, из SQL в объект) вам понадобится Factory .

Еще один совет: для обновления SQL вы, вероятно, хотите иметь что-то, что принимает старую версию объекта, новую версию объекта и создает запрос на обновление только по разнице между ними.

1 голос
/ 10 ноября 2009

На ум приходит шаблон команды , или его небольшая вариация.

У вас есть несколько классов, каждый из которых специализирован для определенной операции с вашим классом данных. Вы можете хранить эти классы в hashmap или в какой-либо другой структуре, где внешний выбор может выбрать один для выполнения. Чтобы сделать это, вы вызываете метод execute () выбранной Команды с вашими данными в качестве аргумента.


Редактировать: Разработка.

На нижнем уровне вам нужно что-то сделать с каждым атрибутом строки данных. Это действительно звучит как случай для шаблона посетителя: посетитель имитирует двойной операция отправки, поскольку вы можете комбинировать переменный объект "жертва" с переменной «операция», инкапсулированной в методе.

Все ваши атрибуты хотят быть в формате xml-ed, text-ed, вставлено-ed обновлено и инициализировано. Таким образом, вы получите матрицу из 5 х 3 классов для выполнения каждой из этих 5 операций. каждому из 3 типов атрибутов. Остальная часть механизма посетителя проследит ваш список атрибутов для вас и применит правильного посетителя для операция, которую вы выбрали правильно для каждого атрибута.

Написание 15 классов плюс интерфейс (ы) звучат немного тяжело. Вы можете сделать это и иметь очень общее и гибкое решение. С другой стороны, во время вы потратили время на обдумывание решения, вы могли бы взломать код к нему для известной в настоящее время структуры и скрестил пальцы, что форма ваши уроки не будут меняться слишком часто.

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

"xml" -> XmlifierCommand
"text" -> TextPrinterCommand
"serial" -> SerializerCommand

... где каждая из этих команд затем запускает соответствующего посетителя для выполнения работа. Но так как операция, скорее всего, будет определена в коде, вы, вероятно, мне это не нужно.

0 голосов
/ 04 февраля 2010

В конце концов, я использовал шаблон посетителя. Теперь, оглядываясь назад, это был хороший выбор.

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