Skip to content

Latest commit

 

History

History
55 lines (39 loc) · 2.4 KB

File metadata and controls

55 lines (39 loc) · 2.4 KB

Команды и запросы: правило разделения обязанностей

Метод может выполнять одно из двух действий:

  • Команда — изменяет состояние объекта или системы.
  • Запрос — возвращает данные.

Но он никогда не должен совмещать эти роли. Когда метод одновременно и изменяет состояние, и возвращает результат, это создаёт двусмысленность. Такой код сложнее читать, тестировать и предсказать его поведение.

Пример, который нарушает принцип:

// Плохо [✗]
function updateName(string $name): string {
    // Обновляем значение в базе данных ...

    return $this->name;
}

На первый взгляд метод выглядит удобным, но он смешивает команду (updateName) и запрос (возврат string). В результате становится неочевидно: вызываем мы его ради обновления данных или ради получения значения?

Правильное разделение обязанностей

// Хорошо [✓]
function updateName(string $name): void {
    // Обновляем значение в базе данных ...
}

function getUserName(): string {
    return $this->name;
}

Теперь всё прозрачно: один метод изменяет состояние, другой — возвращает данные.

Ещё один шаг вперёд: chainable-методы

Методы, которые возвращают $this, позволяют создавать цепочки вызовов (fluent-интерфейсы). Это делает код декларативным, выразительным и более компактным:

// Хорошо [✓]
$user
    ->updateName('John')
    ->updateEmail('john@example.com')
    ->activate();

Такой стиль повышает читаемость: мы видим не набор разрозненных вызовов, а последовательное описание намерений.