Вопрос

Я знаю, что это, вероятно, возрастной вопрос, но что такое лучшая практика? Используя объект моделей домена на всей территории всех слоев вашего приложения и даже привязки значений непосредственно к ним на JSP (я использую JSF). Или преобразуйте объект модели домена в DTO в DAO или Service Payer и отправьте легкий D до уровня презентации.

Мне сказали, что не имеет смысла использовать DTOS, потому что изменения в базе данных приведут к изменениям всех ваших DTOS, тогда как использование объектов модели везде будет просто потребовать изменений в затронутом объекте модели. Однако простота использования и легкая природа DTOS, кажется, перевешивает это.

Я должен отметить, что мое приложение использует объекты Hibernate Model и использует свои собственные пользовательские модели модели (значение, не связанные с любой сессией БД, всегда отсоединены). Это либо из приведенных выше сценариев более выгодных для строгого модели модели? Использование Hibernate была огромной пивой в отношении вещей, таких как ленивые исключения инициализации.

Я редактирую этот вопрос в надежде в продвижении обсуждения (не уверен, если я делаю это правильно):

Проблема у меня с модельными объектами, состоит в том, что они вообще не гибки. Приведенный ниже комментарий говорит, что приложение должно быть спроектировано таким образом, чтобы объекты моделей можно использовать на протяжении всех слоев. Почему? Если пользователь хочет, чтобы часть смешной функциональности я должен сказать им, «ну, что не будет работать с модельными объектами»?

Простые и простые, есть как раз, когда модельные объекты не будут работать. Ты можешь иметь:

public class Teacher {
    List<Student> students;
    [tons of other Teacher-related fields]
}
public class Student {
    double gpa;
   [tons of other Student-related fields]
}

Но, возможно, вам не нужна вся эта информация. Вам просто нужна фамилия учителя, количество студентов, которых они преподают в этом году, а средний GPA для всех студентов в сочетании. Что бы вы сделали в этом случае? Получите полную информацию учителя и отношения студентов, а затем ваш код получает счет в списке студентов, а затем вычисляет общий средний средний GPAS внутри? Это похоже на ваааай больше усилий, чем просто создавать DTO с «LING LASTNAME», «int NumStudents» и «двойной комбинированный);

Это может звучать, как мой разум был составлен на них, но я еще не работал в приложении, в котором объекты модели могут быть полностью использованы в каждом экземпляре. Регулярные реальные приложения с необычным требованием пользователей просто не работают таким образом.

Это было полезно?

Решение

Это действительно зависит от сложности вашей заявки. Смешивание объектов домена в слой просмотра имеет два возможных последствия:

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

Если ваши объекты домена просты, и ваши взгляды мало, пропуская DTOS, может быть самая простая вещь.

С другой стороны, если ваша модель домена, скорее всего, будет развиваться и стать сложной, и если ваши взгляды, вероятно, будут многочисленными и разнообразными, просмотр конкретных объектов может быть хорошей идеей. В мире MVC использование просмотра моделе распространено и имеет много смысла для меня.

Другие советы

Еще одно голосование за объекты домена. Что касается дизайна домена доменов, создана модель домена, является королем и должна использоваться, где это возможно. Приложение должно быть спроектировано таким образом, где большинство слоев (слой инфраструктуры бар) могут использовать доменные объекты.

Я думаю о DTOS так же полезным только там, где объекты должны быть сериализованы. Если нет передачи через провод или в несовместимую архитектуру, я бы не использовал их. Шаблон DTO полезен для хранения сериализации из объекта домена. Учитывая, что взаимодействие UI / домена не нуждается в сериализации, сохраняйте его простым и используйте фактические объекты.

Я думаю, что имея Dто, как правило, антиухая. Существует множество людей и систем, использующих их, и преимущество, которое вы получаете, - это развязанный просмотр слоя, который может быть спроектирован и модуляризован независимо от модели домена. Хотя я согласен, что вы должны использовать объекты домена, где это возможно, есть сценарии, где вы можете получить проблемы при привязании уровня просмотра непосредственно к модели домена.

