Рефакторинг
Разумные причины для выполнения рефакторинга
Код повторяется
Метод слишком велик
Цикл слишком велик или слишком глубоко вложен в другие циклы
Класс имеет плохую связность
Интерфейс класса не формирует согласованную абстракцию
Метод принимает слишком много параметров
Отдельные части класса изменяются независимо от других частей
При изменении программы требуется параллельно изменять несколько классов
Родственные элементы данных, используемые вместе, не организованы в классы или структуры
Метод использует больше элементов другого класса, чем своего собственного
Поле в классе используется другим классом чаще, чем своим собственным
Объект-посредник ничего не делает
Подкласс использует только малую долю методов своих предков
Перед вызовом метода выполняется подготовительный код (после вызова метода выполняется код "уборки")
Программа содержит код, который может когда-нибудь понадобиться
Класс имеет больше одной ответственности. Полезно задать себе вопрос о том, что будет, если удалить часть данных или метод. Какие другие данные или методы при этом потеряют смысл?
Если у каждого подкласса на определённом уровне имена начинаются с одних и тех же прилагательных, то, вероятно, стоит разбить одну иерархию на две.
Некоторые запахи
Расходящиеся изменения. Если глядя на класс, вы замечаете про себя, что вот эти три метода придётся изменять для каждой новой базы данных, а вот эти четыре метода - при каждом появлении нового финансового требования, то это может означать, что вместо одного класса лучше иметь два.
"Стрельба дробью". В этой ситуации следует свести все изменения в один класс, использовав рефакторинги "Перенос метода" и "Перенос поля". Если подходящего кандидата среди имеющихся классов нет, создайте новый класс. Часто можно применить рефакторинг "Встраивание класса" и поместить целый пакет методов в один класс.
Завистливые функции. Если вы столкнулись с методом, вызывающим с полдюжины методов доступа к данным другого объекта, чтобы вычислить некоторое значение, то метод следует перенести в другое место с помощью рефакторинга "Перенос метода". Иногда завистью страдает только часть метода; в таком случае сначала примените к этой части рефакторинг "Извлечение метода", а уже затем рефакторинг "Перенос метода".
Группы данных. Данные, встречающиеся совместно, имеет смысл превращать в отдельный класс или структуру (например, StartDate и EndDate). Хорошая проверка заключается в том, чтобы удалить одно из значений данных и посмотреть, сохранят ли при этом смысл остальные данные. Если нет, то это верный признак того, что данные лучше объединить в один объект.
Временное поле. Если какое-то поле корректно только во время работы алгоритма; в других контекстах оно лишь вводит в заблуждение. В таком случае можно применить рефакторинг "Извлечение класса" к переменным и методам, в которых требуется это поле. Новый объект является объектом метода.
Рефакторинг на уровне данных
Встраивание выражения в код
Замена выражения на вызов метода
Введение промежуточной переменной
Использование локальной переменной вместо параметра
Преобразование кода в класс
Преобразование массива в класс
Рефакторинг на уровне отдельных операторов
Декомпозиция логического выражения путём ввода переменных с понятным именем
Вынесение сложного логического выражения в грамотно названную булеву функцию
Возврат из метода сразу после получения ответа вместо установки возвращаемого значения внутри вложенных операторов if-else
Рефакторинг на уровне отдельных методов
Извлечение метода из другого метода
Встраивание кода метода
Преобразование объёмного метода в класс
Отделение операций запроса данных от операций изменения данных
Разделение метода, поведение которого зависит от полученных параметров
Рефакторинг интерфейсов классов
Перемещение метода в другой класс
Разделение одного класса на несколько
Сокрытие делегата (или, наоборот, удаление посредника)
Замена наследования на композицию (или, наоборот, замена композиции на наследование)
Объединение суперкласса и подкласса, имеющих очень похожую реализацию
Last updated