- Рефакторинг - исправление кода без изменения его внешнего поведения
Когда проводим рефакторинг:
- Когда код написан и он без ошибок
- Когда написаны тесты и они проходят
- Когда нужно сохранить знания о предметной области
- Когда программных компонент часто требует изменений
Когда не проводим:
- Без тестов или со сломанными тестами
- Когад нужно разработать новую функциональность
- Когда нужно изменить поведение уже имеющейся функциональности
- Когда лучше переписать с нуля
Цели:
- Улучшение характеристик кода
- понимаемость человеком
- удовлетворение новых конвенций
- изменяемость (скорость внесения изменений)
- гибкость (возможность интегрировать или перекомпоновать внутри)
- использование новых возможностей языка
- Улучшение характеристик исполнения
- скорость работы алгоритмов
- потребление памяти
- уход от блокирующих операций
Важные аспекты:
- Определяем границы программного компонента для рефакторинга
- Сначала изучаем код и находим все типовые места, которые хотим менять
- Меняем небольшими шагами
- Не откладываем на потом
Техники:
- Переименование
- Избавление от дублирующих фрагментов
- Разделение функций и методов на несколько
- Объединение функций и методов
- Выделение переменных из выражений
- Удаление переменных и объединение выражений
- Разделение классов на несколько
- Объединение классов в один
- Замена внутренних структур данных
- Замена внутренних алгоритмов
- Бросить исключение вместо возврата ошибки
- Вернуть ошибку вместо исключения
- Перемещение кода в иерархии наследования вверх и вниз
- Замена наследования делегированием
- Замена делегирования наследованием