Проект

Будем разработать приложение для публикации текстов. Приложение реализует следующие сценарии(use-cases):

  • регистрация пользователя
  • вход в систему
  • выход из системы
  • создание поста
  • редактирование поста
  • отображение поста
  • отображение списка всех постов

Информация:

Проект структурно разбит на подпроекты. Каждый подпроект - clojure проект с собственными зависимостями, управляемыми с помощью tools.deps.

В текущем разделе мы реализуем подпроект core. Он будет содержать всю бизнес-логику нашего приложения. Остальные подпроекты будут зависеть от core, например, web - доставит приложение пользователю с помощью web технологий, а persistence - реализует работу с базой данных.

Реализуется это с помощью абстракций и инверсии засисимости. core объявляет абстракцию и примитивную реализацию для отладки и тестирования. Остальные подпроекты содержат промышленную реализацию этих абстракций.

core должен быть написан максимально качественно, ведь это и есть ваше приложение. Для остальных подпроектов планку качества можно опустить.

Согласно терминологии Clean Architecture логика приложения разделена между слоями Entities и UseCases. Для удобства разработки core содержит оба этих слоя. В зависимости от размера команды, наличия общей предметной области в разных проектах, может быть будет иметь смысл каждый слой оформить в виде подпроекта.

Термины DDD и Clean Architecture имеют пересечение. DDD оперирует понятием Entity - единица предметной области, а в Clean Architecture Entity - основной слой приложения. Поэтому основной слой приложения будет называться domain и содержать entities, services, value-objects. Следующий слой будет называться use-cases.

Исходники подпроекта