Uvod u refaktoriranje s IntelliJ IDEA

1. Pregled

Održavanje koda urednim nije uvijek lako. Na našu sreću, naši su IDE danas prilično pametni i mogu nam pomoći u postizanju toga. U ovom uputstvu usredotočit ćemo se na IntelliJ IDEA, uređivač Java koda JetBrains.

Vidjet ćemo nekoliko značajki koje nudi uređivač za refaktor koda, od preimenovanja varijabli do promjene potpisa metode.

2. Preimenovanje

2.1. Osnovno preimenovanje

Prvo, krenimo s osnovama: preimenovanjem. IntelliJ nam nudi mogućnost preimenovanja različitih elemenata našeg koda: vrsta, varijabli, metoda, pa čak i paketa.

Da bismo preimenovali element, moramo slijediti ove korake:

  • Desnom tipkom miša kliknite element
  • Okidač Refaktor> Preimenuj opcija
  • Upišite novo ime elementa
  • Pritisnite Unesi

Usput, prva dva koraka možemo zamijeniti odabirom elementa i pritiskom Shift + F6.

Kad se pokrene, akcija preimenovanja hoće pretražite kôd za svaku upotrebu elementa, a zatim ih promijenite s navedenom vrijednošću.

Zamislimo a SimpleClass razred s loše imenovanom metodom dodavanja, someAdditionMethod, pozvan u glavni metoda:

javna klasa SimpleClass {javna statička void glavna (String [] args) {new SimpleClass (). someAdditionMethod (1, 2); } public int someAdditionMethod (int a, int b) {return a + b; }}

Stoga, ako odlučimo preimenovati ovu metodu u dodati, IntelliJ će proizvesti sljedeći kod:

javna klasa SimpleClass () {public static void main (String [] args) {new SimpleClass (). add (1, 2); } javni int add (int a, int b) {return a + b; }}

2.2. Napredno preimenovanje

Međutim, IntelliJ čini više od traženja upotrebe kodova naših elemenata i njihovog preimenovanja. Zapravo je dostupno još nekoliko opcija. IntelliJ također može tražiti pojave u komentarima i nizovima, pa čak i u datotekama koje ne sadrže izvorni kod. Što se tiče parametara, on ih može preimenovati u hijerarhiji klase u slučaju nadjačanih metoda.

Te su opcije dostupne pritiskom na Shift + F6 još jednom prije preimenovanja našeg elementa i pojavit će se skočni prozor:

The Pretražujte u komentarima i nizovima opcija je dostupna za svako preimenovanje. Što se tiče Potražite pojave teksta opcija, nije dostupna za parametre metode i lokalne varijable. Napokon, Preimenuj parametre u hijerarhiji opcija je dostupna samo za parametre metode.

Tako, ako se pronađe bilo koje podudaranje s jednom od te dvije opcije, IntelliJ će ih prikazati i ponuditi nam mogućnost da isključimo neke promjene (recimo, u slučaju da se podudara s nečim što nije povezano s našim preimenovanjem).

Dodajmo Javadoc našoj metodi, a zatim preimenujmo njen prvi parametar, a:

/ ** * Dodaje a i b * @param a prvi broj * @param b drugi broj * / public int add (int a, int b) {...}

Označavanjem prve opcije u skočnom prozoru za potvrdu, IntelliJ podudara se sa bilo kojim spominjanjem parametara u Javadoc komentaru metode i nudi im i njihovo preimenovanje:

/ ** * Dodaje firstNumber i b * @param firstNumber prvi broj * @param b drugi broj * / public int add (int firstNumber, int b) {...}

Konačno, to moramo primijetiti IntelliJ je pametan i uglavnom pretražuje običaje u opsegu preimenovanog elementa. U našem slučaju, to bi značilo da je komentar smješten izvan metode (osim Javadoca) i sadrži spomen a ne bi se uzelo u obzir za preimenovanje.

3. Izdvajanje

Sada, razgovarajmo o vađenju. Izdvajanje nam omogućuje da zgrabimo dio koda i stavimo ga u varijablu, metodu ili čak klasu. IntelliJ to rješava prilično pametno jer traži slične dijelove koda i nudi ih na isti način.

Dakle, u ovom ćemo odjeljku naučiti kako iskoristiti značajku izdvajanja koju nudi IntelliJ.

3.1. Varijable

