Какой шаблон проектирования подходит для преобразования реляционных данных в модель предметной области? - PullRequest
2 голосов
/ 05 января 2011

Задача

У меня есть код, который превращает данные, хранящиеся в реляционной форме, в модель предметной области. Источником является не СУБД, а набор сгенерированных «табличных» классов. Эти классы таблиц сопоставимы с java.sql.ResultSet, каждый из которых представляет один набор данных: заказы, заказанные товары, поставки, счета, серийные номера.

Код преобразования создает иерархию моделей предметной области с нуля путем итерации по таблицам. Он создает соответствующие объекты модели, подключая их к другим объектам модели и так далее. По окончании возвращает модель домена (список заказов).

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

Идея

Я склоняюсь к рефакторингу кода в шаблон посетителя:

  • вводит контейнерный класс, который предоставляет ссылки на объекты таблицы (например, getOrdersTable(), getOrderItemsTable())
  • создать несколько классов посетителей для этого класса контейнера. Каждый посетитель охватывает один аспект исходных данных: один, который создает сами объекты заказа, другой создает объекты доставки и подключает их к соответствующим объектам заказа и т. Д.

Однако я не уверен в следующих проблемах :

  • посетители будут работать не только с объектами таблицы, которые они посещают, но и с объектами, созданными другими посетителями (где последние доступны через список заказов, который является корнем модели домена). Таким образом, порядок, в котором вызываются посетители, важен.
  • Шаблон посетителя часто объясняется в контексте иерархий узлов, но я не хотел бы, чтобы они посещали иерархию, они создавали бы один.

Вопросы

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

  2. Является ли какая-либо из проблем выше необычной для посетителей? Если да, то как вы думаете, реализация Visitor в любом случае может привести к путанице в коде? В конце концов, шаблоны - это соответствие интуитивным ожиданиям и повышение значимости кода.

Контекстная информация

  • Я могу безопасно добавлять методы в классы таблиц (каждый из которых состоит из сгенерированного абстрактного класса и подкласса, предназначенного для ручной модификации), или же они могут реализовывать интерфейсы, но не могут изменять свой общий суперкласс или вводить новый.
  • Набор таблиц относительно стабилен, но, вероятно, будут добавлены новые столбцы. Кроме того, есть некоторая степень изменения в самой логике преобразования (например, какие команды пропустить, или в особых случаях для отображения данных)
  • Сама модель предметной области относительно чистая, я не собираюсь менять ее несовместимыми способами или даже полностью ее заменять.
  • Речь идет о коде Java.
  • Безопасность резьбы не требуется.

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Если вы еще этого не сделали, я предлагаю вам получить книгу Мартина Фаулера Шаблоны архитектуры корпоративных приложений

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

В терминологии Мартина Фаулера я думаю, что вам нужен Data Mapper , который похож на ваш текущийреализация.

Для меня хитрость заключается в том, чтобы убедиться, что ваша реализация написана с учетом удобства обслуживания и тестирования.Возможно, вы захотите попрактиковаться в TDD, чтобы помочь вам в достижении ваших целей, но в целом, я думаю, вам следует посмотреть, какие функциональные возможности можно разделить на «вспомогательные» классы, которые можно тестировать модулем просто

Например, вы можете решитьиметь объект доступа к данным для каждой «таблицы», оставляя основной класс DataMapper для управления окончательным построением модели предметной области

0 голосов
/ 05 января 2011

Шаблон доменного объекта или бизнес-объекта будет достаточным для вашей потребности.

Пожалуйста, пройдите Business Object http://www.corej2eepatterns.com/Patterns2ndEd/BusinessObject.htm

Шаблон хранилища доменов, если ваше приложение более сложное по своей природе

http://www.corej2eepatterns.com/Patterns2ndEd/DomainStore.htm

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