Введение в рефакторинг 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 Глубокие разногласия могут привести к уходу части команды или к смене руководства. Важно сохранять профессионализм и готовность к изменениям.