Почему хранилище не должно возвращать DTO - PullRequest
0 голосов
/ 14 апреля 2020

Прочитайте много статей, где люди говорят, что я должен вернуть модель домена ... Но тогда это разрушит всю идею моего хранилища.

Я использую laravel Красноречивые модели (то есть, если я прав - Доменные модели). У меня есть репозиторий, поэтому в случае, если я решу переключиться на Doctrine, я могу просто поменять все это у поставщика услуг. Но если я верну экземпляр модели предметной области (в данном случае Eloquent Model), это не имеет смысла. Мне нужно вернуть тот же результат из репозитория, и DTO кажется именно тем, что мне нужно ...

Может кто-нибудь объяснить мне, почему я не прав?

1 Ответ

2 голосов
/ 14 апреля 2020

Что такое

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

DTO (Объект передачи данных)

  • Обычно PHP класс с общедоступными c свойствами
  • Отвечает только за перенос данных
  • Не проверяет данные
  • Не знает ни о каких спецификациях реализации c вещей (например, с каким ORM он связан)
  • Обычно используется для передачи данных между частями приложения, при этом ни одна из сторон не знает о реализации другой

модели домена

  • Обычно класс PHP с частными свойствами
  • Должен содержать только действительные данные
  • Проверяет, что любые изменения приводят к действительному состоянию
  • Не знает ни о каких специфических реализациях c вещей (например, с каким ORM он связан)

Репозиторий

  • Отвечает только за хранение и извлечение данных
  • Знает ли это о своей реализации (например, с каким ORM он связан)
  • не несет ответственности за возврат действительных данных

Что это означает для вашего случая

Ответ действительно зависит от того, насколько чисто Вы бы хотели думать о разделении обязанностей.

Если вы говорите с пуристами, они скажут, что модели Eloquent не являются DTO, и они не являются моделями доменов. Репозиторий вернет красноречивую модель, которая будет сопоставлена ​​с моделью предметной области. Затем эту модель предметной области можно изменить или преобразовать в DTO, который можно использовать для чтения данных. В этом случае обязанности разделены за счет большего количества кода.

Если вы говорите с прагматиками, они скажут, что Eloquent модели - это DTO и модели предметной области (а иногда даже и репозитории). Поскольку красноречивые модели отвечают за хранение данных, их извлечение, изменение данных и передачу этих данных в другие части приложения.

В конце концов, все зависит от предпочтений. Вы можете go чистым, вы можете go прагматическим c, вы можете даже выбрать что-то промежуточное. Это зависит только от того, насколько вы продвинутый кодер, насколько велик проект, насколько он должен обслуживаться, насколько быстро должны быть внесены изменения и т. Д. c.

Tdlr

Репозиторий может вернуть DTO или модель предметной области в зависимости от того, насколько чисто вы думаете с точки зрения разделения обязанностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...