Самоучитель: PHP 8.5: инженерный практикум
Глава 4 из 22I. Надёжные примитивы75 минут

Глава 4. Решения как таблицы правил, а не лес условий

Условие становится поддерживаемым, когда каждая ветвь отвечает на предметный вопрос и возвращает различимую причину, а не просто true или false.

После главы вы сможете
  • выделить guard clauses
  • выбрать match по смыслу
  • покрыть таблицу решений тестами

Сначала перечислите исходы

Тренировку можно опубликовать, если у неё есть владелец, хотя бы один подход и допустимая длительность. Вместо вложенных if начните с таблицы: условие, исход, код причины и сообщение для интерфейса. Это обнаруживает пропущенные комбинации до написания кода.

Boolean удобен для простого вопроса, но теряет объяснение. На границе use case полезнее вернуть успешный результат либо типизированную причину: missing_sets, invalid_duration, forbidden. HTTP-слой позже сопоставит её со статусом и текстом.

Последовательность решения

Публикация тренировкиКаждый guard останавливает сценарий с собственной причиной до изменения состояния.ВладелецauthorizeПодходыnot emptyВремяrangeСтатусdraftPublishevent
Каждый guard останавливает сценарий с собственной причиной до изменения состояния.

Строгое сравнение как базовый выбор

Позиция 0, строка '0', false и null часто означают разные вещи. Начинайте с === и ослабляйте сравнение только при сформулированной необходимости. Особенно внимательно проверяйте функции, которые возвращают число или false.

Оператор ?? отвечает только на отсутствие ключа или null. Тернарный оператор отвечает на истинность выражения. Подмена одного другим создаёт ошибки с нулевыми значениями, поэтому выбор оператора должен следовать модели данных.

Match для закрытого набора

<?php
declare(strict_types=1);

function intensityLabel(int $repetitions): string
{
    return match (true) {
        $repetitions < 1 => throw new InvalidArgumentException('Нужен хотя бы один повтор'),
        $repetitions <= 5 => 'силовой диапазон',
        $repetitions <= 12 => 'смешанный диапазон',
        default => 'выносливость',
    };
}

echo intensityLabel(8);

Не смешивайте решение и эффект

Функция, которая одновременно вычисляет право, обновляет запись, отправляет письмо и печатает HTML, почти не тестируется. Сначала получите решение, затем use case выполнит разрешённые эффекты в известном порядке и зафиксирует событие.

Короткая guard clause уменьшает вложенность, но не должна превращаться в россыпь безымянных условий. Выносите повторяющееся правило в функцию с предметным именем: canPublish, ownsWorkout, durationIsAllowed.

Лабораторная работа

Составьте таблицу публикации тренировки минимум с шестью строками. Реализуйте guard clauses и тест для каждой причины отказа, включая пограничные значения длительности.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie