Архитектура: Лучшие практики для манипулирования моделями без загрязнения POJO? И не повторяя везде шаблонный код

С этой проблемой мы сталкиваемся часто. Должны быть какие-то лучшие практики для решения этой проблемы...

Упрощенный вопрос

Куда лучше всего поместить обычный код, который манипулирует POJO?

такой, что:

  • POJO имеют только свойства и геттеры/сеттеры
  • один и тот же код манипулирования моделью не повторяется "везде"
  • ясно очень, какие классы отвечают за манипулирование моделью

Предыстория

У нас есть схема, определяющая наш домен. Из нее мы генерируем "чистую" модель, состоящую из простых объектов (POJO), которые приходят из JAXB.

Работая с этой моделью, несколько разработчиков в команде создали шаблонный код для доступа и манипулирования моделью. Он "рассыпан" во многих местах. Некоторые создали объекты-обертки, которые подклассифицируют экземпляры модели и добавляют функциональность. Другие создали внешние классы-утилиты. Я хочу унифицировать этот код, чтобы он больше не был "рассыпан повсюду". В идеале, логика может быть заключена в определенном классе объектов, которые четко отвечают за общие манипуляции с моделью.

Пример

В качестве общего примера возьмем продуктовый магазин. Объекты модели состоят из таких вещей как:
Products, Aisle, Shelf, Employee, WorkSchedule, Vendor

Общие манипуляции с моделью состоят из таких вещей как:
findManagerWorkingOnDay(day, schedule), findAisleForProduct(apples), countItemsOnShelf(topShelf), product. isModified(), removeProductFromVendor(apples, vendor)

Мы не хотим "загрязнять" наш Vendor POJO функцией типа removeProductFromVendor. Точно так же мы не обязательно хотим расширять каждый объект модели, чтобы добавить свойство isModified только для того, чтобы наш GUI знал, что нужно "включить/выключить" кнопку сохранения.

Или нет?

Резюме

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

В таких случаях обращение к базе данных - излишество, потому что все необходимое уже есть в памяти (например, мы уже сделали запрос к DataStore, и нам нужно работать с объектами-результатами во всем приложении). В идеале этот код должен быть доступен любому объекту, у которого есть, например, список сотрудников.


С точки зрения лучшей практики, где идеальное место для размещения статического метода:
public static Employee findManager(List employeesOnDuty);

который будет перебирать список сотрудников (POJO) и возвращать первого, где employee.title.toLowerCase().contains("manager")

Если бы команда работала с этим примером объектной модели, несколько человек написали бы функции, подобные этой. Каковы некоторые из лучших практик для распределения ответственности, чтобы POJO оставались "чистыми", а один и тот же шаблонный код не "сыпался повсюду"

12
задан gMale 23 January 2012 в 18:18
поделиться