- •Лабораторная работа №6 Рефакторинг программного кода
- •Ход выполнения работы
- •Длинный Метод
- •Большой класс
- •Длинный список параметров
- •Расходящееся изменение
- •Хирургия дробовиком
- •Зависть по функции
- •Группы данных
- •Одержимость примитивами
- •Оператор Switch (Case)
- •Параллельные иерархии наследования
- •Ленивый класс
- •Спекулятивное обобщение
- •Временное поле
- •Цепочка сообщений
- •Посредник
- •Неоправданная близость
- •Альтернативные классы с разными интерфейсами
- •Неполный библиотечный класс
- •Класс для данных
- •Отвергнутое наследство
- •Комментарии
- •Классификация шаблонов рефакторинга
- •Примеры шаблонов рефакторинга
Длинный список параметров
Это пережиток процедурного программирования. В объектном мире всегда найдется объект, которому можно задать вопрос и получить все нужные ответы.
Используйте Replace Parameter with Method, Preserve Whole Object и Introduce Parameter Object.
Расходящееся изменение
Расходящееся изменение - это когда один класс подвержен различным изменениям.
Мы структурируем наше ПО, чтобы было легче его изменять. Если мы хотим что-то изменить, мы ищем единственное место, где мы можем сделать изменение. Если мы не можем этого сделать - мы ощущаем плохой запах. Вы можете смотреть на класс и думать: "вот эти три метода я меняю каждый раз когда подключаю новую БД, а эти четыре - при добавлении финансового инструмента". Для того, чтобы привести это в порядок, находите все, что меняется в данном частном случае и используйте Extract Class.
Хирургия дробовиком
Это похоже на расходящееся изменение, только наоборот. Каждый раз, когда вам надо сделать подобное изменение, вы делаете кучу мелких изменений в различных классах. Это часто приводит к ошибкам.
Используйте Move Method и Move Field для того чтобы вынести все изменения в один класс. Если никакой класс не выглядит хорошим кандидатом, создайте новый класс.
Используйте Inline Class, если необходимо. Расходящееся изменение - это когда один класс подвержен различным изменениям, тогда как хирургия дробовиком - это когда одно изменение затрагивает несколько классов.
Зависть по функции
Цель наличия объектов в программе - объединить данные и методы, их использующие. Типичный дурной запах - когда метод выглядит более заинтересованным в данных другого объекта, нежели своих.
Просто используйте Move Method, чтобы перенести его туда, где он должен быть. Если только часть метода страдает завистью, используйте сначала Extract Method.
В случае, когда метод использует данные от нескольких объектов, поместите его к объекту, в котором он заинтересован больше всего. Используйте Extract Method для изоляции зависимостей.
Использование некоторых сложных шаблонов, таких как Strategy и Visitor, нарушает эти правила. Общая рекомендация - всегда соблюдать баланс между сложностью и необходимой гибкостью.
Группы данных
Если вы видите, что элементы данных всегда путешествуют вместе, объедините их в один объект. Используйте Extract Class для полей, Preserve Whole Object и Introduce Parameter Object для параметров методов.
Хороший метод проверки: если вы удалите один из элементов данных, будут ли остальные иметь смысл? Если да, то здесь должен быть рожден объект.
Одержимость примитивами
Начинающие объектные программисты обычно избегают использовать маленькие объекты для маленьких задач, таких как валюта, диапазоны, специальные строки для телефонных номеров и т.п. Вы можете выйти из пещер в цивилизованный мир объектов с помощью Replace Data Value with Object, Replace Array with Object, если это код типа, то используйте Replace Type Code with Class, Replace Type Code with Sublasses и Replace Type Code with Strategy.
