Skip to content

Instantly share code, notes, and snippets.

@Rhincodon
Last active November 8, 2017 10:33
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Rhincodon/14f091a73a101c5091c5 to your computer and use it in GitHub Desktop.
Save Rhincodon/14f091a73a101c5091c5 to your computer and use it in GitHub Desktop.
Немного о DDD [перевод]

Источник

Вопрос о DDD:

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

  • Что такое логика домена, слой домена, бизнес-логика, бизнес-слой, модель домена, объект домена, событие домена, эксперт по доменам, ядро домена?
  • Как обнаружить всё это в моём коде?
  • Laravel сделан над этими DDD понятиями? (я часто вижу такие вещи как сервисы, репозитории и др)
  • Где я могу научиться DDD очень простым способом? (Я имею ввиду реально очень простым способом)

Ответ:

Что такое домен? Я рассказал об этом уже немного в другом посте, но домен это всего лишь определение которое описывает то для чего вы делаете приложение — проблему которую вы пытаетесь решить. Это может быть разработка форума, система инвентаризации машин, программа для работы с аккаунтами. Это уникальные требования и правила.

Что не является доменом? Домен это не такие вещи как база данных, сессии, куки, роуты, посредники и тд. Это всё инфраструктура приложения или его логика. Она используется для функционирования сайта, но она отделена от всей логики которая используется для осуществления модели домена.

Что такое модель домена? Модель домена это абстрактное описание домена. Так же как например глина или цифровая модель концепта машины — она помогает дизайнерам и инженерам визуализировать то, что они собираются построить, и найти потенциальные проблемы с этим на стадии построения модели, чтобы не искать ошибки когда они построили уже 10 000 машин. С точки зрения разработки приложений, модель обычно это ничего больше чем большое кол-во диаграмм, иллюстрирующих как приложение должно себя вести чтобы полностью соответствовать требованиям домена.

Что такое логика домена? Логика домена это просто код который используется для реализации модели домена. Например для форума нужен код для блокировки пользователей, создания обсуждений, редактирования обсуждений, чтобы пользователи могли редактировать только свои обсуждения. Опять же логика домена отличается от таких вещей как код базы данных (или Eloquent) и тд. Она может использовать Eloquent, но всю работу с базой данных и написанием запросов Eloquent берёт на себя. Ваш домен не должен заботиться об этих деталях. Или не должен иметь понятие что ваши данные идут через HTTP. Это приводит меня к слою домена.

Что такое слой домена? По существу это то же самое что и логика домена — просто иной способ описать её. В идеальном мире, приложения создаются из слоёв, которые складываются друг на друге c хорошо описанными точками интеграции друг с другом. «Инфраструктура» (базы данных, сессии, куки и тд) могут быть одним слоем. «Приложение» (роутеры, контроллеры, посредники, вьюхи) могут быть следующим слоем. Обратите внимание что это относительно общее описание слоёв, и Laravel даёт их вам, чтобы вы могли о них не беспокоиться так сильно. «Домен» это слой который инкапсулирует в себе то что вы проектируете используя Laravel или любой другой фреймворк как средство.

В идеальном мире ваш домен должен быть в очень маленькой зависимости от слоёв инфраструктуры и приложения.

Что такое объект домена? Это просто объект, который описывает центральный элемент вашей логики домена. Пользователь, Подписчик, Форум и тд. Обычно эти сущности это объекты точно определённые и уникальные. Они так же могут быть и не обязательно уникальными, а могут инкапсулировать некоторые свойства и логику для реиспользования кода. Команда это простой неуникальный объект например. Или ПериодЗаписи тоже ещё один простой объект (используется для описания дат когда пользователь сможет записать в класс). Но ПериодЗаписи так же может быть и сущностью если вы сделаете его ей и дадите свой уникальный id. Всё зависит от того как вы используете объект.

Объект домена так же может быть старым добрым простым классом (service class, helper class, как назовёте вобщем), не обязательно быстрый простой объект как Команда, но что-либо что вы держите в базе с идентификатором.

По простому, объект домена это по сути что-либо что живёт в слое вашего домена и помогает осуществить модель домена.

Что такое событие домена? Событие домена это просто реакция на что-либо что случилось в слое вашего домена. Возвращаясь назад к примеру с форумом, если пользователь создаёт новое обсуждение, вы хотели бы распространить это событие. Зачем? Некоторые другие правила домена могут зависеть от этого события:

  • Когда пользователь создаёт новое обсуждение, отправить email всем подписчикам этой категории форума письмо
  • Когда пользователь создаёт новое обсуждение, отправить email всем друзьям/подписчикам этого пользователя
  • Когда пользователь создаёт новое обсуждение(в модерируемом форуме), отправить сообщение модератору, чтобы он смог просмотреть и опубликовать обсуждение.

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

Кто такой эксперт по доменам? Это персона которая понимает домен — проблему. Например, скажем вы строите приложение для контроля над воздушными перелётами — эксперт по доменам будет диспетчером который расскажет как контролировать воздушный траффик, как это должно работать и что должно приложение помогать ему делать. Иногда ваши клиенты действительно не являются экспертами в ихнем домене и вы должны идентифицировать проблемы за них. Возможно они не до конца понимают сердце проблемы или не так как они хотят её понимать.

Что такое бизнес-логика, бизнес-слой? Если быть честным, у меня нет хорошего ответа. Можно утверждать что бизнес-слой является подслоем слоя домена. Такие вещи как «если пользователь купит 10 предметов, дайте ему кредит в 50 $» - это бизнес правило которое вы должны осуществить с помощью кода. Но я персонально считаю что «бизнес» и «домен» являются в большинстве случаев взаимозаменяемыми в ихней сущности, не беспокойтесь о разделении их, если в них есть разница, этот процесс может заставить вас рвать на себе волосы в большинстве приложений.

Что такое ядро домена? Ещё одно описание понятия домена.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment