- 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
6.0 KiB
6.0 KiB
Domain-Driven Design (DDD)
Навигация
Что такое 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 (Сущность)
Определение: Объект с уникальной идентичностью.
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 (Объект-значение)
Определение: Объект без идентичности, определяемый только своими атрибутами.
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 (Агрегат)
Определение: Граница консистентности данных.
Правила агрегатов:
- Один агрегат = одна транзакция
- Ссылки только на корень агрегата
- Обновления только через корень
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 (Репозиторий)
Определение: Интерфейс для доступа к агрегатам.
public interface OrderRepository {
Order findById(OrderId id);
void save(Order order);
List<Order> findByCustomerId(CustomerId customerId);
}
5. Domain Service (Доменный сервис)
Определение: Операция, которая не принадлежит ни одной сущности.
public class OrderPricingService {
public Money calculateTotalPrice(Order order, PricingRules rules) {
// сложная логика расчета цены
// не принадлежит ни Order, ни PricingRules
}
}
6. Domain Event (Доменное событие)
Определение: Событие, произошедшее в домене.
public class OrderCreatedEvent {
private final OrderId orderId;
private final CustomerId customerId;
private final LocalDateTime occurredAt;
// конструктор и геттеры
}
Event Storming (Мозговой штурм событий)
Event Storming — методология для изучения домена через события.
Процесс:
- Доменные события — что происходит в системе
- Команды — что вызывает события
- Агрегаты — что обрабатывает команды
- Политики — бизнес-правила
- Read Models — что нужно для отображения
Пример:
Команда: CreateOrder
↓
Агрегат: Order
↓
Событие: OrderCreated
↓
Политика: SendConfirmationEmail
↓
Команда: SendEmail