[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-arkhitektura-prilozheniy-chto-takoe-ddd-domain-driven-design-nazovite-osnovnye-ponyatiya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},126,"chto-takoe-ddd-domain-driven-design-nazovite-osnovnye-ponyatiya",3,"arkhitektura-prilozheniy","Архитектура приложений","🏗️","Что такое DDD (Domain-Driven Design), назовите основные понятия","Domain-Driven Design (DDD) — подход к разработке программного обеспечения, при котором в центре проектирования находится предметная область (домен) бизнеса. Предложен Эриком Эвансом в книге «Domain-Driven Design: Tackling Complexity in the Heart of Software» (2003).\n\nDDD особенно полезен в проектах со сложной бизнес-логикой, где бизнес-правила являются главной ценностью системы (банковские приложения, страхование, логистика).\n\n### Стратегические паттерны\n\n#### Ubiquitous Language (Единый язык)\n\nОбщий язык, разделяемый разработчиками и бизнес-экспертами. Термины из этого языка используются в коде, документации и разговорах. Например, в банковском контексте: «Платёжное поручение», «Корреспондентский счёт», «Операционный день».\n\n```java\n\u002F\u002F Единый язык в коде: не \"processItem()\", а \"executePaymentOrder()\"\npublic class PaymentOrder {          \u002F\u002F Платёжное поручение\n    private Money amount;            \u002F\u002F Сумма\n    private Account payerAccount;    \u002F\u002F Счёт плательщика\n    private Account payeeAccount;    \u002F\u002F Счёт получателя\n\n    public void execute() { ... }    \u002F\u002F Исполнить\n    public void reject(String reason) { ... }  \u002F\u002F Отклонить\n}\n```\n\n#### Bounded Context (Ограниченный контекст)\n\nЯвная граница, внутри которой определённая модель однозначна и согласована. Один и тот же термин может означать разные вещи в разных контекстах.\n\n```\n┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐\n│   Контекст       │     │   Контекст       │     │   Контекст       │\n│   «Платежи»      │     │   «Клиенты»      │     │   «Риски»        │\n│                  │     │                  │     │                  │\n│  Account =       │     │  Account =       │     │  Account =       │\n│  расчётный счёт  │     │  учётная запись   │     │  объект скоринга │\n│  с балансом      │     │  клиента в ЛК     │     │                  │\n└──────────────────┘     └──────────────────┘     └──────────────────┘\n```\n\n### Тактические паттерны\n\n#### Entity (Сущность)\n\nОбъект, обладающий уникальной идентичностью, которая сохраняется на протяжении всего жизненного цикла. Две сущности с одинаковыми полями, но разными ID — это разные сущности.\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\npublic class Account {\n    private final AccountId id;  \u002F\u002F идентичность\n    private Money balance;\n    private AccountStatus status;\n\n    \u002F\u002F Бизнес-поведение внутри сущности (Rich Domain Model)\n    public void withdraw(Money amount) {\n        if (status != AccountStatus.ACTIVE)\n            throw new AccountNotActiveException(id);\n        if (balance.isLessThan(amount))\n            throw new InsufficientFundsException(id, amount);\n        balance = balance.minus(amount);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n#### Value Object (Объект-значение)\n\nОбъект, определяемый своими атрибутами, а не идентичностью. Два Value Object с одинаковыми полями — это один и тот же объект. Неизменяем (immutable).\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\npublic final class Money {\n    private final BigDecimal amount;\n    private final Currency currency;\n\n    public Money(BigDecimal amount, Currency currency) {\n        this.amount = amount;\n        this.currency = currency;\n    }\n\n    public Money plus(Money other) {\n        if (!currency.equals(other.currency))\n            throw new CurrencyMismatchException();\n        return new Money(amount.add(other.amount), currency);\n    }\n\n    \u002F\u002F equals() и hashCode() по всем полям\n}\n```\n\n\u003C\u002Fdetails>\n\n#### Aggregate (Агрегат)\n\nКластер связанных сущностей и Value Objects, объединённых под одним корнем (Aggregate Root). Внешний мир взаимодействует с агрегатом только через корень. Агрегат гарантирует согласованность инвариантов.\n\n\u003Cdetails>\u003Csummary>Пример кода\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Aggregate Root\npublic class Order {\n    private OrderId id;\n    private List\u003COrderItem> items;  \u002F\u002F часть агрегата\n    private Money totalAmount;\n\n    public void addItem(Product product, int quantity) {\n        items.add(new OrderItem(product, quantity));\n        recalculateTotal();\n    }\n\n    private void recalculateTotal() {\n        totalAmount = items.stream()\n            .map(OrderItem::getSubtotal)\n            .reduce(Money.ZERO, Money::plus);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n#### Другие тактические паттерны\n\n- **Repository (Репозиторий)** — абстракция для доступа к агрегатам. Создаёт иллюзию коллекции в памяти. Интерфейс определяется в домене, реализация — в инфраструктуре.\n- **Domain Event (Доменное событие)** — событие, значимое для бизнеса, которое произошло в домене: `PaymentExecuted`, `AccountBlocked`, `LimitExceeded`.\n- **Domain Service (Доменный сервис)** — бизнес-логика, которая не принадлежит ни одной конкретной сущности (например, конвертация валют между двумя счетами).\n\n> **На собеседовании:** Интервьюер хочет услышать разницу между стратегическими (Bounded Context, Ubiquitous Language) и тактическими (Entity, Value Object, Aggregate) паттернами. Частая ошибка — знать только тактические паттерны и не понимать, зачем нужен Bounded Context.","","middle",[15,16,17,18],"domain-driven-design","ddd","bounded-context","architecture",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":34,"featuredSnippetReady":35},"DDD (Domain-Driven Design): основные понятия — Gymterview","Domain-Driven Design — подход, в центре которого предметная область. Ubiquitous Language, Bounded Context, Entity, Value Object, Aggregate, Domain Event.","Domain-Driven Design — подход к разработке, в центре которого предметная область бизнеса. Основные паттерны и понятия.",[26,27,28,29,30,31,32,33],"DDD","Domain-Driven Design","Bounded Context","Ubiquitous Language","Aggregate","Entity","Value Object","Эрик Эванс","Domain-Driven Design — подход к разработке, предложенный Эриком Эвансом, при котором в центре проектирования находится предметная область бизнеса. Стратегические паттерны: Ubiquitous Language (единый язык разработчиков и бизнес-экспертов) и Bounded Context (явная граница, внутри которой модель однозначна). Тактические паттерны: Entity (объект с уникальной идентичностью), Value Object (неизменяемый объект, определяемый атрибутами), Aggregate (кластер связанных объектов с корнем), Repository, Domain Event и Domain Service.",true]