Очевидные недостатки в моем дизайне EJB3 - PullRequest
3 голосов
/ 20 мая 2011

У меня есть объект домена с именем VehicleRecord, который является спящим объектом. Операции CRUD с этими VehicleRecords обрабатываются с помощью объекта доступа к объекту, реализованного в виде интерфейса сессионного компонента без сохранения состояния

@Local
interface VehicleRecordEao {
    void add(VehicleRecord record);
    List<VehicleRecord> findAll();
    ...
}

@Stateless
class HibernateVehicleRecordEaoBean implements VehicleRecordEao { ... }

С точки зрения бизнес-уровня удаление и добавление этих записей - это больше, чем просто операция CRUD. Например, могут быть требования к ведению журнала и безопасности. Для предоставления этих операций клиентам сессионные компоненты создаются на бизнес-уровне.

@Local
interface VehicleRecordManager {
    void createVehicleRecord(VehicleRecord record);
    List<VehicleRecord> findAll(String make, String model); 
    ...
}

@Stateless
class VehicleRecordManagerBean {
    public void createVehicleRecordManager(VehicleRecord record) {
        //business rules such as logging, security,
        //   perhaps a required web service interaction
        //add the new record with the Eao bean
    }
    ...
}

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

Что-то здесь не так (пахнет). У меня есть класс Manager, который должен быть красным флагом, но несколько примеров в книгах по EJB фактически предлагают этот класс высокого уровня и склонны использовать менеджер имен сами. Я новичок в EJB-дизайне, но в OO-дизайне создаю классы высокого уровня, называемые Manager, Handler или Utility, и требует процедурного переосмысления.

Являются ли эти бины процедурного класса утилит обычным шаблоном, или плохо организовывать ваш сеанс с помощью группы методов, связанных только с сущностью, с которой они работают? Существуют ли соглашения по именованию для сессионных компонентов? Должны ли Eao и EJB-компоненты работать на одном уровне?

Если есть менее вонючая альтернатива этому шаблону, я бы хотел знать, спасибо.

Ответы [ 5 ]

4 голосов
/ 22 мая 2011

Это вековая дискуссия.Должен ли сам хлеб выпекаться или печь?Сообщение отправляет само или почтовое отделение делает это?Могу ли я отправить сообщение своему другу Питу, попросив его отправить сообщение самому себе?

По мнению тех, кто придумал термин ADM, более «естественно» и более «ОО» позволяет каждому объектуделай все эти вещи сам.Взятый до крайности (который никто не защищает, конечно, но только в качестве примера) класс User будет содержать всю логику для всего приложения, поскольку в конечном итоге пользователь делает все.

Если вы используете slim сущности (сущности, содержащие только данные) и объекты службы или DAO для работы с ними, тогда вы не обязательно не выполняете OO.Все еще существует лот ОО.Сервисы реализуют интерфейсы, наследуются от базовых классов, имеют инкапсулированное состояние (например, EntityManager в JPA), имеют прозрачные перехватчики через динамические прокси (например, для проверки безопасности и запуска / фиксации транзакции) и т. Д. И т. Д.

Термин«Анемика» имеет определенную негативную ассоциацию, но называть то же самое «Тонким» на самом деле звучит хорошо.Это не просто случай использования разных имен для сокрытия запахов кода, но это разное мышление среди разных групп людей.

4 голосов
/ 20 мая 2011

Ваш подход более или менее стандартен. Да, на фундаментальном уровне это процедурный подход, который идет рука об руку с тем, что было названо Модель анемичной области «анти-паттерном». Альтернативой является включение вашей бизнес-логики в вашу модель предметной области, чтобы создать более внеплановую структуру, в которой ваши операции связаны с вашими DO. Если вы собираетесь пойти по этому маршруту , вы должны знать о присущих плюсах и минусах . Если вы чувствуете, что ваш подход имеет наибольшее значение, его легко понять, проверить, масштабировать и т. Д., То поменяйтесь им. Я работал над несколькими n-уровневыми проектами, в которых используется именно этот «процедурный» стиль - будьте уверены, что в EE-приложениях это вполне стандартно.

1 голос
/ 20 мая 2011

Что-то здесь не так (пахнет).У меня есть класс Manager, который должен иметь красный флаг

Мой ответ на этот вопрос связан с вашей заботой.

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

Для уточнения позвольте мне воспользоваться несколькими вариантами использования для решения VehicleRecord

  1. Купить транспортное средство
  2. Арендовать транспортное средство
  3. Найти автомобильтранспортное средство
  4. продать транспортное средство
  5. Найти дилеров

В большинстве приложений Java, когда мы пишем "VehicleService" (или "VehicleManager"), все вышеперечисленные операции будутбыть помещенным в этот класс!Ну, это легко сделать, но трудно поддерживать.И, конечно, у этого класса много обязанностей, поэтому у него много причин для изменения.(нарушая принцип Единой ответственности)

1 голос
/ 20 мая 2011

Я думаю, что это на ваш вкус, и в зависимости от сложности вашего приложения - эти вещи имеют меньшее / большее значение.Я думаю, что в дизайне, вам нужно просто обойти вокруг:

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

В вашем случае - присвоение имени EJB, связанному с объектом Entity, делает его простым и понятным - чего я не понимаю, так это почему вы разделили его на 2 класса EAO иМенеджер.Почему бы вам просто не объединить их в один, так что если класс EJB / Bean имеет дело с объектом VehicleRecord, то это будет «VehicleRecordEAO» или «VehicleRecordManager» или «VehicleRecordAccess» или что-то действительно.

Я думаю, что EAO/ DAO / Access звучит больше как геттер / сеттер или любые другие простые операции.Я не вижу ничего плохого в «Менеджере» и согласен с тем, что весь бизнес-уровень будет называться «Менеджер».

Или, если вам лучше, подумайте об этом как Шаблон фасада - так что вы можете называть свой бизнес-уровень (Менеджер) как VehicleRecordFacade и VehicleRecordFacadeBean.

Таким образом, вы в основном следует названию и концепции шаблона Facade, где он становится посредником между прикладным уровнем и уровнем данных.

0 голосов
/ 20 мая 2011

Можно ли назвать это VehicleDao устранением запаха?Простое изменение, но ясно показывает, что оно связано с проблемами доступа к данным.

...