Уроки
Пошаговые разборы рефакторинга: каждый шаг (step-N/) - независимая рабочая версия кода с теми же тестами. Поведение не меняется, меняется устройство, и тесты это доказывают на каждом шаге.
Группы
001-refactor-to-strategy/- От switch к стратегии002-extract-repository/- Выделение репозитория003-events-instead-of-calls/- События вместо прямых вызовов
Темы
- От switch к стратегии (Refactor to Strategy) - расчёт доставки с
switchпо способу иifпо стране превращается в тарифы-стратегии и правила из конфига - Выделение репозитория (Extract Repository) - SQL уезжает из контроллера в шлюз таблицы, потом за интерфейс репозитория
- События вместо прямых вызовов (Events instead of calls) - оформление заказа сообщает о событии, а почта, склад и аналитика подписываются сами
001-refactor-to-strategy/От switch к стратегии
- step-1/Шаг 1: одна функция на все способы доставки Исходный код: switch по способу доставки, внутри if по стране, цены зашиты прямо в ветках.
- step-2/Шаг 2: способы доставки за общим интерфейсом Каждая ветка switch становится своим классом с методом cost, а калькулятор только выбирает, кому отдать посылку.
- step-3/Шаг 3: реестр тарифов и правила из конфига Тарифы регистрируются по коду, а какой тариф у какого способа в какой стране - решает список правил из конфига.
002-extract-repository/Выделение репозитория
- step-1/Шаг 1: SQL прямо в контроллере Исходный код: контроллер заказов сам пишет SQL, разбирает ряды и решает, можно ли отменить заказ.
- step-2/Шаг 2: шлюз таблицы Все SQL-строки для orders уезжают в класс OrdersTable, контроллер зовёт его методы, но всё ещё работает с рядами.
- step-3/Шаг 3: репозиторий в домене Заказ становится сущностью Order с правилом отмены, доступ к заказам - интерфейсом OrderRepository, а SQL уходит в одну из его реализаций.
003-events-instead-of-calls/События вместо прямых вызовов
- step-1/Шаг 1: касса зовёт всех сама Исходный код: Checkout сохраняет заказ и по очереди вызывает склад, аналитику и почту.
- step-2/Шаг 2: доменное событие и синхронный диспетчер Checkout публикует OrderPlaced, а склад, аналитика и почта подписываются на него сами.
- step-3/Шаг 3: независимые подписчики Диспетчер ловит ошибку каждого слушателя, отдаёт её в отчёт и зовёт следующих: упавшая аналитика больше не мешает письму.