Является ли хорошей практикой встраивать поведение в Entity Beans?
Хотя мои Java-приложения были небольшими и делали простые вещи, я был очень доволен использованием простого SQL, тем более что серверы приложений, такие как Glassfish, делают управление соединениями действительно простым. После того, как я узнал о JPA и EJB, я решил реорганизовать свои проекты, чтобы они использовали эти классные вещи, но столкнулся с проблемой, которая больше связана с дизайном, чем с программированием:
Является ли хорошей практикой встраивание поведения в объектные компоненты или они должны содержать только данные?
Я прочитал много руководств и учебных пособий, но они в основном отвечают на то, как я могу их использовать, а не как должен, чтобы соответствовать требованиям хорошего дизайна.
Например, дано 2 класса: User
а также Location
они оба являются бинами сущностей. user
может хранить коллекцию location
с, и это нормально и легко реализовать с помощью JPA. Но если я хочу заполнить эти классы некоторыми функциями, такими как методы вычисления расстояния до другого пользователя или местоположения, поиска пересечений их путей, вычисления расстояния, которое user
пробежал день и тд. Будет ли "хорошим дизайном", если я реализую такую функциональность в самих bean-компонентах, или мне придется использовать специальные декораторы и вспомогательные классы с множеством статических методов для достижения моей цели?
2 ответа
Вы пытаетесь реализовать подход, управляемый доменом (DD). Это полезно для некоторых приложений, но имеет тенденцию противопоставляться архитектурам SOA. Концепции SOA широко распространены, хорошо себя зарекомендовали, и даже сейчас это горячая тема, см. Также микросервисы (иначе SOA v2.0).
Если вы используете Java EE, вы можете использовать шаблон шлюза для реализации DD или Boundary-Control-Entity для SOA.
Теперь несколько моментов:
Полезно ли использовать Entity Beans как обычные объекты, а не только как представление данных? Для DD это нормально и поощряется. Для SOA нет.
Будет ли дизайн DD масштабироваться лучше, чем SOA? Зависит от приложения (объем памяти бина с состоянием невелик и управляем). Только стресс-тест даст вам хорошее понимание.
Могу ли я создать прототип на основе DD, а затем при необходимости перейти на SOA? Почему бы и нет?, возможно, существует жесткая фаза рефакторинга, но это возможно. Прототипы DD быстрее создаются.
Какие-либо проблемы безопасности, которые стоит упомянуть в отношении неизменяемых объектов? Неизменяемые объекты предназначены для избежания проблем параллелизма (ничего не изменится, никто не пострадает). Шаблон шлюза основан на транзакциях и EJB (с унаследованной моделью безопасности). Так что в целом проблем нет.
Нужно ли мне получить / установить с JPA?. Нет, не являются обязательными.
Могу ли я создавать неизменяемые объекты с помощью JPA? Да, просто конструктор и приватные атрибуты (правильно аннотированные) и готово.
Могу ли я смешать некоторое поведение в объектах SOA-проекта? Ну, я просто добавлю некоторые конкретные методы, которые не требуют добавления менеджера сущностей к сущности, то есть простые операции, которые не работают над огромным графом объектов. Согласованность проекта очень важна.
Как насчет тестирования? Оба решения хорошо тестируются. Несмотря на то, что SOA и микросервисы заставляют вас разбивать ваше приложение на мелкие кусочки, это может помочь вам избежать создания монолитного (большого шарика грязи) приложения.
Я ненавижу, как плохо выглядят эндемичные модели, но, по крайней мере, работает.
Я думаю, что не стоит использовать все эти логические методы на вашей сущности, может быть, лучший способ получить это от бизнес-уровня.
Никогда не стоит получать много переходных полей в наших сущностях, поэтому, возможно, лучший способ - создать классы VO (Valued Object).
Использование VO также решает проблему инкапсуляции, потому что сеттеры и геттеры не требуются.