ук 03.009.01 2011
TRANSCRIPT
![Page 1: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/1.jpg)
УК 03.009.01-2011 Учебный курс. Обучение.
Рефакторинг.
![Page 2: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/2.jpg)
Литература
• КН 02.026-2003
![Page 3: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/3.jpg)
Определение
Рефакторинг – изменения во внутренней структуре программного обеспечения, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения.
Производить рефакторинг – изменять структуру программного обеспечения, применяя ряж рефакторингов, не затрагивая его поведения.
![Page 4: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/4.jpg)
Важные моменты в определении
• Цель – упростить понимание и модификацию программного обеспечения
Пример: оптимизация кода не является рефакторингом
• Внешнее поведение не меняется
• Рефакторинг не равно переписыванию – Рефакторинг – эволюционный путь
– Переписывание – революционный путь
![Page 5: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/5.jpg)
Top-4 причин для выполнения рефакторинга
1. Улучшение композиции ПО
2. Улучшает понимание ПО
3. Найти ошибки
4. Ускорение разработки ПО
![Page 6: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/6.jpg)
Ситуации, когда стоит применять рефакторинг
• Правило трех ударов
• Добавление новой функции
• Исправление ошибки
• Разбор кода
• Разработка по TDD (более подробно далее)
• Код, требующий рефакторинга
![Page 7: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/7.jpg)
Разработка по TDD
1. Написание тестов
2. Код, удовлетворяющий одному тесту
3. Рефакторинг
4. Переход на шаг 1.
![Page 8: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/8.jpg)
Признаки кода, требующего рефакторинга
• Дублирование кода
• Длинный метод
• Большой класс
• Длинный список параметров
• Расходящиеся модификации
• Стрельба дробью
• Завистливые функции
• Группы данных
• Одержимость элементарными типами
Ex 04.029.01-2011
![Page 9: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/9.jpg)
• Параллельные иерархии наследования
• Ленивый класс
• Теоретическая общность
• Временное поле
• Цепочки сообщений
• Посредник
• Неуместная близость
• Альтернативные классы с разными интерфейсами
• Неполнота библиотечного класса
• Классы данных
![Page 10: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/10.jpg)
• Отказ от наследства
• Комментарии
![Page 11: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/11.jpg)
Методы рефакторинга
![Page 12: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/12.jpg)
Выделение метода
Есть фрагмент кода, который выполняет определенное действие.
Выделить этот фрагмент в метод, название которого объясняет смысл действия.
Категория: основной
![Page 13: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/13.jpg)
Объяснения
• Выделять методы нужно, если исходный метод слишком длинный
• Выделение метода позволяет повторно использовать этот фрагмент
• Повышается читабельность кода – имена методов поясняют смысл действий
![Page 14: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/14.jpg)
Техника
• Создать метод с названием, соответствующим назначению метода
• Написать набор тестов для данного метода (если метод не закрытый)
• Скопировать код подлежащий выделению из исходного метода в созданный
• Найти в извлеченным коде все переменные, имеющие локальную область видимости – это будут локальные переменные и параметры метода
• Найти все временные переменные в выделенном коде – объявить как временные переменные в новом методе
![Page 15: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/15.jpg)
• Модифицирует ли код какие-то из временных переменных, если да, то выделить фрагменты по изменению значения временной переменной на вызовы новых методов – Расщепление временной переменной
– Замена временной переменной вызовом метода
• Передавать в качестве параметров переменные с локальной областью видимости, чтение которых осуществляется в выделенном коде
• Компиляция; тестирование выделенного метода
• Замена выделенного фрагмента на вызов метода
• Компиляция и тестирование
![Page 16: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/16.jpg)
Примеры
• Ex 04.031.01-2011
![Page 17: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/17.jpg)
Встраивание метода
Тело метода столь же понятно, что и его название
Заменить вызов метода на тело самого метода
Категория: промежуточный
![Page 18: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/18.jpg)
Объяснения
• очень короткие методы, например, в одну строчку
Пример: метод, вызывающий другой метод
Часто получаются в процессе рефакторинга
• Структура методов неудачная. Тогда встраиванием методов позволяет получить один большой метод, из которого выделением метода получаем другую структуру
![Page 19: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/19.jpg)
Техника
• Убедиться, что метод не является полиморфным
• Найти все вызовы метода
• Заменить каждый вызов телом метода
• Выполнить компиляцию и тестирование
• Удалить метод
![Page 20: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/20.jpg)
Встраивание временной переменной
Имеется временная переменная, которой выражение присваивается один раз, и эта переменная мешает проведению других рефакторингов.
Заменить переменную на выражение, значение которого присваивалось этой переменной.
Категория: промежуточный
![Page 21: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/21.jpg)
Техника
• Добавить к объявлению переменной ключевое слово const
• Найти все ссылки на переменную и заменить ее правой частью присваивания
• Выполнять компиляцию и тестирование после каждой модификации
• Удалить объявление и присваивание данной переменной
• Выполнить компиляцию и тестирование
![Page 22: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/22.jpg)
Пример
• Ex 04.034.01-2011
![Page 23: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/23.jpg)
Замена переменной вызовом метода
Временная переменная используется для хранения значения выражения.
Преобразовать выражение в метод. Заменить все ссылки на переменную вызовом метода. Новый метод может быть повторно использован в других методах.
Категория: основной
![Page 24: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/24.jpg)
Объяснения
• Временные переменные ведут к увеличению размеров кода, многократному повторению одних и тех же строчек. Вычисление значения в методе существенно увеличивает степень повторной используемости
• Часто является необходимым шагом для выделения метода
• Если переменной значение присваивается неоднократно, то можно воспользоваться методами рефакторинга Расщепление временной переменной и Разделение запроса и модификатора
![Page 25: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/25.jpg)
Техника
• Найти переменную, которой присваивание выполняется один раз
• Добавить к объявлению переменной ключевое слово const
• Скомпилировать код
• Выделить из правой части присваивания метод
• Выделенный метод должен не менять значения других полей и объектов
• Написать тесты для выделенного метода
• Компиляция и тестирование
• Выполнить встраивание временной переменной
![Page 26: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/26.jpg)
Пример
• Ex 04.033.01-2011
![Page 27: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/27.jpg)
Введение поясняющей переменной
Имеется сложное выражение. Поместить результат вычисления данного выражения во временную переменную с говорящим именем.
Категория: промежуточный
![Page 28: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/28.jpg)
Объяснения
• Упрощает понимание сложных выражений
• Часто является промежуточным, перед Заменой переменной вызовом метода
![Page 29: ук 03.009.01 2011](https://reader033.vdocuments.site/reader033/viewer/2022052905/55878bbfd8b42a3c318b4752/html5/thumbnails/29.jpg)
Техника
• Объявить локальную переменную с ключевым словом const, проинициализировать ее частью сложного выражения
• Заменить вхождения этого выражения на обращение к данной переменной
• Компиляция и тестирование
• Повторить эту процедуру для других частей сложного выражения