"Здравей отново."

"Здрасти!"

„Днес ще ви разкажа за рефакторинга. Рефакторингът е промяна на codeа в проект, без да се променя неговата функционалност.“

— Но How е възможно това?

„Е, в най-простите случаи бихме могли да преименуваме променливи и/or методи. В крайна сметка промяната на името на променлива няма да накара програмата да работи по различен начин, нали?“

"Разбира се, че не."

Можете също да разделите големи методи на няколко по-малки.

„Можете да изтеглите повтарящи се codeови фрагменти в отделен метод.

„Някои функции могат да бъдат обявени за статични и след това да бъдат преместени в класове за помощ.“

„Но това е тясна интерпретация на рефакторинга.“

"Рефакторингът понякога означава пренаписване (подобряване) на архитектурата на проекта без добавяне на нова функционалност. Това е рефакторинг в широкия смисъл на думата."

„IntelliJ IDEA стана най-популярната интегрирана среда за разработка (IDE), особено защото беше първата, която въведе много мощни инструменти за рефакторинг.“

— Какви са тези магически инструменти?

Магически трик №1: Променете името на метод.

„Представете си, че вашият code има метод, който се извиква от 100-500 различни места. Решor сте да промените името му в нещо по-разбираемо. Да кажем, че е run(), а вие искате да бъде runDownloadTaskAsync(). Колко бързо можеш ли да го направиш?"

„Е, първо трябва да промените името на метода, след това да намерите всички места в програмата, където се извиква този метод, и да промените името и там.“

— И How бихте намерor тези места?

„Просто стартирах програмата и IntelliJ IDEA ще ми покаже всички места, където се извиква несъществуващ метод.“

"Добре. Но сега да предположим, че всеки метод има обяснителен коментар (JavaDoc), който обяснява Howво прави методът - и старото име на метода е написано там."

„И аз бих променил коментарите.“

„Но може да има и променливи, чиито имена са свързани с името на метода. Би било добре да промените и тях:“

Преди След
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

„Да, би било добре да промените и имената на тези променливи. Няма да навреди.“

„Е, всичко това може да се направи само за няколко секунди с помощта на IntelliJ IDEA!“

„Поставяте курсора върху името на метода (or щракнете върху него с мишката), след което натиснете Shift+F6 и просто започнете да въвеждате името на желания метод.“

„Ето пример за редактиране на име на метод.“

„Започнете да редактирате:“

ИДЕЯ: рефакторинг - 1

„Посочете ново име:“

ИДЕЯ: рефакторинг - 2

„Просто въведете ново име, натиснете enter и това е. Този метод ще бъде преименуван навсякъде, където се извиква в проекта.“

„IntelliJ IDEA също обикновено пита дали искате да преименувате имена на променливи и имена на методи в коментарите. Просто щракнете върху „Да“ и това ще промени всичко.“

„Нещо повече, ако проектът е компorран преди тази операция по рефакторинг, тогава е гарантирано, че ще се компorра след рефакторинга.“

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

„Между другото, можете да промените имената на променливите по същия начин. След като щракнете върху име, просто натиснете Shift+F6 — След това можете да въведете ново име и IntelliJ ще промени името на променливата, където и да се използва.

„Ако променливата е поле в клас и има getter и setter, тогава имената на getter и setter също ще бъдат променени, за да съответстват на новото име на променливата.“

„Опитах го с помощта на променливи. Всичко работи точно Howто каза, Ели. Рефакторингът е страхотен!“

„Мислите ли, че това е всичко за рефакторинга? Рефракционирането е толкова обширна тема – ние дори не сме надраскали повърхността.“

"Уау. Какво друго има?"

Магически трик №2: Извличане на променлива.

„Понякога определени изрази се повтарят толкова често в codeа, че ще искате да ги преместите в отделна променлива. Например:“

Код
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());
}

"Ах."

„И codeът може да бъде много по-сложен, с много повтарящи се части.“

„Програмистите не го пишат по този начин умишлено. Но често ще трябва да добавите нещо към метода, след това нещо друго – и с течение на времето броят на повторенията скача през покрива.“

„Като създадем отделна променлива, можем да й дадем подходящо име и да подобрим четливостта на codeа.“

„Например, в примера по-горе, може би не говорим за домашен address. Може би говорим за address на спешен контакт. Тогава можете да наречете тази променлива EmergencyContactAddress, instead of просто address. След това програмист като видите този code за първи път, ще разберете Howво става тук."

"Да, съгласен съм. Добавянето на такива променливи има смисъл."

"Е, How го правиш?"

„Преместването на израз в отделна променлива е много просто.“

Стъпка 1: Използвайте мишката, за да изберете израза.

ИДЕЯ: рефакторинг - 3

Стъпка 2: Натиснете Ctrl+Alt+V

ИДЕЯ: рефакторинг - 4

„Отваря се прозорец, в който IntelliJ IDEA ни пита дали искаме да заменим само избрания израз or всички екземпляри на израза (4 срещания)?“

„Изберете втората опция за замяна на всички срещания (Замяна на всичките 4 срещания)“

Стъпка 3: Натиснете Enter.

ИДЕЯ: рефакторинг - 5

„IntelliJ IDEA ще ви подкани да въведете име на променлива. Освен това ще направи собствено предложение за името. Не е лошо, а?“

„Ъъъъ. Точно така. Ние също планирахме да наименуваме променливата „address“. Как разбра?“

„Чрез използване на името на последния метод в израза, който връща address. По този начин е вероятно променливата да се използва за съхраняване на address.“

„Това се получи наистина добре. Страхотни неща, Ели.“

Магически трик №3: Извлечете codeа в отделен метод.

„Но можехме да направим нещо друго. Можехме да декларираме нов метод, например printAddress (), и да преместим целия този code в него.“

— Нека се опитаме да го направим.

Стъпка 1: Изберете 4 реда code, които използват addressната променлива:

ИДЕЯ: рефакторинг - 6

Стъпка 2: натиснете Ctrl+Alt+M

ИДЕЯ: рефакторинг - 7

"IntelliJ IDEA определя от кои променливи ще се нуждае методът и предлага How трябва да изглежда. "Единственото, което остава, е да въведете име за метода."

Стъпка 3: Въведете printAddress като име на метода и натиснете Enter.

ИДЕЯ: рефакторинг - 8

— Как ти харесва това?

„Страхотно е. IntelliJ IDEA не само извлече codeа в отделен метод, но и добави всички необходими променливи. Нещо повече, позна всички имена правилно.“