Рефакторинг — изменения во внутренней структуре программного обеспечения, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения.
Рефакторинг позволяет изменять код, не меняя его поведения. Гарантиями того, что поведение осталось прежним являются unit-тесты.
Для каждого описанного ниже метода в книге даны пошаговые инструкции на примерах. Переписывать их бессмысленно. Обязательно прочтите книгу.
Некоторые методы рефакторинга:
Выделение метода: преобразуйте фрагмент кода в метод, название которого объясняет его назначение
Встраивание метода: если тело метода столь же понятно, как и его название, поместите тело метода в код, который его вызывает и удалите метод
Введение поясняющей переменной: имеется сложное выражение. Поместите его во временную переменную, имя которой поясняет его назначение
Замена метода объектом методов: есть длинные метод, локальные переменные которого используются таким образом, что не возможно применить «Выделение метода». Преобразуйте метод в отдельный объект. Локальные переменные сделайте полями этого объекта. После этого можно разложить данный метод на несколько методов того же объекта
Перемещение метода: если метод чаще использует функции другого класса, а не того,в котором он находится, то создайте аналогичный метод в том классе, который чаще всего им используется. Замените тело прошлого метода простым делегированием или удалите его вообще
Перемещение поля: если поле используется чаще другим классом, чем тем в котором оно определено, то стоит создать поле в целевом классе и отредактировать всех его пользователей
Выделение класса: если класс имеет более одной ответственности его нужно разделить. Создайте новый класс и переместите в него соответствующие поля и методы
Встраивание класса: если класс выполняет слишком мало функций, перемести все функции в другой класс и удалите исходный
Сокрытие делегирования: если клиент обращается к делегируемому классу объекта, то следует создать методы, скрывающие делегирование
Удаление посредника: класс слишком занят простым делегированием, тогда заставьте клиента обращается к делегату непосредственно
Само-инкапсуляция поля: если обращения к полю класса осуществляется напрямую, взаимодействие с ним становится сложнее. Создайте методы для получения и установления значений поля и обращайтесь к полю только через них
Замена значения данных объектом: если данные нуждаются в дополнительных данных или поведении, следует преобразовать элементы данных в объект
Замена массива объектом: если элементы массива относятся к разным сущностям, замените массив объектом, в котором есть поле для каждого элемента
Замена магического числа символической константой: замените магические числа использованием константы, имя которой раскрывает суть магического числа
Замена подкласса полями: если подклассы различаются только методами, возвращающими данные константы, то их можно заменить полями в родительском классе
Декомпозиция условного оператора: замените сложные условия в конструкциях if на вызовы методов
Консолидация дублирующихся условных фрагментов: если один и тот же фрагмент кода используется в нескольких частях условного выражения, переместите его за пределы выражения, вынеся в отдельный метод
Замена вложенных условных операторов граничным оператором: если из-за вложенности условных операторов становится не ясным нормальный путь выполнения, используйте граничные условия для всех особых случаев
Замена условного оператора полиморфизмом: если есть условный оператор, поведение которого зависит от типа объекта, вынесите каждую ветвь условного оператора в переопределяемый метод подкласса. Сделайте исходный метод абстрактным
Введение объекта null: чтобы убрать многократные проверки на совпадение значения с null, замените значение null объектом null
Переименование метода: переименуйте метод, если его название не раскрывает его назначения
Разделение запроса и модификатора: метод должен иметь только одну ответственность. Поэтому, если он возвращает значение, но кроме того изменяет состояние объекта, его нужно разделить на два отдельных метода — один для запроса, один для модификации
Параметризация метода: несколько методов выполняют похожие действия, но с разными значениями. Объедините методы в один, используя параметр для задания значений
Сохранение всего объекта: если код получает от объекта несколько значений, а затем передает их в качестве параметра при вызове метода, лучше всего вместо этого передавать весь объект
Замена параметра вызовом метода: код получает определенное значение путем вызова метода, а затем это значение передает в качестве параметра другому методу. Уберите параметр и заставьте второй метод самостоятельно получить его значение, вызвав нужный метод
Это одна из тех книг, которые всегда должны быть под рукой. Книга хорошо структурирована и ей удобно пользоваться в качестве справочника, а обилие примеров упрощает понимание материала книги.