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