— І знову привіт.
— Привіт!
— Сьогодні я розповім тобі про рефакторинг (re-factoring). Рефакторинг – це зміна коду проекту без зміни його функціоналу.
— А як таке може бути?
— Ну, у найпростіших випадках – ми перейменовуємо змінні та/або методи. Від перейменування змінних адже програма по-іншому працювати не стане?
— Ні, звичайно.
— Ось, потім можна розбити великі методи на кілька окремих.
Можна винести шматки коду, що повторюються, в окремий метод .
Деякі функції позначити як static, а потім винести їх в утилітні класи.
Але це рефакторинг у вузькому значенні.
Іноді під рефакторингом розуміють переписування (покращення) архітектури проекту без додавання нової функціональності. Це рефакторинг у широкому сенсі.
Intellij IDEA стала найпопулярнішою IDE (середовище розробки) саме тому, що перша впровадила дуже потужні засоби рефакторингу.
— Що ж це за чарівні штуки такі?
Чарівство перше – зміна імені методу.
— Уяви, що у твоєму коді є метод, який викликається зі 100-500 інших місць. І ти вирішив змінити його ім'я на читанне. Скажімо, було run(), а стало runDownloadTaskAsync(). Наскільки це швидко зробити?
— Ну, спочатку треба поміняти ім'я цього методу, потім шукати у програмі всі місця, де цей метод викликається, та міняти його ім'я там.
— А як ти його шукатимеш?
— Я б просто запустив програму, і Intellij IDEA видала всі помилки, де викликається метод, якого немає.
— Добре, а припустимо, у тебе кожен метод має пояснювальний коментар (JavaDoc), в якому написано що робить цей метод, і там написано його старе ім'я.
— Я поміняю коментарі.
— Адже можуть ще бути змінні, назва яких пов'язана з ім'ям методу, добре б їх змінити також:
Було | Стало |
---|---|
| |
— Так, добре було б змінити імена і цим змінним. Не завадило б.
— Так ось, це все можна зробити за допомогою Intellij IDEA за пару секунд! Shift+F6 і просто починаєш вводити потрібне ім'я методу.
Приклад: редагування імені методу.
Вказали нове ім'я:
Просто вводиш нове ім'я, тиснеш 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 – виділяємо мишкою вираз.
< strong>Крок 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 не тільки винесла код в окремий метод, вона ще й додала туди всі потрібні змінні. Так ще й імена правильно вгадала.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