29
УК 03.009.01-2011 Учебный курс. Обучение. Рефакторинг .

ук 03.009.01 2011

Embed Size (px)

Citation preview

Page 1: ук 03.009.01 2011

УК 03.009.01-2011 Учебный курс. Обучение.

Рефакторинг.

Page 2: ук 03.009.01 2011

Литература

• КН 02.026-2003

Page 3: ук 03.009.01 2011

Определение

Рефакторинг – изменения во внутренней структуре программного обеспечения, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения.

Производить рефакторинг – изменять структуру программного обеспечения, применяя ряж рефакторингов, не затрагивая его поведения.

Page 4: ук 03.009.01 2011

Важные моменты в определении

• Цель – упростить понимание и модификацию программного обеспечения

Пример: оптимизация кода не является рефакторингом

• Внешнее поведение не меняется

• Рефакторинг не равно переписыванию – Рефакторинг – эволюционный путь

– Переписывание – революционный путь

Page 5: ук 03.009.01 2011

Top-4 причин для выполнения рефакторинга

1. Улучшение композиции ПО

2. Улучшает понимание ПО

3. Найти ошибки

4. Ускорение разработки ПО

Page 6: ук 03.009.01 2011

Ситуации, когда стоит применять рефакторинг

• Правило трех ударов

• Добавление новой функции

• Исправление ошибки

• Разбор кода

• Разработка по TDD (более подробно далее)

• Код, требующий рефакторинга

Page 7: ук 03.009.01 2011

Разработка по TDD

1. Написание тестов

2. Код, удовлетворяющий одному тесту

3. Рефакторинг

4. Переход на шаг 1.

Page 8: ук 03.009.01 2011

Признаки кода, требующего рефакторинга

• Дублирование кода

• Длинный метод

• Большой класс

• Длинный список параметров

• Расходящиеся модификации

• Стрельба дробью

• Завистливые функции

• Группы данных

• Одержимость элементарными типами

Ex 04.029.01-2011

Page 9: ук 03.009.01 2011

• Параллельные иерархии наследования

• Ленивый класс

• Теоретическая общность

• Временное поле

• Цепочки сообщений

• Посредник

• Неуместная близость

• Альтернативные классы с разными интерфейсами

• Неполнота библиотечного класса

• Классы данных

Page 10: ук 03.009.01 2011

• Отказ от наследства

• Комментарии

Page 11: ук 03.009.01 2011

Методы рефакторинга

Page 12: ук 03.009.01 2011

Выделение метода

Есть фрагмент кода, который выполняет определенное действие.

Выделить этот фрагмент в метод, название которого объясняет смысл действия.

Категория: основной

Page 13: ук 03.009.01 2011

Объяснения

• Выделять методы нужно, если исходный метод слишком длинный

• Выделение метода позволяет повторно использовать этот фрагмент

• Повышается читабельность кода – имена методов поясняют смысл действий

Page 14: ук 03.009.01 2011

Техника

• Создать метод с названием, соответствующим назначению метода

• Написать набор тестов для данного метода (если метод не закрытый)

• Скопировать код подлежащий выделению из исходного метода в созданный

• Найти в извлеченным коде все переменные, имеющие локальную область видимости – это будут локальные переменные и параметры метода

• Найти все временные переменные в выделенном коде – объявить как временные переменные в новом методе

Page 15: ук 03.009.01 2011

• Модифицирует ли код какие-то из временных переменных, если да, то выделить фрагменты по изменению значения временной переменной на вызовы новых методов – Расщепление временной переменной

– Замена временной переменной вызовом метода

• Передавать в качестве параметров переменные с локальной областью видимости, чтение которых осуществляется в выделенном коде

• Компиляция; тестирование выделенного метода

• Замена выделенного фрагмента на вызов метода

• Компиляция и тестирование

Page 16: ук 03.009.01 2011

Примеры

• Ex 04.031.01-2011

Page 17: ук 03.009.01 2011

Встраивание метода

Тело метода столь же понятно, что и его название

Заменить вызов метода на тело самого метода

Категория: промежуточный

Page 18: ук 03.009.01 2011

Объяснения

• очень короткие методы, например, в одну строчку

Пример: метод, вызывающий другой метод

Часто получаются в процессе рефакторинга

• Структура методов неудачная. Тогда встраиванием методов позволяет получить один большой метод, из которого выделением метода получаем другую структуру

Page 19: ук 03.009.01 2011

Техника

• Убедиться, что метод не является полиморфным

• Найти все вызовы метода

• Заменить каждый вызов телом метода

• Выполнить компиляцию и тестирование

• Удалить метод

Page 20: ук 03.009.01 2011

Встраивание временной переменной

Имеется временная переменная, которой выражение присваивается один раз, и эта переменная мешает проведению других рефакторингов.

Заменить переменную на выражение, значение которого присваивалось этой переменной.

Категория: промежуточный

Page 21: ук 03.009.01 2011

Техника

• Добавить к объявлению переменной ключевое слово const

• Найти все ссылки на переменную и заменить ее правой частью присваивания

• Выполнять компиляцию и тестирование после каждой модификации

• Удалить объявление и присваивание данной переменной

• Выполнить компиляцию и тестирование

Page 22: ук 03.009.01 2011

Пример

• Ex 04.034.01-2011

Page 23: ук 03.009.01 2011

Замена переменной вызовом метода

Временная переменная используется для хранения значения выражения.

Преобразовать выражение в метод. Заменить все ссылки на переменную вызовом метода. Новый метод может быть повторно использован в других методах.

Категория: основной

Page 24: ук 03.009.01 2011

Объяснения

• Временные переменные ведут к увеличению размеров кода, многократному повторению одних и тех же строчек. Вычисление значения в методе существенно увеличивает степень повторной используемости

• Часто является необходимым шагом для выделения метода

• Если переменной значение присваивается неоднократно, то можно воспользоваться методами рефакторинга Расщепление временной переменной и Разделение запроса и модификатора

Page 25: ук 03.009.01 2011

Техника

• Найти переменную, которой присваивание выполняется один раз

• Добавить к объявлению переменной ключевое слово const

• Скомпилировать код

• Выделить из правой части присваивания метод

• Выделенный метод должен не менять значения других полей и объектов

• Написать тесты для выделенного метода

• Компиляция и тестирование

• Выполнить встраивание временной переменной

Page 26: ук 03.009.01 2011

Пример

• Ex 04.033.01-2011

Page 27: ук 03.009.01 2011

Введение поясняющей переменной

Имеется сложное выражение. Поместить результат вычисления данного выражения во временную переменную с говорящим именем.

Категория: промежуточный

Page 28: ук 03.009.01 2011

Объяснения

• Упрощает понимание сложных выражений

• Часто является промежуточным, перед Заменой переменной вызовом метода

Page 29: ук 03.009.01 2011

Техника

• Объявить локальную переменную с ключевым словом const, проинициализировать ее частью сложного выражения

• Заменить вхождения этого выражения на обращение к данной переменной

• Компиляция и тестирование

• Повторить эту процедуру для других частей сложного выражения