Upload
etyumentcev
View
168
Download
2
Embed Size (px)
Citation preview
УК 03.009.01-2011 Учебный курс. Обучение.
Рефакторинг.
Литература
• КН 02.026-2003
Определение
Рефакторинг – изменения во внутренней структуре программного обеспечения, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения.
Производить рефакторинг – изменять структуру программного обеспечения, применяя ряж рефакторингов, не затрагивая его поведения.
Важные моменты в определении
• Цель – упростить понимание и модификацию программного обеспечения
Пример: оптимизация кода не является рефакторингом
• Внешнее поведение не меняется
• Рефакторинг не равно переписыванию – Рефакторинг – эволюционный путь
– Переписывание – революционный путь
Top-4 причин для выполнения рефакторинга
1. Улучшение композиции ПО
2. Улучшает понимание ПО
3. Найти ошибки
4. Ускорение разработки ПО
Ситуации, когда стоит применять рефакторинг
• Правило трех ударов
• Добавление новой функции
• Исправление ошибки
• Разбор кода
• Разработка по TDD (более подробно далее)
• Код, требующий рефакторинга
Разработка по TDD
1. Написание тестов
2. Код, удовлетворяющий одному тесту
3. Рефакторинг
4. Переход на шаг 1.
Признаки кода, требующего рефакторинга
• Дублирование кода
• Длинный метод
• Большой класс
• Длинный список параметров
• Расходящиеся модификации
• Стрельба дробью
• Завистливые функции
• Группы данных
• Одержимость элементарными типами
Ex 04.029.01-2011
• Параллельные иерархии наследования
• Ленивый класс
• Теоретическая общность
• Временное поле
• Цепочки сообщений
• Посредник
• Неуместная близость
• Альтернативные классы с разными интерфейсами
• Неполнота библиотечного класса
• Классы данных
• Отказ от наследства
• Комментарии
Методы рефакторинга
Выделение метода
Есть фрагмент кода, который выполняет определенное действие.
Выделить этот фрагмент в метод, название которого объясняет смысл действия.
Категория: основной
Объяснения
• Выделять методы нужно, если исходный метод слишком длинный
• Выделение метода позволяет повторно использовать этот фрагмент
• Повышается читабельность кода – имена методов поясняют смысл действий
Техника
• Создать метод с названием, соответствующим назначению метода
• Написать набор тестов для данного метода (если метод не закрытый)
• Скопировать код подлежащий выделению из исходного метода в созданный
• Найти в извлеченным коде все переменные, имеющие локальную область видимости – это будут локальные переменные и параметры метода
• Найти все временные переменные в выделенном коде – объявить как временные переменные в новом методе
• Модифицирует ли код какие-то из временных переменных, если да, то выделить фрагменты по изменению значения временной переменной на вызовы новых методов – Расщепление временной переменной
– Замена временной переменной вызовом метода
• Передавать в качестве параметров переменные с локальной областью видимости, чтение которых осуществляется в выделенном коде
• Компиляция; тестирование выделенного метода
• Замена выделенного фрагмента на вызов метода
• Компиляция и тестирование
Примеры
• Ex 04.031.01-2011
Встраивание метода
Тело метода столь же понятно, что и его название
Заменить вызов метода на тело самого метода
Категория: промежуточный
Объяснения
• очень короткие методы, например, в одну строчку
Пример: метод, вызывающий другой метод
Часто получаются в процессе рефакторинга
• Структура методов неудачная. Тогда встраиванием методов позволяет получить один большой метод, из которого выделением метода получаем другую структуру
Техника
• Убедиться, что метод не является полиморфным
• Найти все вызовы метода
• Заменить каждый вызов телом метода
• Выполнить компиляцию и тестирование
• Удалить метод
Встраивание временной переменной
Имеется временная переменная, которой выражение присваивается один раз, и эта переменная мешает проведению других рефакторингов.
Заменить переменную на выражение, значение которого присваивалось этой переменной.
Категория: промежуточный
Техника
• Добавить к объявлению переменной ключевое слово const
• Найти все ссылки на переменную и заменить ее правой частью присваивания
• Выполнять компиляцию и тестирование после каждой модификации
• Удалить объявление и присваивание данной переменной
• Выполнить компиляцию и тестирование
Пример
• Ex 04.034.01-2011
Замена переменной вызовом метода
Временная переменная используется для хранения значения выражения.
Преобразовать выражение в метод. Заменить все ссылки на переменную вызовом метода. Новый метод может быть повторно использован в других методах.
Категория: основной
Объяснения
• Временные переменные ведут к увеличению размеров кода, многократному повторению одних и тех же строчек. Вычисление значения в методе существенно увеличивает степень повторной используемости
• Часто является необходимым шагом для выделения метода
• Если переменной значение присваивается неоднократно, то можно воспользоваться методами рефакторинга Расщепление временной переменной и Разделение запроса и модификатора
Техника
• Найти переменную, которой присваивание выполняется один раз
• Добавить к объявлению переменной ключевое слово const
• Скомпилировать код
• Выделить из правой части присваивания метод
• Выделенный метод должен не менять значения других полей и объектов
• Написать тесты для выделенного метода
• Компиляция и тестирование
• Выполнить встраивание временной переменной
Пример
• Ex 04.033.01-2011
Введение поясняющей переменной
Имеется сложное выражение. Поместить результат вычисления данного выражения во временную переменную с говорящим именем.
Категория: промежуточный
Объяснения
• Упрощает понимание сложных выражений
• Часто является промежуточным, перед Заменой переменной вызовом метода
Техника
• Объявить локальную переменную с ключевым словом const, проинициализировать ее частью сложного выражения
• Заменить вхождения этого выражения на обращение к данной переменной
• Компиляция и тестирование
• Повторить эту процедуру для других частей сложного выражения