КОД КАК У СЕНЬОРА. РЕФАКТОРИНГ

YOUTUBE · 30.11.2025 07:12

Ключевые темы и таймкоды

Введение в рефакторинг

0:04
  • Рефакторинг отличается от простого переписывания кода.
  • Пример из книги Мартина Фаудера иллюстрирует проблемы корпоративного кода.
  • Программа для печати чека в видеопрокате требует добавления новых функций.

Зачем нужен рефакторинг

1:03
  • Рефакторинг помогает избежать крайностей в коде.
  • Автотесты — противоядие от страха сломать работающий код.
  • Большинство тестов, написанных для реальных продуктов, не подходят для рефакторинга.

Структура кода и цели рефакторинга

2:01
  • Проект состоит из четырёх классов: главного, клиента, аренды и фильма.
  • Цель рефакторинга — добавить вывод данных в HTML и новые типы фильмов.

Проблема длинных методов

3:00
  • Длинные методы трудно читаемы и склонны к росту.
  • Короткие методы лучше способствуют переиспользованию кода.
  • Хорошая длина метода — от одной до четырёх строк.

Извлечение методов

4:00
  • Извлечение методов — первый шаг к чистому коду.
  • Подсказки для извлечения: циклы, условные операторы, комментарии.
  • Автоматический рефакторинг помогает в извлечении методов.

Переименование переменных

4:56
  • Переименование переменных переносит знания о программе в код.
  • После каждого рефакторинга проверяется состояние тестов.

Завистливая функция

5:55
  • Метод, заинтересованный в чужом классе, должен быть перенесён в этот класс.
  • Пример: метод getChars заинтересован в классе аренды.

Локальные переменные

6:00
  • Локальные переменные усложняют чтение кода и могут быть источником багов.
  • Метод встраивания переменной помогает избавиться от локальных переменных.
  • Оптимизация производительности — отдельная задача.

Разделение цикла

8:09
  • Разделение цикла на несколько маленьких циклов улучшает читаемость.
  • Оптимизация цикла требует замеров и реальной необходимости.

Замена цикла конвейером

8:49
  • Замена цикла конвейером приводит к функциональному стилю кода.
  • Позволяет избавиться от локальных переменных и сделать циклы короче.
  • Содержимое конвейеров часто трудно прочесть.

Завершение рефакторинга

9:14
  • После всех рефакторингов код становится более структурированным.
  • Для добавления новой функции вывода данных в HTML остаётся заменить текстовые

Добавление второй фичи

9:52
  • Необходимо добавить новые типы фильмов.
  • Традиционный подход: добавление нового кода цены, изменение условий в классе аренды и методе расчёта очков лояльности.
  • Проблема: дублирование кода и нарушение принципа Open-Closed.

Решение проблемы с помощью полиморфизма

10:29
  • Полиморфизм позволяет создать наследники класса «Фильм» и перегрузить метод расчёта чека.
  • Перенос метода getCheck в класс Movie.
  • Извлечение метода расчёта очков лояльности и перенос его в класс Movie.

Использование шаблона проектирования

11:35
  • Проблема с полиморфным фильмом: фильм может менять тип, но объект — нет.
  • Применение шаблона проектирования Strategy Pattern.
  • Создание класса Price с наследниками RegalPrice, ChildPrice и NewReleasePrice.

Реализация наследников Price

12:35
  • Перенос методов getCheck и getPoints в класс Price.
  • Создание наследников RegalPrice, ChildPrice и NewReleasePrice.
  • Перегрузка метода getCheck для каждого наследника.

Завершение рефакторинга

14:36
  • Метод getCheck становится абстрактным.
  • Упрощение логики метода getPoints.
  • Удаление переменной priceCode и превращение класса Price в команду из шаблона проектирования Command Pattern.

Преимущества рефакторинга

16:03
  • Рефакторинг упрощает добавление новых типов фильмов.
  • Экономия времени на добавление новых функций.
  • Способность рефактованного кода легко принимать новые фичи.

Требования к тестам

17:55
  • Полное покрытие кода тестами.
  • Тесты не должны быть хрупкими.
  • Использование заглушек для внешних слоёв приложения.

Интеграция рефакторинга в рабочий процесс

20:20
  • Рефакторинг должен проводиться непрерывно на всех этапах разработки.
  • Подход Red-Green Refactor: сначала красный тест, потом код, потом рефакторинг.
  • Правило бойскаута: оставлять код в лучшем состоянии, чем он был до вас.

Планирование рефакторинга

21:27
  • Запланированный рефакторинг должен быть редкостью.
  • Плохой код замедляет разработку, поэтому рефакторинг ускоряет доставку новых функций.
  • Правило: оставлять код в лучшем состоянии, чем он был до вас, чтобы избежать длительного рефакторинга.

Как договориться с коллегами и менеджером

21:56
  • Менеджер может не поддержать рефакторинг, так как это отвлекает от создания нового кода.
  • Коллеги могут быть против изменений в старом коде, особенно если это их код.
  • Попробуйте убедить менеджера в экономической выгоде рефакторинга.
  • Если не удаётся договориться, не рассказывайте о рефакторинге менеджеру, сосредоточьтесь на готовности фичей.
  • Помните, что вы профессионал и лучше знаете, как выполнять свою работу.

Последствия разногласий в команде

21:56
  • Глубокие разногласия могут привести к уходу части команды или к смене руководства.
  • Важно сохранять профессионализм и готовность к изменениям.

Заключение

22:55
  • Подведение итогов по рефакторингу.
  • Пожелания удачи и прощание.