undefined

IDEA: refactoring

Java Collections
9 уровень , 7 лекция
Доступна

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

— Привет!

— Сегодня я расскажу тебе про рефакторинг(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 не только вынесла код в отдельный метод, она еще и добавила туда все нужные переменные. Так еще и имена угадала правильно.

Комментарии (29)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Алексей Мирный Уровень 41 Москва Россия
20 января 2021
Очень понравилась статья
Konstantin Уровень 41 Одесса
18 сентября 2020
1. Волшебства в IT нет. 2. Инструменты рефакторинга стандартны для большинства IDE. P.S. Сделали из Идеи неподражаемый фетиш. Радужный единорог б@@@@.
skrskr Уровень 39 Санкт-Петербург Россия
5 февраля 2020
Для понимания насколько мощные инструменты рефакторинга в Intellij IDEA. Ходил я в 2019 году на конференцию для джавистов JPoint, там была куча докладов, которые я наполовину понимал (Про Jenkins, Kafka, Netflix Eureka, Spring и тд). Один из докладчиков был действующим разработчиком Intellij IDEA, и его доклад был на тему рефакторинга в нашей ide. Суть примерно такая - Intellij IDEA позволяет вам делать рефакторинг только горячими клавишами или инструментами ide на 95%+, то есть вы практически не пишите новый код ручками, максимум имена переменным или методам даёте. Так что хорошее знание внутренних инструментов вам сильно поможет.
Andrey Morozov Уровень 40 Москва Россия
20 ноября 2018
Выделяем кусок кода, ПКМ > Refactor > Extract > и там указаны все варианты с горячими клавишами (которые почему-то не всегда отрабатывают, так что через контекстное меню надежнее)
Вадим Уровень 40
22 февраля 2018
Это всё уже было когда проходили рефакторинг
Ro Do Уровень 40 Киев Украина
13 декабря 2017
Полезно.
Паша Дворяк Уровень 40 Киев Украина
11 декабря 2017
Странно, что здесь нету комментариев о полезности этой статьи на 39 уровне )