КРАТКИЙ КОНСПЕКТ книги
"Рефакторинг" Мартин Фаулер

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

    Рефакторинг:
  • улучшает композицию ПО
  • облегчает понимание ПО
  • помогает быстрее находить ошибки
  • позволяет быстрее писать программы

    Применяйте рефакторинг:
  • при добавлении новой функции. После рефакторинга архитектура ПО станет более гибкой и логичной, поэтому добавление новой функции не составит труда.
  • если требуется исправить ошибку. После рефакторинга код станет более понятным и найти в нем ошибку станет легче.

Признаки кода «с душком», который нуждается в рефакторинге

  • дублирование кода
  • длинные методы
  • большие классы
  • длинный список параметров, передаваемых методу
  • расходящиеся модификации — если для 1 модификации ПО изменения приходится вносить более чем в 1 методе
  • «стрельба дробью» - если для 1 модификации ПО нужно внести множество мелких изменений во множестве классов
  • завистливые функции — если функция использует множество данных и методов другого класса, то скорее всего ее стоит переместить в этот класс
  • группы данных — связки данных, встречающиеся совместно надо превращать в самостоятельный класс
  • операторы типа switch лучше заменить полиморфизмом
  • ленивый класс — класс, существование которого не окупается выполняемыми им функциями, должен быть ликвидирован
  • временное поле — поле класса, используемое только одним методом, лучше удалить, что код стал более понятным
  • цепочка сообщений — многократные вложенные вызовы лучше заменить прямым вызовом метода без посредников
  • посредник — иногда наличие посредника не оправдано
  • неуместная близость — если классы часто погружены в закрытые части друг друга их следует разъединять
  • альтернативные классы с разными интерфейсами
  • комментарии

Рефакторинг позволяет изменять код, не меняя его поведения. Гарантиями того, что поведение осталось прежним являются unit-тесты.

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

Для каждого описанного ниже метода в книге даны пошаговые инструкции на примерах. Переписывать их бессмысленно. Обязательно прочтите книгу.

Некоторые методы рефакторинга:

Выделение метода: преобразуйте фрагмент кода в метод, название которого объясняет его назначение

Встраивание метода: если тело метода столь же понятно, как и его название, поместите тело метода в код, который его вызывает и удалите метод

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

Замена метода объектом методов: есть длинные метод, локальные переменные которого используются таким образом, что не возможно применить «Выделение метода». Преобразуйте метод в отдельный объект. Локальные переменные сделайте полями этого объекта. После этого можно разложить данный метод на несколько методов того же объекта

Перемещение метода: если метод чаще использует функции другого класса, а не того,в котором он находится, то создайте аналогичный метод в том классе, который чаще всего им используется. Замените тело прошлого метода простым делегированием или удалите его вообще

Перемещение поля: если поле используется чаще другим классом, чем тем в котором оно определено, то стоит создать поле в целевом классе и отредактировать всех его пользователей

Выделение класса: если класс имеет более одной ответственности его нужно разделить. Создайте новый класс и переместите в него соответствующие поля и методы

Встраивание класса: если класс выполняет слишком мало функций, перемести все функции в другой класс и удалите исходный

Сокрытие делегирования: если клиент обращается к делегируемому классу объекта, то следует создать методы, скрывающие делегирование

Удаление посредника: класс слишком занят простым делегированием, тогда заставьте клиента обращается к делегату непосредственно

Само-инкапсуляция поля: если обращения к полю класса осуществляется напрямую, взаимодействие с ним становится сложнее. Создайте методы для получения и установления значений поля и обращайтесь к полю только через них

Замена значения данных объектом: если данные нуждаются в дополнительных данных или поведении, следует преобразовать элементы данных в объект

Замена массива объектом: если элементы массива относятся к разным сущностям, замените массив объектом, в котором есть поле для каждого элемента

Замена магического числа символической константой: замените магические числа использованием константы, имя которой раскрывает суть магического числа

Замена подкласса полями: если подклассы различаются только методами, возвращающими данные константы, то их можно заменить полями в родительском классе

Декомпозиция условного оператора: замените сложные условия в конструкциях if на вызовы методов

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

Замена вложенных условных операторов граничным оператором: если из-за вложенности условных операторов становится не ясным нормальный путь выполнения, используйте граничные условия для всех особых случаев

Замена условного оператора полиморфизмом: если есть условный оператор, поведение которого зависит от типа объекта, вынесите каждую ветвь условного оператора в переопределяемый метод подкласса. Сделайте исходный метод абстрактным

Введение объекта null: чтобы убрать многократные проверки на совпадение значения с null, замените значение null объектом null

Переименование метода: переименуйте метод, если его название не раскрывает его назначения

Разделение запроса и модификатора: метод должен иметь только одну ответственность. Поэтому, если он возвращает значение, но кроме того изменяет состояние объекта, его нужно разделить на два отдельных метода — один для запроса, один для модификации

Параметризация метода: несколько методов выполняют похожие действия, но с разными значениями. Объедините методы в один, используя параметр для задания значений

Сохранение всего объекта: если код получает от объекта несколько значений, а затем передает их в качестве параметра при вызове метода, лучше всего вместо этого передавать весь объект

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

Впечатления о книге

Это одна из тех книг, которые всегда должны быть под рукой. Книга хорошо структурирована и ей удобно пользоваться в качестве справочника, а обилие примеров упрощает понимание материала книги.

Копирование материалов разрешено при наличии активной ссылки на источник
Яндекс.Метрика