3. Определение
Рефакторинг – изменения во внутренней структуре
программного обеспечения, имеющее целью облегчить
понимание его работы и упростить модификацию, не
затрагивая наблюдаемого поведения.
Производить рефакторинг – изменять структуру
программного обеспечения, применяя ряж
рефакторингов, не затрагивая его поведения.
4. Важные моменты в определении
• Цель – упростить понимание и модификацию
программного обеспечения
Пример: оптимизация кода не является рефакторингом
• Внешнее поведение не меняется
• Рефакторинг не равно переписыванию
– Рефакторинг – эволюционный путь
– Переписывание – революционный путь
5. Top-4 причин для выполнения
рефакторинга
1.
2.
3.
4.
Улучшение композиции ПО
Улучшает понимание ПО
Найти ошибки
Ускорение разработки ПО
6. Ситуации, когда стоит применять
рефакторинг
•
•
•
•
•
•
Правило трех ударов
Добавление новой функции
Исправление ошибки
Разбор кода
Разработка по TDD (более подробно далее)
Код, требующий рефакторинга
8. Признаки кода, требующего
рефакторинга
• Дублирование кода
• Длинный метод
• Большой класс
• Длинный список параметров
• Расходящиеся модификации
• Стрельба дробью
• Завистливые функции
• Группы данных
• Одержимость элементарными типами
Ex 04.029.01-2011
12. Выделение метода
Есть фрагмент кода, который выполняет определенное
действие.
Выделить этот фрагмент в метод, название которого
объясняет смысл действия.
Категория: основной
13. Объяснения
• Выделять методы нужно, если исходный метод слишком
длинный
• Выделение метода позволяет повторно использовать этот
фрагмент
• Повышается читабельность кода – имена методов
поясняют смысл действий
14. Техника
• Создать метод с названием, соответствующим назначению
метода
• Написать набор тестов для данного метода (если метод не
закрытый)
• Скопировать код подлежащий выделению из исходного
метода в созданный
• Найти в извлеченным коде все переменные, имеющие
локальную область видимости – это будут локальные
переменные и параметры метода
• Найти все временные переменные в выделенном коде –
объявить как временные переменные в новом методе
15. • Модифицирует ли код какие-то из временных
переменных, если да, то выделить фрагменты по
изменению значения временной переменной на вызовы
новых методов
– Расщепление временной переменной
– Замена временной переменной вызовом метода
• Передавать в качестве параметров переменные с
локальной областью видимости, чтение которых
осуществляется в выделенном коде
• Компиляция; тестирование выделенного метода
• Замена выделенного фрагмента на вызов метода
• Компиляция и тестирование
17. Встраивание метода
Тело метода столь же понятно, что и его название
Заменить вызов метода на тело самого метода
Категория: промежуточный
18. Объяснения
• очень короткие методы, например, в одну строчку
Пример: метод, вызывающий другой метод
Часто получаются в процессе рефакторинга
• Структура методов неудачная. Тогда встраиванием
методов позволяет получить один большой метод, из
которого выделением метода получаем другую структуру
19. Техника
•
•
•
•
•
Убедиться, что метод не является полиморфным
Найти все вызовы метода
Заменить каждый вызов телом метода
Выполнить компиляцию и тестирование
Удалить метод
20. Встраивание временной
переменной
Имеется временная переменная, которой выражение
присваивается один раз, и эта переменная мешает
проведению других рефакторингов.
Заменить переменную на выражение, значение которого
присваивалось этой переменной.
Категория: промежуточный
21. Техника
• Добавить к объявлению переменной ключевое слово
const
• Найти все ссылки на переменную и заменить ее правой
частью присваивания
• Выполнять компиляцию и тестирование после каждой
модификации
• Удалить объявление и присваивание данной переменной
• Выполнить компиляцию и тестирование
23. Замена переменной вызовом
метода
Временная переменная используется для хранения значения
выражения.
Преобразовать выражение в метод. Заменить все ссылки на
переменную вызовом метода. Новый метод может быть
повторно использован в других методах.
Категория: основной
24. Объяснения
• Временные переменные ведут к увеличению размеров
кода, многократному повторению одних и тех же строчек.
Вычисление значения в методе существенно увеличивает
степень повторной используемости
• Часто является необходимым шагом для выделения
метода
• Если переменной значение присваивается неоднократно,
то можно воспользоваться методами рефакторинга
Расщепление временной переменной и Разделение
запроса и модификатора
25. Техника
• Найти переменную, которой присваивание выполняется
один раз
• Добавить к объявлению переменной ключевое слово
const
• Скомпилировать код
• Выделить из правой части присваивания метод
• Выделенный метод должен не менять значения других
полей и объектов
• Написать тесты для выделенного метода
• Компиляция и тестирование
• Выполнить встраивание временной переменной
27. Введение поясняющей переменной
Имеется сложное выражение. Поместить результат
вычисления данного выражения во временную переменную
с говорящим именем.
Категория: промежуточный
29. Техника
• Объявить локальную переменную с ключевым словом
const, проинициализировать ее частью сложного
выражения
• Заменить вхождения этого выражения на обращение к
данной переменной
• Компиляция и тестирование
• Повторить эту процедуру для других частей сложного
выражения