— І знову привіт.

— Привіт!

— Сьогодні я розповім тобі про рефакторинг (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 і просто починаєш вводити потрібне ім'я методу.

Приклад: редагування імені методу.

Початок редагування:< /p> IDEA: refactoring - 1

Вказали нове ім'я:

Просто вводиш нове ім'я, тиснеш enter і все. Всі виклики даного методу в проекті перейменовані.

Intellij IDEA також зазвичай додатково запитує – чи потрібно перейменовувати змінні та імена методів у коментарях. Досить просто натиснути «так», і вона все зробить.

При цьому, якщо до рефакторингу проект компілювався, буде й після.

&# 8212; Звучить дуже багатообіцяюче.

— До речі, імена змінних можна змінити так само. Став на ім'я, просто тиснеш 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

< strong>Крок 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+MIDEA: refactoring - 7

Intellij IDEA сама визначила, які змінні будуть потрібні цьому методу, і пропонує нам, як він виглядатиме. Залишилося лише ввести ім'я методу.

Крок 3 – вводимо ім'я методу — printAddress і тиснемо Enter. '>IDEA: refactoring - 8

Як тобі результат?

— ; Це офігенно. Intellij IDEA не тільки винесла код в окремий метод, вона ще й додала туди всі потрібні змінні. Так ще й імена правильно вгадала.