Prvo, krenimo s ekstrakcijom varijabli. To znači lokalne varijable, parametre, polja i konstante. Da bismo izdvojili varijablu, moramo slijediti ove korake:

  • Odaberite izraz koji se uklapa u varijablu
  • Desnom tipkom miša kliknite odabrano područje
  • Okidač Refaktor> Ekstrakt> Varijabla / Parametar / Polje / Konstanta opcija
  • Odaberite između Zamijenite samo ovu pojavu ili Zamijenite sve x pojave mogućnosti, ako su predložene
  • Unesite naziv za izdvojeni izraz (ako nam odabrani ne odgovara)
  • Pritisnite Unesi

Što se tiče preimenovanja, moguće je koristiti tipkovne prečace umjesto korištenja izbornika. Zadani su prečaci, Ctrl + Alt + V, Ctrl + Alt + P, Ctrl + Alt + F i Ctrl + Alt + C.

IntelliJ će pokušati pogoditi ime za naš izdvojeni izraz, na temelju onoga što izraz vraća. Ako se ne podudara s našim potrebama, možemo ga promijeniti prije potvrde vađenja.

Ilustrirajmo na primjeru. Mogli bismo zamisliti da dodamo metodu našem SimpleClass razred koji nam govori je li trenutni datum između dva zadana datuma:

javna statička logička vrijednost isNowBetween (LocalDate datum početka, LocalDate datum završetka) {return LocalDate.now (). isAfter (početni datum) && LocalDate.now (). isBefore (datum završetka); }

Recimo da želimo promijeniti svoju provedbu jer koristimo LocalDate.now () dva puta i željeli bismo biti sigurni da ima potpuno jednaku vrijednost u obje procjene. Samo odaberite izraz i izvucite ga u lokalnu varijablu, sada:

Zatim, naš LocalDate.now () poziv se bilježi u lokalnoj varijabli:

javna statička logička vrijednost isNowBetween (LocalDate datum početka, LocalDate datum završetka) {LocalDate sada = LocalDate.now (); vrati se now.isAfter (datum početka) && now.isBefore (kraj datuma); }

Provjerom Zamjeni sve opcija, pobrinuli smo se da su oba izraza odjednom zamijenjena.

3.2. Metode

Provjerimo sada kako izvući metode pomoću IntelliJ-a:

  • Odaberite izraz ili retke koda koji odgovaraju metodi koju želimo stvoriti
  • Desnom tipkom miša kliknite odabrano područje
  • Okidač Refaktor> Ekstrakt> Metoda opcija
  • Upišite podatke o metodi: naziv, vidljivost i parametre
  • Pritisnite Unesi

Udaranje Ctrl + Alt + M nakon odabira metode djeluje i tijelo.

Ponovno upotrijebimo naš prethodni primjer i recimo da želimo imati metodu koja provjerava je li neki datum između ostalih datuma. Tada bismo samo trebali odabrati naš posljednji redak u isNowBetween metoda i pokretanje značajke ekstrakcije metode.

U otvorenom dijaloškom okviru možemo vidjeti da je IntelliJ već uočio tri potrebna parametra: datum početka, koji završavaDatum i sada. Kako želimo da ova metoda bude što generičnija, preimenujemo sada parametar u datum. A u svrhu kohezije stavljamo ga kao prvi parametar.

Na kraju, dajemo našoj metodi ime, isDateBetween, i dovršiti postupak ekstrakcije:

Tada bismo dobili sljedeći kod:

javna statička logička vrijednost isNowBetween (LocalDate datum početka, LocalDate datum završetka) {LocalDate sada = LocalDate.now (); return isDateBetween (sada, početni datum, završavajući datum); } privatni statički logički isDateBetween (datum lokalnog datuma, datum lokalnog datuma lokalni datum, datum završetka lokalnog datuma) {datum povratka.isBefore (datum završetka) && date.isAfter (datum početka); }

Kao što vidimo, akcija je pokrenula stvaranje novog isDateBetween metoda, koja se također naziva u isNowBetween metoda. Metoda je prema zadanim postavkama privatna. Naravno, to se moglo promijeniti pomoću opcije vidljivosti.

3.3. Nastava

Nakon svega toga, možda bismo htjeli dobiti metode povezane s datumima u određenoj klasi, usredotočenu na upravljanje datumima, recimo: DateUtils. Opet, ovo je prilično jednostavno:

  • Desnom tipkom miša kliknite klasu u kojoj se nalaze naši elementi koje želimo premjestiti
  • Okidač Refaktor> Ekstrakt> Delegiraj opcija
  • Upišite podatke o klasi: njezino ime, paket, elementi za delegiranje, vidljivost tih elemenata
  • Pritisnite Unesi

Za ovu značajku prema zadanim postavkama nije dostupan tipkovnički prečac.

