Ответ
Domain-Driven Design (DDD) — это методология разработки ПО, при которой структура и язык кода (модель домена) соответствуют бизнес-логике. Основная цель — справиться со сложностью в больших системах, сфокусировавшись на ядре предметной области.
Ключевые принципы:
- Единый язык (Ubiquitous Language): Общая терминология, которую используют и разработчики, и эксперты предметной области. Это устраняет недопонимания и делает код самодокументируемым.
- Ограниченный контекст (Bounded Context): Четкое определение границ, в рамках которых конкретная модель домена является согласованной и имеет смысл. В разных контекстах один и тот же термин (например, «Клиент») может означать разное.
- Агрегаты (Aggregates): Кластер связанных объектов, который рассматривается как единое целое. Все операции с объектами внутри агрегата должны проходить через его корень (Aggregate Root).
- Сущности (Entities) и Объекты-значения (Value Objects): Сущности имеют уникальный идентификатор и жизненный цикл (например,
Пользователь
), в то время как объекты-значения определяются своими атрибутами и являются неизменяемыми (например,ДенежнаяСумма
).
Пример на Python:
# Value Object - неизменяемый, определяется значением
class Money:
def __init__(self, amount: float, currency: str):
if amount < 0:
raise ValueError("Amount cannot be negative")
self.amount = amount
self.currency = currency
# Aggregate Root / Entity - имеет ID и управляет жизненным циклом
class Order:
def __init__(self, order_id: int):
self.id = order_id
self._items = []
self._total_price = Money(0, "RUB")
def add_item(self, product_name: str, price: Money):
# Бизнес-логика инкапсулирована внутри модели
self._items.append({"name": product_name, "price": price})
self._total_price = Money(
self._total_price.amount + price.amount,
price.currency
)
def get_total_price(self) -> Money:
return self._total_price
DDD наиболее эффективен в сложных, долгоживущих проектах, где бизнес-логика является ключевым конкурентным преимуществом.