Читал ли книгу Эванса «Domain-Driven Design»?

«Читал ли книгу Эванса «Domain-Driven Design»?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, "Domain-Driven Design: Tackling Complexity in the Heart of Software" Эрика Эванса — это классика, которая сильно повлияла на мой подход к проектированию сложных бизнес-систем. Ключевая ценность книги — введение единого языка (Ubiquitous Language) между разработчиками и экспертами предметной области и тактические паттерны для его отражения в коде.

В PHP-проектах я применяю такие паттерны DDD, как:

  • Value Objects для представления неделимых, неизменяемых концепций (Email, Money).
  • Aggregates для инкапсуляции инвариантов и управления целостностью группы связанных сущностей.
// Пример Value Object и Aggregate Root
final class Email implements Stringable {
    private function __construct(private string $value) {}

    public static function fromString(string $value): self {
        if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException('Invalid email');
        }
        return new self($value);
    }
    public function __toString(): string { return $this->value; }
}

class Order // Aggregate Root
{
    private array $lineItems = [];
    private OrderStatus $status;

    public function addLineItem(ProductId $productId, Quantity $qty, Price $price): void {
        // Инвариант: нельзя добавлять товары в завершенный заказ
        if ($this->status->isFinal()) {
            throw new OrderAlreadyFinalizedException();
        }
        $this->lineItems[] = new LineItem($productId, $qty, $price);
    }
}

Книга Эванса задает стратегический каркас, а для практической реализации в PHP я также рекомендую книги Вона Вернона и примеры из фреймворков, таких как Broadway (для CQRS/Event Sourcing).