Чистая архитектура: какой уровень для объектов в памяти?

#clean-architecture

#чистая архитектура

Вопрос:

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

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

Мой вопрос в том, куда бы вы поместили это представление в памяти? С одной стороны, это не более чем деталь, подобная базе данных, и, следовательно, она находится на самом внешнем уровне. С другой стороны, он точно представляет объекты с некоторой дополнительной информацией — но в итоге это просто список простых старых объектов. Это рекомендовало бы базовый уровень, не так ли?

Лично я склонен использовать первый вариант и обрабатывать его как другой источник данных — как деталь.

С уважением, Тьери

Ответ №1:

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

Ответ №2:

Правильный ответ «это зависит».

Существует огромная разница между «теорией» и «практикой».

Не поймите меня неправильно: «теория» — это хорошо. «Теория» представляет «Мудрость», а мудрость ВСЕГДА хороша.

Но…

«Слои» в вашей «архитектуре» обязательно будут определяться — среди прочего — тем, какие фреймворки вы выберете для реализации своего проекта. Ваш выбор, если вы кодируете на PHP / Codeigniter с MySQL, обязательно будет отличаться от того, если вы кодируете на ASP.Net MVC 5 и Entity Framework. Они будут отличаться, если вы кодируете на Java / Spring Boot с гибернацией. Они могут даже отличаться, если вы решите использовать Hibernate / JPA или Hibernate / HQL.

Лучший подход — прочитать Роберта Мартина … и Алистер Кокберн, и Скотт Макконнелл, и как можно больше других, постарайтесь усвоить их «мудрость»… а затем «выбирайте с умом», когда сталкиваетесь с реальным проектом и реальными ограничениями.

Надеюсь, это поможет…

PS, в ответ на ваш вопрос:

Если бы это был проект Java Spring Boot / Hibernate, и у меня была полная свобода:

  1. Я бы реализовал свои «сущности» как POJOs

  2. Я бы использовал синтаксис Hibernate / JPA (например, используйте «EntityManager» и др.)

  3. Я бы гарантировал, что смогу переключаться между базой данных в памяти (например, H2) для тестирования и RDMS (например, Oracle), просто изменив конфигурационный файл «datasource» моего application.properties.

Другими словами, я бы «обработал это как другой источник данных — как деталь» 😉