Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
УК 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, проинициализировать ее частью сложного
выражения
• Заменить вхождения этого выражения на обращение к
данной переменной
• Компиляция и тестирование
• Повторить эту процедуру для других частей сложного
выражения

More Related Content

ук 03.009.01 2011

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