Recimo, prije pokretanja značajke, da svoje metode povezane s datumom pozovemo u glavni metoda:

isNowBetween (LocalDate.MIN, LocalDate.MAX); isDateBetween (LocalDate.of (2019, 1, 1), LocalDate.MIN, LocalDate.MAX);

Zatim te dvije metode delegiramo na a DateUtils klasa pomoću opcije delegat:

Pokretanje značajke proizvest će sljedeći kôd:

javna klasa DateUtils {javni statički boolean isNowBetween (LocalDate startingDate, LocalDate ENDDATE) {LocalDate now = LocalDate.now (); return isDateBetween (sada, početni datum, završavajući datum); } javna statička logička vrijednost isDateBetween (datum lokalnog datuma, datum lokalnog datuma LocalDate, datum završetka LocalDate) {datum povratka.isBefore (datum završetka) && date.isAfter (datum početka); }}

Možemo vidjeti da je isDateBetween načinjena je metoda javnost. To je rezultat opcije vidljivosti koja je postavljena na eskalirati prema zadanim postavkama. Eskalirati znači da će se vidljivost promijeniti kako bi seosigurajte da se trenutni pozivi delegiranim elementima još uvijek prevode.

U našem slučaju, isDateBetween koristi se u glavni metoda SimpleClass:

DateUtils.isNowBetween (LocalDate.MIN, LocalDate.MAX); DateUtils.isDateBetween (LocalDate.of (2019, 1, 1), LocalDate.MIN, LocalDate.MAX);

Stoga, prilikom premještanja metode potrebno je učiniti je ne privatnom.

Međutim, odabirom ostalih opcija moguće je dati specifičnu vidljivost našim elementima.

4. Umetanje

Sad kad smo obradili vađenje, razgovarajmo o njemu sličnom: inliningu. Uključivanje je sve u tome da uzmete element koda i zamijenite ga onim od čega je napravljen. Za varijablu to bi bio izraz koji joj je dodijeljen. Za metodu bi to bilo njezino tijelo. Ranije smo vidjeli kako stvoriti novu klasu i dodijeliti joj neke od naših elemenata koda. Ali ima vremena možda bismo htjeli delegirati metodu postojećoj klasi. O tome govori ovaj odjeljak.

Da bismo element postavili u red, moramo desnom tipkom miša kliknuti ovaj element - bilo njegovu definiciju ili referencu na njega - i pokrenuti Refaktor>U redu opcija. To također možemo postići odabirom elementa i pritiskom na Ctrl + Alt + N tipke.

U ovom trenutku, IntelliJ će nam ponuditi više opcija, želimo li ugraditi varijablu ili metodu, bilo da smo odabrali definiciju ili referencu. Te su mogućnosti:

  • Uvrstite sve reference i uklonite element
  • Uvrstite sve reference, ali zadržite element
  • Samo umetnite odabranu referencu i zadržite element

Uzmimo svoje isNowBetween metoda i riješite se sada varijabla, koja se sada čini malo pretjeranom:

Uvrštavanjem ove varijable dobili bismo sljedeći rezultat:

javna statička logička vrijednost isNowBetween (LocalDate početni datum, LocalDate završni datum) {return isDateBetween (LocalDate.now (), početni datum, završni datum); }

U našem je slučaju jedina mogućnost bila ukloniti sve reference i ukloniti element. Ali zamislimo da se i mi želimo riješiti isDateBetween nazovite i odaberite ga ugraditi. Tada bi nam IntelliJ ponudio tri mogućnosti o kojima smo ranije govorili:

Odabir prvog zamijenio bi sve pozive tijelom metode i izbrisao metodu. Što se tiče drugog, on bi zamijenio sve pozive tijelom metode, ali zadržao bi metodu. I na kraju, posljednji bi samo zamijenio trenutni poziv tijelom metode:

javna klasa DateUtils {javni statički boolean isNowBetween (LocalDate startingDate, LocalDate ENDDATE) {LocalDate date = LocalDate.now (); datum vraćanja.isBefore (datum završetka) && date.isAfter (datum početka); } javni statički logički isDateBetween (datum lokalnog datuma, datum početka LocalDate, datum završetka LocalDate) {datum povratka.isBefore (datum završetka) && date.isAfter (datum početka); }}

Naše glavni metoda u SimpleClass ostaje i netaknuta.

5. Kretanje

Ranije smo vidjeli kako stvoriti novu klasu i dodijeliti joj neke od naših elemenata koda. Ali ima vremena možda bismo htjeli delegirati metodu postojećoj klasi. O tome govori ovaj odjeljak.

