— И снова здравствуйте.

— Привет!

— Сегодня я расскажу тебе про рефакторинг(re-factoring). Рефакторинг – это изменение кода проекта без изменения его функционала.

— А как такое может быть?

— Ну, в самых простых случаях – мы переименовываем переменные и/или методы. От переименования переменных программа ведь по-другому работать не станет?

— Нет, конечно.

— Вот, затем можно разбить большие методы на несколько отдельных.

Можно вынести повторяющиеся куски кода в отдельный метод.

Некоторые функции обозначить как static, а затем вынести их в утилитные классы.

Но это рефакторинг в узком смысле.

Иногда под рефакторингом понимают переписывание (улучшение) архитектуры проекта, без добавления новой функциональности. Это рефакторинг в широком смысле.

Intellij IDEA стала самой популярной IDE (среда разработки) именно потому, что первая внедрила очень мощные средства рефакторинга.

— Что же это за волшебные штуки такие-то?

Волшебство первое – изменение имени метода.

— Представь, что в твоем коде есть метод, который вызывается из 100-500 других мест. И ты решил сменить его имя на более читаемое. Скажем, было run(), а стало runDownloadTaskAsync(). Насколько быстро это сделать?

— Ну, сначала надо поменять имя этого метода, затем искать в программе все места, где этот метод вызывается, и менять его имя там.

— А как ты будешь его искать?

— Я бы просто запустил программу, и Intellij IDEA бы выдала все ошибки, где вызывается метод, которого нет.

— Хорошо, а допустим, у тебя у каждого метода есть поясняющий комментарий (JavaDoc), в котором написано что делает этот метод, и там написано его старое имя.

— Я поменяю и комментарии.

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

Было Стало
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

— Да, хорошо бы поменять имена и этим переменным. Не помешало бы.

— Так вот, это все можно сделать с помощью Intellij IDEA за пару секунд!

Становишься курсором на имя метода (или кликаешь по нему мышкой), затем жмешь Shift+F6 и просто начинаешь вводить нужное имя метода.

Пример: редактирование имени метода.

Начало редактирования:

IDEA: refactoring - 1

Указали новое имя:

IDEA: refactoring - 2

Просто вводишь новое имя, жмешь enter и все. Все вызовы данного метода в проекте переименованы.

Intellij IDEA также обычно дополнительно спрашивает – надо ли переименовывать переменные и имена методов в комментариях. Достаточно просто нажать «да», и она все сделает.

При этом если до рефакторинга проект компилировался, будет и после.

— Звучит очень многообещающе.

— Кстати, имена переменных можно поменять так же. Стал на имя, просто жмешь Shift+F6 и все – можешь вводить новое имя, и везде, где используется эта переменная, оно поменяется.

Если переменная была полем класса и у нее были getter и setter, они тоже сменят имя, чтобы соответствовать новому имени переменной.

— Попробовал с переменными. Все работает, как ты и говоришь, Элли. Рефакторинг — это круто!

— Ты думаешь – это весь рефакторинг? Да там столько всего, что мы и десятой части не коснулись.

— Ого. И что же там еще?

Волшебство второе – вынос переменной.

— Иногда в коде часто повторяются некоторые выражения, что аж хочется вынести их в отдельную переменную. Пример:

Код
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
Как хочется сделать, глядя на него:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

— Ага.

— А ведь бывает и куда более сложный код, в котором очень много повторяющихся частей.

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

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

Например, в примере выше, речь может идти не об адресе проживания, а об адресе, куда можно обратиться в случае, если с человеком что-то случится. Тогда можно назвать переменную не address, а, скажем, supportAddress. Тогда, программисту, который видит этот код в первый раз, будет понятнее, что тут происходит.

— Да, согласен, добавление таких переменных имеет смысл.

Так как это сделать?

— Вынести какое-то выражение в отдельную переменную очень просто.

Шаг 1 – выделяем мышкой выражение.

IDEA: refactoring - 3

Шаг 2 – нажимаем Ctrl+Alt+V

IDEA: refactoring - 4

Появляется окно, где Intellij IDEA нас спрашивает – заменить только одно выделенное выражение или заменить все выражения (4 шт.)?

Выбираем второй пункт – заменить все вхождения (Replace all 4 occurrences)

Шаг 3 – нажимаем Enter.

IDEA: refactoring - 5

Intellij IDEA предлагает ввести имя переменной. И сразу предлагает свой вариант имени. Не так уже он и плох, да?

— Ага. В самую точку. Мы тоже собирались назвать переменную address. А как она догадалась?

— По имени последнего метода в выражении – он возвращает адрес, значит, скорее всего, в переменной хранится именно адрес.

— Отлично получилось. Классная штука, Элли.

Волшебство третье – вынос кода в отдельный метод.

— А ведь можно было сделать и по-другому. Можно было объявить новый метод, например, printAddress и вынести весь этот код в него.

Давай, так и попробуем сделать.

Шаг 1 – выделяем 4 строчки кода, которые используют переменную address:

IDEA: refactoring - 6

Шаг 2 – нажимаем Ctrl+Alt+M

IDEA: refactoring - 7

Intellij IDEA сама определила, какие переменные будут нужны этому методу, и предлагает нам, как он будет выглядеть. Осталось только ввести имя метода.

Шаг 3 – вводим имя метода — printAddress и жмем Enter.

IDEA: refactoring - 8

Как тебе результат?

— Это офигенно. Intellij IDEA не только вынесла код в отдельный метод, она еще и добавила туда все нужные переменные. Так еще и имена угадала правильно.