Files
Alexander Abakumov 15e744da49 Initial commit: Complete Software Architecture course with 11 modules
- Added comprehensive course structure with 11 modules
- Included theoretical content, practical examples, and tasks
- Multi-language code examples (Java, Rust, Node.js, Python)
- Detailed analysis of architectural approaches and trade-offs
- Complete caching strategies documentation
- Architecture examples from real-world systems (Twitter, Netflix, Uber)
- Structured navigation and learning path
- Ready for educational use
2025-09-09 22:08:07 +03:00

174 lines
6.0 KiB
Markdown

# Domain-Driven Design (DDD)
## Навигация
- [🏠 Главная страница курса](../../../README.md)
- [📚 Модуль 2](../README.md)
---
## Что такое DDD
**Domain-Driven Design** — это подход к разработке программного обеспечения, который:
- Фокусируется на бизнес-домене
- Использует единый язык (Ubiquitous Language)
- Разделяет систему на ограниченные контексты (Bounded Contexts)
## Стратегическое проектирование
### 1. Bounded Context (Ограниченный контекст)
**Определение:** Четко определенная граница, внутри которой модель домена применима.
**Пример:**
```
E-commerce система:
- Order Context → заказы, платежи
- Inventory Context → товары, склад
- Customer Context → клиенты, профили
- Shipping Context → доставка, логистика
```
### 2. Context Map (Контекстная карта)
**Определение:** Диаграмма, показывающая отношения между ограниченными контекстами.
**Типы отношений:**
- **Shared Kernel** — общая модель
- **Customer-Supplier** — клиент-поставщик
- **Conformist** — соответствие
- **Anticorruption Layer** — антикоррупционный слой
- **Open Host Service** — открытый хост-сервис
- **Published Language** — опубликованный язык
### 3. Ubiquitous Language (Единый язык)
**Определение:** Общий язык, используемый командой для описания домена.
**Принципы:**
- Используется в коде
- Используется в документации
- Используется в общении
- Эволюционирует с пониманием домена
## Тактическое проектирование
### 1. Entity (Сущность)
**Определение:** Объект с уникальной идентичностью.
```java
public class Order {
private OrderId id; // уникальный идентификатор
private CustomerId customerId;
private List<OrderItem> items;
private OrderStatus status;
// методы бизнес-логики
public void addItem(ProductId productId, int quantity) {
// бизнес-правила
}
}
```
### 2. Value Object (Объект-значение)
**Определение:** Объект без идентичности, определяемый только своими атрибутами.
```java
public class Money {
private final BigDecimal amount;
private final Currency currency;
public Money(BigDecimal amount, Currency currency) {
this.amount = amount;
this.currency = currency;
}
// методы для работы с деньгами
public Money add(Money other) {
if (!this.currency.equals(other.currency)) {
throw new IllegalArgumentException("Different currencies");
}
return new Money(this.amount.add(other.amount), this.currency);
}
}
```
### 3. Aggregate (Агрегат)
**Определение:** Граница консистентности данных.
**Правила агрегатов:**
- Один агрегат = одна транзакция
- Ссылки только на корень агрегата
- Обновления только через корень
```java
public class Order { // корень агрегата
private OrderId id;
private CustomerId customerId;
private List<OrderItem> items; // сущности внутри агрегата
private OrderStatus status;
// методы для изменения состояния
public void addItem(ProductId productId, int quantity) {
// валидация бизнес-правил
items.add(new OrderItem(productId, quantity));
}
}
```
### 4. Repository (Репозиторий)
**Определение:** Интерфейс для доступа к агрегатам.
```java
public interface OrderRepository {
Order findById(OrderId id);
void save(Order order);
List<Order> findByCustomerId(CustomerId customerId);
}
```
### 5. Domain Service (Доменный сервис)
**Определение:** Операция, которая не принадлежит ни одной сущности.
```java
public class OrderPricingService {
public Money calculateTotalPrice(Order order, PricingRules rules) {
// сложная логика расчета цены
// не принадлежит ни Order, ни PricingRules
}
}
```
### 6. Domain Event (Доменное событие)
**Определение:** Событие, произошедшее в домене.
```java
public class OrderCreatedEvent {
private final OrderId orderId;
private final CustomerId customerId;
private final LocalDateTime occurredAt;
// конструктор и геттеры
}
```
## Event Storming (Мозговой штурм событий)
**Event Storming** — методология для изучения домена через события.
### Процесс:
1. **Доменные события** — что происходит в системе
2. **Команды** — что вызывает события
3. **Агрегаты** — что обрабатывает команды
4. **Политики** — бизнес-правила
5. **Read Models** — что нужно для отображения
### Пример:
```
Команда: CreateOrder
↓
Агрегат: Order
↓
Событие: OrderCreated
↓
Политика: SendConfirmationEmail
↓
Команда: SendEmail
```