Da bismo premjestili element, moramo slijediti ove korake:

  • Odaberite element za pomicanje
  • Desnom tipkom miša kliknite element
  • Okidač Refaktor> Premjesti opcija
  • Odaberite klasu primatelja i vidljivost metode
  • Pritisnite Unesi

To također možemo postići pritiskom F6 nakon odabira elementa.

Recimo da svojoj novoj dodamo novu metodu SimpleClass, isDateOutstide (), koji će nam reći nalazi li se datum izvan intervala datuma:

javna statička logička vrijednost isDateOutside (datum lokalnog datuma, datum početka lokalnog datuma, datum završetka lokalnog datuma) {return! DateUtils.isDateBetween (datum, datum početka, datum završetka); }

Tada shvaćamo da bi njegovo mjesto trebalo biti na našem DateUtils razred. Stoga smo ga odlučili premjestiti:

Naša je metoda sada u DateUtils razred. Možemo vidjeti da je referenca na DateUtils iznutra je metoda nestala jer više nije potrebna:

javna statička logička vrijednost isDateOutside (datum lokalnog datuma, datum početka lokalnog datuma, datum završetka lokalnog datuma) {return! isDateBetween (datum, datum početka, datum završetka); }

Primjer koji smo upravo učinili dobro funkcionira jer se tiče statičke metode. Međutim, u slučaju instance metode, stvari ne stoje tako jednostavno.

Ako želimo premjestiti metodu instance, IntelliJ će tražiti klase na koje se upućuje u poljima trenutne klase i ponuditi premještanje metode u jednu od tih klasa (pod uvjetom da su naši za izmjenu).

Ako se u poljima ne navodi nijedna modificirana klasa, tada IntelliJ predlaže izradu metode statički prije nego što ga premjestite.

6. Promjena potpisa metode

Na kraju ćemo razgovarati o značajci koja nam omogućuje promjenu potpisa metode. Svrha ove značajke je manipulirati svim aspektima potpisa metode.

Kao i obično, moramo proći nekoliko koraka da bismo pokrenuli značajku:

  • Odaberite metodu koju želite promijeniti
  • Desnom tipkom miša kliknite metodu
  • Okidač Refactor> Promijeni potpis opcija
  • Donesite promjene u potpis metode
  • Pritisnite Unesi

Ako više volimo koristiti prečac na tipkovnici, moguće je koristiti Ctrl + F6 također.

Ova će značajka otvoriti dijaloški okvir vrlo sličan značajci ekstrakcije metode. I tako imamo iste mogućnosti kao kad izdvojimo metodu: promjena imena, vidljivosti te dodavanje / uklanjanje parametara i njihovo fino podešavanje.

Zamislimo da želimo promijeniti našu implementaciju isDateBetween bilo da se datumske granice smatraju uključivim ili isključivim. Da bismo to učinili želimo dodati boolean parametar naše metode:

Promjenom potpisa metode možemo dodati ovaj parametar, imenovati ga i dati mu zadanu vrijednost:

javni statički logički isDateBetween (datum lokalnog datuma, datum početka LocalDate, datum završetka LocalDate, uključujući logički podatak) {datum povratka.isBefore (datum završetka) && date.isAfter (datum početka); }

Nakon toga, moramo samo prilagoditi tijelo metode prema našim potrebama.

Da smo htjeli, mogli smo provjeriti Delegirajte metodom preopterećenja opcija kako bi se stvorila druga metoda s parametrom umjesto izmjene trenutne.

7. Povucite prema gore i dolje

Naš Java kôd obično ima hijerarhiju klasa - izvedene klase proširuju osnovnu klasu.

Ponekad želimo premjestiti članove (metode, polja i konstante) između ovih klasa. Tu nam posljednji refaktoriranje dobro dođe: to nam omogućuje povucite članove iz izvedene klase u osnovnu klasu ili ih potisnite iz osnovne klase u svaku izvedenu klasu.

7.1. Povući

Prvo, povucimo metodu do osnovne klase:

  • Odaberite člana izvedene klase za izlazak
  • Desnom tipkom miša kliknite člana
  • Okidač Refactor> Povuci članove prema gore ... opcija
  • Pritisnite Refaktor dugme

Prema zadanim postavkama za ovu značajku nije dostupan tipkovnički prečac.

Recimo da imamo izvedenu klasu koja se zove Izveden. Koristi privatno doubleValue () metoda:

javna klasa Izvedeno proširuje Base {javna statička void glavna (String [] args) {Izvedena tema = novo Izvedena (); System.out.println ("Udvostručavanje 21. Rezultat:" + subject.doubleValue (21)); } private int doubleValue (int broj) {povratni broj + broj; }}

