Что такое Domain-Driven Design (DDD)?

Ответ

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 наиболее эффективен в сложных, долгоживущих проектах, где бизнес-логика является ключевым конкурентным преимуществом.