Я сделал хороший опыт с помощью модели вида, которая обернутся только вокруг объектов домена и делегирует большинство операций к ним. Это раздача просмотра и доменных слоев, обеспечивает гибкую композицию доменных объектов и по-прежнему не очень много работы для реализации с момента поддержки IDES Шаблон делегирования.

Сценарии, когда объект домена проблематичен для отправки:

  1. Возможно, вам понадобится агрегированная информация или другие типы «рассчитанных полей», отправляемых на уровень пользовательского интерфейса (например, Flex / GWT) и не хочу беспорядок доменных объектов
  2. Вы можете столкнуться с необходимостью сериализации графика циклического объекта (в вашем примере, если ученик имел отношение списка), некоторые протоколы имеют проблемы с этим
  3. Hibernate LazyinitializationException При работе с Serializers Framework (Blazeds for Flex / GWT Serializer)

Я не уверен, что это четкий отрезок ответа в тех цирумцинах

На мой взгляд, нет проблем вообще с использованием объектов модели домена в каждом слое. Вы сказали, что вам не нужна вся информация. Когда вы находитесь в ваших JSP, используйте только данные, которые вам нужны. Никто не заставляет вас получить каждое свойство. Вы также сказали, что вам нужно сделать расчеты, связанные с свойствами объекта, чтобы получить GPA, # студентов и т. Д. У вас есть 3 варианта: создание синтетических свойств в объекте модели домена, который возвращает правильные данные для вас, завершил приятный и аккуратный; Сделайте расчеты в контроллере или сервисном слое, и подвергайте их по соответствующим получателям; или обрабатывать все это внутри вашего JSP. Вам нужно вообще получать / компилировать / запутывать данные в любом случае, поэтому добавить больше сложности с DTO.

Кроме того, с каждым DTO вы создаете.) Дополнительный класс теперь должен поддерживать, а б.) Как минимум 1 дополнительный метод где-то в каком-то классе, который строит и заполняет DTO (DAO, Factory Methods и т. Д.) Отказ Больше обслуживания = несчастный разработчик 6 месяцев спустя.

Итак, есть мои аргументы против DTOS. Я использую их, но только в определенных сценариях, вроде бы, когда мне действительно нужно оптимизировать для использования скорости и / или памяти, а стоимость увлажнения полного объекта доменного модели слишком много. Веб-сервисы являются хорошим примером, когда я предпочитаю использовать DTOS.

Поведение класса или его внутренние методы не должно подвергаться воздействию слоев, не касающихся их поведения. Передать данные, а не поведение. Используйте доменные объекты в домене. Сеть не является контролируемым доменом, а разработчики пользовательского пользовательского интерфейса не должны быть связаны с поведением домена, просто данные.

Домен должен быть инкапсулирован и защищен от модификации кого-то, кто не касается здоровья домена.

Утечка поведения не является лучшей привычкой.

Если это небольшой проект, построил его с правильными принципами. Таким образом, мы всегда имеем в виду, почему мы делаем то, что делаем, а не только как.

Я думаю, что мы должны учитывать здесь, в первую очередь - это стоимость внедрения нового слоя. Возьмите DTO, например, делать это, нам нужно отображение. Как кто-то сказал, перевод является злом и следует избегать по возможности.

С другой стороны, я думаю, что очень мало вещей, которые вы обычно не должны делать. Те, кто говорят, что все DTOS зло, неверны - это всегда зависит от случая использования! Они действительно оправданы?

И, наконец, я лично верю, что объекты домена должны отпускать само по себе. Представьте, что такое интеграция Wicket тогда. Но возьмите весну MVC, например, - домен останется тогда в слое приложений, вероятно, ...

DTO широко считается анти-образным узором в настоящее время, и рекомендации обычно «избегают их во всех расходах».

Одно из главных преимуществ структуры ORM, как Hibernate, состоит в том, что вы можете использовать объекты домена на всех уровнях, и не нуждаются в DTOS. Предостережение, конечно, заключается в том, что вы должны посвятить когда-нибудь, чтобы подумать об этих отношениях: когда использовать ленивую выборку, когда использовать нетерпение и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top