Osnovna klasa Baza prazno je.

Dakle, što se događa kad se povučemo doubleValue () u Baza?

Događaju se dvije stvari doubleValue () kada u gornjem dijaloškom okviru pritisnemo "Refactor":

  • premješta se na Baza razred
  • njegova se vidljivost mijenja od privatni do zaštićen tako da je Izveden razred još uvijek može koristiti

The Baza klasa nakon toga sada ima metodu:

javna klasa Base {zaštićen int doubleValue (int broj) {povratni broj + broj; }}

Dijaloški okvir za povlačenje članova (slika gore) daje nam još neke mogućnosti:

  • možemo odabrati druge članove i povući ih sve odjednom
  • možemo pregledati naše promjene gumbom "Pregled"
  • samo metode imaju potvrdni okvir u stupcu "Napravi sažetak". Ako je potvrđena, ova će opcija osnovnoj klasi dati apstraktnu definiciju metode tijekom izvlačenja. Stvarna metoda ostat će u izvedenoj klasi, ali će dobiti @Preuzmi bilješka. Zbog toga se druge izvedene klase više neće kompajlirati onda jer im nedostaje primjena te nove, apstraktne osnovne metode

7.2. Potisnuti

Na kraju, spustimo člana u izvedenu klasu. To je suprotno od povlačenja koje smo upravo izveli:

  • Odaberite člana osnovne klase za potiskivanje
  • Desnom tipkom miša kliknite člana
  • Okidač Refactor> Gurnite članove dolje ... opcija
  • Pritisnite Refaktor dugme

Kao i kod povlačenja članova prema gore, za ovu značajku prema zadanim postavkama nije dostupan tipkovni prečac.

Pritisnimo opet metodu koju smo upravo povukli. The Baza razred izgledao je ovako na kraju prethodnog odjeljka:

javna klasa Base {zaštićen int doubleValue (int broj) {povratni broj + broj; }}

Ajde sad gurajmo doubleValue () dolje do Izveden razred:

Ovo je Izveden klase nakon pritiska na „Refactor“ u gornjem dijaloškom okviru.The doubleValue () metoda se vratila:

javna klasa Izvedeno proširuje Base {private int theField = 5; public static void main (String [] args) {Izvedeni predmet = novi Izveden (); System.out.println ("Udvostručavanje 21. Rezultat:" + subject.doubleValue (21)); } zaštićeni int doubleValue (int broj) {povratni broj + broj; }}

Sad oba Baza razred i Izveden razreda vratili su se tamo gdje su započeli u prethodnom odjeljku "Povuci se". Skoro, to je - doubleValue () zadržao zaštićen vidljivost koju je imala u Baza (bilo je privatni izvorno).

IntelliJ 2019.3.4 zapravo donosi upozorenje pri guranju prema dolje doubleValue (): "Gurnuti članovi neće biti vidljivi na određenim web lokacijama za pozive". Ali kao što možemo vidjeti u Izveden razred iznad, doubleValue () je zaista vidljivo za glavni() metoda.

Dijaloški okvir za potiskivanje članova (slika gore) također nam daje još neke mogućnosti:

  • ako imamo više izvedenih klasa, tada će IntelliJ gurati članove u svaku izvedenu klasu
  • možemo gurnuti više članova prema dolje
  • možemo pregledati naše promjene gumbom "Pregled"
  • samo metode imaju potvrdni okvir u stupcu "Zadrži sažetak" - To je slično povlačenju članova: Ako je označeno, ova će opcija ostaviti apstraktnu metodu u osnovnoj klasi. Za razliku od povlačenja članova, ova će opcija implementirati metode u sve izvedene klase. Ove će metode također dobiti @Preuzmi bilješka

8. Zaključak

U ovom smo članku imali priliku duboko zaroniti u neke značajke refaktoriranja koje nudi IntelliJ. Naravno, nismo pokrili sve mogućnosti jer je IntelliJ vrlo moćan alat. Da bismo saznali više o ovom uređivaču, uvijek se možemo obratiti njegovoj dokumentaciji.

Vidjeli smo nekoliko stvari poput toga kako preimenovati elemente koda i kako izdvojiti neka ponašanja u varijable, metode ili klase. Također smo naučili kako neke elemente ugraditi ako nam ne trebaju samostalno, premjestiti neki kôd drugdje ili čak u potpunosti promijeniti postojeći potpis metode.


$config[zx-auto] not found$config[zx-overlay] not found