С этой проблемой мы часто сталкиваемся. Должны быть некоторые лучшие практики для решения этой проблемы ...
Упрощенный вопрос
Где лучше всего разместить общий код, который манипулирует POJO?
такой, что:
- POJO имеют только свойства и методы получения / установки
- один и тот же код манипулирования моделью не повторяется "везде"
- это очень ясно, какие классы отвечают за манипулирование моделью
* * Фон тысяча двадцать-один * * тысяча двадцать-дв
У нас есть схема, которая определяет наш домен. Исходя из этого, мы генерируем «чистую» модель, которая состоит из простых объектов (POJO), которые исходят от JAXB.
Работая с этой моделью, несколько разработчиков в команде создали кодовой шаблон для доступа и манипулирования моделью. Это "окроплено" во многих местах. Некоторые из них создали объекты-оболочки, которые делят экземпляры модели на подклассы и добавляют функциональность. Другие создали внешние служебные классы. Я пытаюсь унифицировать этот код, чтобы он больше не "разбрызгивался повсюду". В идеале логика может содержаться в определенном классе объектов, которые явно ответственны за общие манипуляции с моделью.
Пример * * 1 032
Давайте использовать продуктовый магазин в качестве общего примера. Объекты модели состоят из таких вещей, как:
Products, Aisle, Shelf, Employee, WorkSchedule, Vendor
Обычные модельные манипуляции состоят из таких вещей, как:
findManagerWorkingOnDay(day, schedule), findAisleForProduct(apples), countItemsOnShelf(topShelf), product.isModified(), removeProductFromVendor(apples, vendor)
Мы не хотим «загрязнять» наш поставщик POJO функцией, подобной removeProductFromVendor
. Аналогично, мы не обязательно хотим расширять каждый объект модели, просто добавив свойство isModified
, чтобы наш графический пользовательский интерфейс мог «включать / отключать» кнопку сохранения.
Или мы?
Краткое описание
Когда объект модели находится в памяти, кто должен отвечать за его манипулирование, например, перебирать список «дежурных сотрудников сегодня» и находить того, кто является «менеджером?»
В этих случаях вызовы базы данных излишни, потому что у нас уже есть все, что нам нужно в памяти (например: мы уже запросили хранилище данных и нам нужно работать с объектами результата во всем приложении). В идеале этот код был бы доступен для любого объекта, который имел, например, список сотрудников.
С точки зрения наилучшей практики, где находится идеальное место для размещения статического метода:
public static Employee findManager(List<Employee> employeesOnDuty);
, который будет перебирать список сотрудников (POJO) и возвращать первый, где employee.title.toLowerCase().contains("manager")
Если бы команда работала с этим образцом объектной модели, несколько человек написали бы такие функции. Каковы некоторые из лучших практик для того, чтобы взять на себя эту ответственность, чтобы POJO оставались «чистыми», а один и тот же код котельной плиты «не разбрасывался повсюду».