— И снова здравствуйте.
— Привет!
— Сегодня я расскажу тебе про рефакторинг(re-factoring). Рефакторинг – это изменение кода проекта без изменения его функционала.
— А как такое может быть?
— Ну, в самых простых случаях – мы переименовываем переменные и/или методы. От переименования переменных программа ведь по-другому работать не станет?
— Нет, конечно.
— Вот, затем можно разбить большие методы на несколько отдельных.
Можно вынести повторяющиеся куски кода в отдельный метод.
Некоторые функции обозначить как static, а затем вынести их в утилитные классы.
Но это рефакторинг в узком смысле.
Иногда под рефакторингом понимают переписывание (улучшение) архитектуры проекта, без добавления новой функциональности. Это рефакторинг в широком смысле.
Intellij IDEA стала самой популярной IDE (среда разработки) именно потому, что первая внедрила очень мощные средства рефакторинга.
— Что же это за волшебные штуки такие-то?
Волшебство первое – изменение имени метода.
— Представь, что в твоем коде есть метод, который вызывается из 100-500 других мест. И ты решил сменить его имя на более читаемое. Скажем, было run(), а стало runDownloadTaskAsync(). Насколько быстро это сделать?
— Ну, сначала надо поменять имя этого метода, затем искать в программе все места, где этот метод вызывается, и менять его имя там.
— А как ты будешь его искать?
— Я бы просто запустил программу, и Intellij IDEA бы выдала все ошибки, где вызывается метод, которого нет.
— Хорошо, а допустим, у тебя у каждого метода есть поясняющий комментарий (JavaDoc), в котором написано что делает этот метод, и там написано его старое имя.
— Я поменяю и комментарии.
— А ведь могут еще быть переменные, название которых связано с именем метода, хорошо бы и их поменять тоже:
Было | Стало |
---|---|
|
|
— Да, хорошо бы поменять имена и этим переменным. Не помешало бы.
— Так вот, это все можно сделать с помощью Intellij IDEA за пару секунд!
Становишься курсором на имя метода (или кликаешь по нему мышкой), затем жмешь Shift+F6 и просто начинаешь вводить нужное имя метода.
Пример: редактирование имени метода.
Начало редактирования:

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

Просто вводишь новое имя, жмешь 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 – выделяем мышкой выражение.

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

Появляется окно, где Intellij IDEA нас спрашивает – заменить только одно выделенное выражение или заменить все выражения (4 шт.)?
Выбираем второй пункт – заменить все вхождения (Replace all 4 occurrences)
Шаг 3 – нажимаем Enter.

Intellij IDEA предлагает ввести имя переменной. И сразу предлагает свой вариант имени. Не так уже он и плох, да?
— Ага. В самую точку. Мы тоже собирались назвать переменную address. А как она догадалась?
— По имени последнего метода в выражении – он возвращает адрес, значит, скорее всего, в переменной хранится именно адрес.
— Отлично получилось. Классная штука, Элли.
Волшебство третье – вынос кода в отдельный метод.
— А ведь можно было сделать и по-другому. Можно было объявить новый метод, например, printAddress и вынести весь этот код в него.
Давай, так и попробуем сделать.
Шаг 1 – выделяем 4 строчки кода, которые используют переменную address:

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

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

Как тебе результат?
— Это офигенно. Intellij IDEA не только вынесла код в отдельный метод, она еще и добавила туда все нужные переменные. Так еще и имена угадала правильно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