Активные сервисы представляются гномиками, работающими и взаимодействующими для обработки запросов к системе. Для иллюстрации — схема интернет-магазина в таком представлении. Через Опыт взаимодействия некоторое время эти же принципы применили для проектирования софта и даже попробовали написать язык, на котором по замыслу авторов непрограммисты могли бы описывать, что им требуется от софта.
Мы работаем в режиме append-only и получаем от этого кучу бенефитов. Во-первых, мы видим не только конечный state, но и как мы к этому state пришли. Если у нас есть какой-то аккаунт, мы хотим видеть не просто, что на нем лежит 100 рублей, а каким образом эти деньги накопились. Чтобы сервис корректно работал и выполнял все свои функции, между модулями системы нужно настроить связи. Такое разрастание функционала грозит образованием «больших комков грязи» — massive balls of mud. Это крупные массивы запутанного, неряшливого кода, которые снижают производительность сервиса и осложняют его поддержку в будущем.
Именно на основании контекстов можно разделить код на модули/пакеты/компоненты таким образом, чтобы изменения в каждом из них оказывали минимальное (или нулевое) влияние на других. Таким образом, DDD сместил фокус от описания системы как черного ящика к описанию внутреннего устройства, или системы прозрачного ящика. А требования как описание черного ящика стали короткоживущими временными объектами от пожелания пользователя до внесения изменений в модель. Они заменили две модели, предметной области и системы, на единую модель, описанную на едином языке проекта. Эти шаблоны описаны более подробно Мартином Фаулером, в его книге “Архитектура корпоративных программных приложений.
Иногда эти мусорные поля неправильно понимаются другими людьми, и туда начинают попадать несоответствующие данные. Все это приводит к тому, что объект рано или поздно приходит в несогласованное состояние. Если бы мы как-то умели проверять инвариант объекта, мы бы часто видели, что объект не отвечает своему инварианту. Domain-Driven Design — не первый подход, который поднимает проблему анемичных и дырявых моделей.
Преимущества Разработки По Domain Driven Design
- На основе этого сделаем небольшой вывод о том, что данный шаблон (“Модель предметной области”) лучше всего подойдёт, к примеру, для такой непростой области, как финансовый рынок.
- И самое плохое, что у такого объекта нет границ и нет контракта.
- Именно поэтому важно уделять внимание терминам, которые используются в данной сфере.
Анемичные модели говорят о том, что у объекта нет бизнес-логики, то есть это такая DTO, которая содержит только данные. И такой объект, разумеется, должен быть дырявым, чтобы какой-то внешний Application Services мог его менять. И самое плохое, что у такого объекта нет границ и нет контракта. Мы не можем написать для него какие-то инварианты, потому что он слишком размазанный. Делая новую фичу, вам придется добавлять новые поля, и в какой-то момент у вас может появиться толерантность к плохому проектированию. Другая большая проблема такого подхода — это универсальные модели.
Например, в социальных сетях люди больше читают, чем пишут. Либо мы позволяем людям быстро писать, но тогда нам сложно вычитывать это все и отдавать людям. Либо мы оптимизированы под быстрое чтение, но долго записываем. Какие-то storage решают эту задачу успешнее, какие-то менее успешно. Например, мы начали автоматизировать заказ с кассы ресторана, чтобы вы могли заказать пиццу, а мы — учесть ваш заказ. Потом мы переходим к доставке, и в сущность заказа снова добавляем поля.
Вместо этого все дело в понимании проблемы, которую вы должны решить в контексте бизнеса. 2) Следующий проект, на который следует обратить внимание – это приложение разработанное Yves Goeleven, создание данного приложения описано в его блоге (так же посвященному основным концептам DDD). Следует обратить внимание на его реализацию взаимодействия шаблонов Repository и Specification. Именно в этом ядре концентрируются знания о предметной области, поверх которых потом формируются новые слои со служебной и второстепенной функциональностью.
Так, без DDD модель «пользователь» описывает все роли, и поэтому очень разрастается. Она описывает и посетителей сайта (имя пользователя, адрес), и данные авторизации (когда пользователь зашел в систему), и разграничения прав доступа для модераторов. В DDD такая модель разделяется на отдельные модели для каждого ограниченного контекста, чтобы не возникало путаницы. Посетитель, модератор, администратор — это разные типы пользователей, каждый из которых относится к своей области. DDD — это не просто модное словечко для LinkedIn-профиля или очередной инструмент для «причесывания» кода.
Подведем Итог: Что Дает Клиенту И Разработчику Ddd
Об этом за 10 минут не расскажешь, но можно https://deveducation.com/ почитать «зелёную» книжку. В моей следующей статье сущности и объекты-значения с некоторыми примерами кодов. Репозитории — это такие сервисы, которые используют глобальный интерфейс, чтобы обеспечить доступ ко всем сущностям и ценностным объектам, находящимся в конкретной группе агрегатов. Например, можно считать команду «резать» репозиторием, когда она применяется к группе агрегатов «фрукты», которая включает агрегаты «яблоки», «груши», «бананы».
И то, и другое — настоящая головная боль, от которой лучше избавляться превентивно. Особенно когда речь идет о крупных корпоративных системах, где код разрастается быстрее, чем список отговорок project-менеджера на вопрос «когда релиз?
Во-первых, знаний может оказаться недостаточно, чтобы запустить процесс. Во-вторых, чуваки из вашей команды могут подумать, что вы занимаетесь глупостями и всё поломают, напихав палок в колёса. Представим, что ddd подход вы разработчик, которому нравится DDD, и вы думаете, что в вашей компании этот подход можно применить, чтобы причинить людям счастье. Кроме ограниченного контекста есть ещё всякие штуки типа карт контекстов, единого языка, отношений между контекстами, карты трансляций… уффф!
Какие Трудности Могут Возникнуть При Использовании Area Driven Design Подхода?
То есть мы сохраняем в базу и говорим, что апдейтим только объект с версией 4. Если вдруг в базе лежит уже 5 или 6 версия, мы падаем с exception optimistic concurrency (это мы так в коде реализовали), и цикл повторяется заново. Если вы про это не подумаете, то всё просто разъедется.