"Hej igen."

"Hej!"

"Idag ska jag berätta om refactoring. Refactoring är att ändra koden i ett projekt utan att ändra dess funktionalitet."

"Men hur är det möjligt?"

"Tja, i de enklaste fallen skulle vi kunna byta namn på variabler och/eller metoder. När allt kommer omkring, att ändra namnet på en variabel kommer inte att få programmet att fungera annorlunda, eller hur?"

"Självklart inte."

"Du kan också dela upp stora metoder i flera mindre. "

"Du kan dra upprepade kodavsnitt till en separat metod. "

"Vissa funktioner kan deklareras statiska och sedan flyttas till verktygsklasser."

"Men det här är en snäv tolkning av refactoring."

"Omfaktorering innebär ibland att skriva om (förbättra) ett projekts arkitektur utan att lägga till ny funktionalitet. Detta är omfaktorisering i ordets vida bemärkelse."

"IntelliJ IDEA blev den mest populära integrerade utvecklingsmiljön (IDE) specifikt för att den var den första som introducerade mycket kraftfulla refaktoreringsverktyg."

"Vilka är dessa magiska verktyg?"

Magiskt trick #1: Ändra en metods namn.

"Föreställ dig att din kod har en metod som kallas från 100-500 olika platser. Du har bestämt dig för att ändra dess namn till något mer förståeligt. Låt oss säga att den är run(), och du vill att den ska vara runDownloadTaskAsync(). Hur snabbt kan du göra det?"

"Tja, först måste du ändra metodens namn, sedan hitta alla platser i programmet där metoden kallas, och ändra namnet där också."

"Och hur skulle du hitta de platserna?"

"Jag skulle bara köra programmet och IntelliJ IDEA skulle visa mig alla platser där en icke-existerande metod kallas."

"Okej. Men anta nu att varje metod har en förklarande kommentar (JavaDoc) som förklarar vad metoden gör - och det gamla metodnamnet är skrivet där."

"Jag skulle ändra kommentarerna också."

"Men det kan också finnas variabler vars namn är associerade med metodens namn. Det skulle vara bra att ändra dessa också:"

Innan Efter
Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

"Ja, det skulle vara bra att ändra namnen på de variablerna också. Det skulle inte skada."

"Tja, allt detta kan göras på bara några sekunder med IntelliJ IDEA!"

"Du placerar markören på namnet på metoden (eller klickar på det med musen), och trycker sedan på Skift+F6 och börjar helt enkelt skriva in önskat metodnamn."

"Här är ett exempel på att redigera ett metodnamn."

"Börja redigera:"

IDÉ: refactoring - 1

"Ange ett nytt namn:"

IDÉ: refactoring - 2

"Skriv bara in ett nytt namn, tryck på enter och det är allt. Den här metoden kommer att döpas om överallt där den kallas i projektet."

"IntelliJ IDEA brukar också fråga om du vill byta namn på variabelnamn och metodnamn i kommentarer. Klicka bara på "Ja" så kommer allt att ändras."

"Dessutom, om projektet kompilerades före denna refaktoreringsoperation, så kommer det garanterat att kompileras efter refaktoriseringen."

"Låter mycket lovande."

"Förresten, du kan ändra variabelnamn på samma sätt. När du har klickat på ett namn trycker du bara på Shift+F6 — Du kan sedan ange ett nytt namn, och IntelliJ kommer att ändra variabelnamnet varhelst det används. "

"Om variabeln är ett fält i en klass och har en getter och en setter, kommer även namnen på getter och setter att ändras för att matcha variabelns nya namn."

"Jag provade det med hjälp av variabler. Allt fungerar precis som du sa, Ellie. Refactoring är fantastiskt!"

"Tror du att det är allt som finns med refactoring? Refractoring är ett så brett ämne - vi har inte ens skrapat på ytan."

"Wow. Vad finns det mer?"

Magiskt trick #2: Extrahera en variabel.

"Ibland upprepas vissa uttryck så ofta i kod att du vill flytta dem till en separat variabel. Till exempel:"

Koda
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());
}
Så här vill du att det ska se ut:
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());
}

"Ah."

"Och kod kan vara mycket mer komplicerad, med många upprepade delar."

"Programmerare skriver det inte med avsikt. Men du behöver ofta lägga till något till en metod, sedan något annat - och med tiden går antalet upprepningar genom taket."

"Genom att skapa en separat variabel kan vi ge den ett rätt namn och förbättra kodens läsbarhet."

"Till exempel, i exemplet ovan, kanske vi inte pratar om en hemadress. Kanske pratar vi om adressen till en nödkontakt. Då kan du ringa den här variabeln emergencyContactAddress, istället för bara adress. Sedan, en programmerare att se den här koden för första gången kommer att förstå vad som händer här."

"Ja, jag håller med. Att lägga till sådana variabler är vettigt."

"Så, hur gör du?"

"Att flytta ett uttryck till en separat variabel är väldigt enkelt."

Steg 1: Använd musen för att välja uttrycket.

IDÉ: refactoring - 3

Steg 2: Tryck på Ctrl+Alt+V

IDÉ: refactoring - 4

"Ett fönster öppnas där IntelliJ IDEA frågar oss om vi bara vill ersätta det valda uttrycket eller alla instanser av uttrycket (4 förekomster)?"

"Välj det andra alternativet för att ersätta alla förekomster (Ersätt alla 4 förekomster)"

Steg 3: Tryck på Enter.

IDÉ: refactoring - 5

"IntelliJ IDEA kommer att uppmana dig att ange ett variabelnamn. Det kommer också att göra ett eget förslag på namnet. Inte illa, va?"

"Uh-huh. Precis. Vi planerade också att namnge variabeln "adress". Hur visste den det?"

"Genom att använda namnet på den sista metoden i uttrycket, som returnerar en adress. Det är alltså troligt att variabeln kommer att användas för att lagra en adress."

"Det gick riktigt bra. Bra grejer, Ellie."

Magiskt trick #3: Extrahera kod till en separat metod.

"Men vi kunde ha gjort något annat. Vi kunde ha deklarerat en ny metod, t.ex. printAddress (), och flyttat in all denna kod i den."

"Låt oss försöka göra det."

Steg 1: Välj de 4 kodraderna som använder adressvariabeln:

IDÉ: refactoring - 6

Steg 2: tryck Ctrl+Alt+M

IDÉ: refactoring - 7

"IntelliJ IDEA bestämmer vilka variabler metoden kommer att behöva, och föreslår hur den ska se ut. "Det enda som återstår är att ange ett namn på metoden."

Steg 3: Ange printAddress som metodnamn och tryck på Enter.

IDÉ: refactoring - 8

"Vad tycker du om det?"

"Det är fantastiskt. Inte bara extraherade IntelliJ IDEA koden till en separat metod, den la också till alla nödvändiga variabler. Dessutom gissade den alla namnen korrekt."