Чистая архитектура: почему бы не использовать объект в качестве модели запроса варианта использования (интерактор) - PullRequest
0 голосов
/ 15 октября 2018

Я прочитал книгу PPP и книги по чистому коду, кодированию и архитектуре.

Я знаю, что:

  • Чистая архитектура - это многоуровневая архитектура
  • Чтоэто как открытая или закрытая архитектура
  • В книгах по чистой архитектуре предполагается, что каждый слой может получить доступ к своим внутренним слоям, а не только к самому следующему внутреннему слою

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

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

Теперь мой вопрос: почему мы не можем ввести Entity в качестве параметра типанепосредственно из сценария использования или контроллера, и почему мы должны определять структуры данных или DTO на средних уровнях и беспокоиться о преобразовании объекта в структуры данных и возвращать его в качестве ответа, в то время как нам разрешено использовать и видеть Entity на уровне контроллерапоскольку правило доступа не нарушено?

Рассмотрим этот пример. Предположим, у нас есть:

  • JobView
  • JobController
  • JobUseCase(RequestModel) : ResponseModel
  • JobEntity

Теперь, если JobView хочет позвонить JobController, он должен пройти RequestModel.Теперь мы можем просто ввести JobEntity как RequestModel следующим образом:

  • JobView
  • JobController
  • JobUseCase(JobEntity)
  • JobEntity

Я знаю, что подобное будет увеличивать хрупкость кода, потому что если мы изменим JobEntity, то JobView должен измениться.Но разве чистая архитектура заставляет принципы SOLID быть хрупкими или жесткими, как правило?!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Почему бы не использовать сущность в качестве модели запроса варианта использования?

Вы сами ответили на этот вопрос: даже если вы не нарушите правило зависимости, это увеличит хрупкость кода.

почему мы не можем напрямую представить Entity в качестве типа параметра для сценария использования или контроллера и почему мы должны определить структуры данных или DTO на средних уровнях и беспокоить преобразование объекта в структуры данных и вернуть его в ответв то время как нам разрешено использовать и видеть сущность на уровне контроллера, поскольку правило доступа не нарушено?

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

Даже если у объекта может быть тот же код, что и у DTO, это должноследует считать совпадением, так как причины их изменения совершенно разные (принцип единой ответственности).Может показаться, что это вступает в противоречие с популярным принципом DRY (не повторяйте себя), но DRY утверждает, что знание не должно дублироваться, код может по-прежнему выглядеть одинаково в разных частях приложения, пока они изменяютсяпо разным причинам.

0 голосов
/ 01 ноября 2018

Не уверен, что понимаю причину вашего вопроса:

Приводит ли чистая архитектура к принципам SOLID или не является хрупким или жестким, как правило?

Как Чистая архитектура может вызвать жесткость и хрупкость?Определение архитектуры сводится к следующему: как позаботиться широко о фундаментальных принципах ООП, таких как SOLID и другие

С другой стороны, ваш следующий пример определенноденатура Чистая архитектура :

JobView > JobController > JobUseCase(JobEntity) > JobEntity

Thisнеявно говорит нам, что вы, скорее всего, извлекли свою сущность из контроллера, который полностью пропускает точку Interactor (или варианта использования) и, следовательно, Clean Architecture .

Интеракторы инкапсулируют бизнес-правила приложений, такие как взаимодействия с сущностями и CRUD для сущностей, выполняемых через Entity Gateway , который, в свою очередь, инкапсулирует уровень инфраструктуры.

Кроме того, в контексте Чистая архитектура ваши сущности, являющиеся частью уровня вашей модели, не должны иметь ничего общего с вашим контроллером, который является частью вашего механизма доставки.или точнее, который является оценщиком сообщения HTTP-запроса.Таким образом, денатурирование компонента нижнего уровня, который является контроллером, отрицательно повлияет на SRP ( => увеличение хрупкости ) и степень развязки между вашими компонентами ( => увеличение жесткости ).


Вы говорите:

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

* * * * * * * * * * * *1062* вашей структуры сущностей принадлежат к инфраструктуреслой, и они должны быть обернуты, адаптированы Entity Gateway . Закон Деметры может быть важно соблюдать здесь, поскольку мы говорим о реализации порта закрытого уровня инфраструктуры (EntityGatewayInterface).


Наконец, я подозреваю следующее предположениеошибочность, и поэтому все дальнейшие предположения, основанные на этом, приведут к полной путанице:

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

Но независимо от того, вызывает ли он закрытие слоистых слоев или нет, Чистая архитектура явно и конкретно определяет себя (отношение между компонентами), например, на диаграмме классов UML ниже:

enter image description here

Я вижу только близко слоистая архитектура из этой диаграммы ...

Кажется me , что открытый слой являетсяБолее того, он не ограничивает то, что уровень должен ограничивать по своей природе, потому что по определению уровень является изоляцией, абстракцией группы компонентов, сокращенной до его порта, предназначенной для уменьшения технических долгов, таких как хрупкость и т. д...


Дополнительные ресурсы

  • Конференция, проведенная дядей Бобом, достаточно хорошо объясняет, почему и как реализовать Чистую архитектуру: https://www.youtube.com/watch?v=o_TH-Y78tt4
...