Úvod do refaktoringu s IntelliJ IDEA

1. Prehľad

Udržiavať poriadok v kóde nie je vždy ľahké. Našťastie pre nás sú naše IDE v dnešnej dobe dosť inteligentné a môžu nám pomôcť dosiahnuť tento cieľ. V tomto tutoriáli sa zameriame na IntelliJ IDEA, editor kódu Java JetBrains.

Uvidíme niekoľko funkcií, ktoré editor ponúkne na prepracovanie kódu, od premenovania premenných po zmenu podpisu metódy.

2. Premenovanie

2.1. Základné premenovanie

Najprv začneme so základmi: premenovaním. IntelliJ nám ponúka možnosť premenovať rôzne prvky nášho kódu: typy, premenné, metódy a dokonca aj balíčky.

Ak chcete premenovať prvok, musíme postupovať podľa týchto krokov:

  • Kliknite pravým tlačidlom myši na prvok
  • Spustiť Refaktor> Premenovať možnosť
  • Zadajte názov nového prvku
  • Stlačte Zadajte

Mimochodom, prvé dva kroky môžeme nahradiť výberom prvku a stlačením Shift + F6.

Po spustení bude akcia premenovania vykonaná vyhľadajte v celom kóde každé použitie prvku a potom ich zmeňte pomocou poskytnutej hodnoty.

Poďme si predstaviť a SimpleClass trieda so zle pomenovanou metódou sčítania, someAdditionMethod, privolaný do hlavný metóda:

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

Ak sa teda rozhodneme túto metódu premenovať na pridať, IntelliJ vyprodukuje nasledujúci kód:

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

2.2. Pokročilé premenovanie

IntelliJ však robí viac než hľadanie kódových zvyklostí našich prvkov a ich premenovanie. V skutočnosti je k dispozícii ešte niekoľko ďalších možností. IntelliJ tiež môže vyhľadávať výskyty v komentároch a reťazcoch a dokonca aj v súboroch, ktoré neobsahujú zdrojový kód. Pokiaľ ide o parametre, môže ich v prípade prepísaných metód premenovať v hierarchii tried.

Tieto možnosti sú dostupné kliknutím Shift + F6 ešte raz pred premenovaním nášho prvku a objaví sa vyskakovacie okno:

The Hľadajte v komentároch a reťazcoch možnosť je k dispozícii pre každé premenovanie. Pokiaľ ide o Vyhľadajte výskyty textu nie je k dispozícii pre parametre metódy a miestne premenné. Nakoniec Premenujte parametre v hierarchii možnosť je k dispozícii iba pre parametre metódy.

Takže ak sa nájde nejaká zhoda s jednou z týchto dvoch možností, IntelliJ ich zobrazí a ponúkne nám možnosť zrušiť niektoré zo zmien (povedzme, v prípade, že sa to zhoduje s niečím, čo nesúvisí s našim premenovaním).

Pridajme k našej metóde Javadoc a potom premenujme jeho prvý parameter, a:

/ ** * Pridá a a b * @param a prvé číslo * @param b druhé číslo * / public int pridať (int a, int b) {...}

Zaškrtnutím prvej možnosti v potvrdzovacom vyskakovacom okne IntelliJ porovnáva všetky zmienky o parametroch v komentári k metóde Javadoc a ponúka ich tiež premenovanie:

/ ** * Pridá firstNumber a b * @param firstNumber prvé číslo * @param b druhé číslo * / public int pridať (int firstNumber, int b) {...}

Na záver si to musíme všimnúť IntelliJ je inteligentný a vyhľadáva väčšinou využitie v rozsahu premenovaného prvku. V našom prípade by to znamenalo, že komentár sa nachádza mimo metódy (okrem Javadocu) a obsahuje zmienku o a nebolo by možné uvažovať o premenovaní.

3. Extrahovanie

Teraz si povieme niečo o ťažbe. Extrakcia nám umožňuje získať kúsok kódu a vložiť ho do premennej, metódy alebo dokonca triedy. IntelliJ to zvláda dosť chytro, pretože vyhľadáva podobné časti kódu a ponúka ich extrahovanie rovnakým spôsobom.

V tejto časti sa teda dozvieme, ako využiť funkciu extrakcie, ktorú ponúka IntelliJ.

3.1. Premenné

Najprv začnime s extrakciou premenných. To znamená lokálne premenné, parametre, polia a konštanty. Ak chcete extrahovať premennú, musíme postupovať podľa týchto krokov:

  • Vyberte výraz, ktorý zapadá do premennej
  • Kliknite pravým tlačidlom myši na vybratú oblasť
  • Spustiť Refactor> Extract> Variable / Parameter / Field / Constant možnosť
  • Vyberte si medzi Nahraďte iba tento výskyt alebo Nahraďte všetkých výskytov x možnosti, ak sú navrhnuté
  • Zadajte názov extrahovaného výrazu (ak sa nám vybraný nevyhovuje)
  • Stlačte Zadajte

Pokiaľ ide o premenovanie, namiesto ponuky je možné použiť klávesové skratky. Predvolené skratky sú Ctrl + Alt + V, Ctrl + Alt + P, Ctrl + Alt + F a Ctrl + Alt + C.

IntelliJ sa pokúsi uhádnuť názov nášho extrahovaného výrazu na základe toho, čo výraz vráti. Ak to nezodpovedá našim potrebám, môžeme to pred potvrdením extrakcie zmeniť.

Poďme si to ilustrovať na príklade. Vedeli by sme si predstaviť, že by sme do našej pridali metódu SimpleClass trieda, ktorá nám hovorí, či je aktuálny dátum medzi dvoma danými dátumami:

public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {return LocalDate.now (). isAfter (startingDate) && LocalDate.now (). isBefore (endsDate); }

Povedzme, že chceme zmeniť našu implementáciu, pretože používame LocalDate.now () dvakrát a chceli by sme sa uistiť, že má v obidvoch hodnoteniach úplne rovnakú hodnotu. Vyberme výraz a extrahujme ho v lokálnej premennej, teraz:

Potom, náš LocalDate.now () hovor je zachytený v lokálnej premennej:

public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {LocalDate now = LocalDate.now (); návrat now.isAfter (počiatočný dátum) && now.isBefore (koncový dátum); }

Zaškrtnutím Nahradiť všetko možnosť sme sa uistili, že oba výrazy boli nahradené naraz.

3.2. Metódy

Poďme teraz skontrolovať, ako extrahovať metódy pomocou IntelliJ:

  • Vyberte výraz alebo riadky kódu zodpovedajúce metóde, ktorú chceme vytvoriť
  • Kliknite pravým tlačidlom myši na vybratú oblasť
  • Spustiť Refaktor> Extrahovať> Metóda možnosť
  • Zadajte informácie o metóde: jej názov, viditeľnosť a parametre
  • Stlačte Zadajte

Biť Ctrl + Alt + M po výbere metódy funguje aj telo.

Zopakujme si náš predchádzajúci príklad a povedzme, že chceme mať metódu kontroly, či je nejaký dátum medzi inými dátumami. Potom by sme už len museli zvoliť náš posledný riadok v isNowB Between metóda a spustiť funkciu extrakcie metódy.

V otvorenom dialógovom okne vidíme, že IntelliJ už zaznamenal tri potrebné parametre: dátum začatia, koncový dátum a teraz. Pretože chceme, aby bola táto metóda čo najobecnejšia, premenujeme teraz parameter do dátum. A z dôvodu súdržnosti ho umiestňujeme ako prvý parameter.

Nakoniec našu metódu pomenujeme, isDateB Betweena dokončiť proces extrakcie:

Potom by sme získali nasledujúci kód:

public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {LocalDate now = LocalDate.now (); return isDateB Between (now, startingDate, endsDate); } private static boolean isDateB Between (LocalDate date, LocalDate startingDate, LocalDate endsDate) {return date.isBefore (endsDate) && date.isAfter (startingDate); }

Ako vidíme, akcia spustila vytvorenie nového isDateB Between metóda, ktorá sa nazýva aj v isNowB Between metóda. Táto metóda je predvolene súkromná. To sa samozrejme dalo zmeniť pomocou možnosti viditeľnosti.

3.3. Triedy

Po tom všetkom by sme možno chceli dostať naše metódy súvisiace s dátumami do konkrétnej triedy zameranej na správu dátumov, povedzme: DateUtils. Je to opäť celkom jednoduché:

  • Kliknite pravým tlačidlom myši na triedu, ktorá obsahuje naše prvky, ktoré chceme presunúť
  • Spustiť Refaktor> Extrahovať> Delegovať možnosť
  • Zadajte informácie o triede: jej názov, jej balík, prvky, ktoré sa majú delegovať, viditeľnosť týchto prvkov
  • Stlačte Zadajte

V predvolenom nastavení nie je pre túto funkciu k dispozícii žiadna klávesová skratka.

Povedzme, pred spustením tejto funkcie, ktorú zavoláme naše metódy súvisiace s dátumom v hlavný metóda:

isNowB Between (LocalDate.MIN, LocalDate.MAX); isDateB Between (LocalDate.of (2019, 1, 1), LocalDate.MIN, LocalDate.MAX);

Potom tieto dve metódy delegujeme na a DateUtils triedy pomocou možnosti delegáta:

Spustením funkcie by sa vytvoril nasledujúci kód:

verejná trieda DateUtils {public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {LocalDate now = LocalDate.now (); return isDateB Between (now, startingDate, endsDate); } public static boolean isDateB Between (LocalDate date, LocalDate startingDate, LocalDate endsDate) {return date.isBefore (endsDate) && date.isAfter (startingDate); }}

Môžeme vidieť, že isDateB Between bola vykonaná metóda verejné. To je výsledok možnosti viditeľnosti, ktorá je nastavená na stupňovať predvolene. Stupňovať znamená, že viditeľnosť sa zmení nazabezpečiť, aby sa súčasné hovory na delegované prvky stále zostavovali.

V našom prípade isDateB Between sa používa v hlavný metóda SimpleClass:

DateUtils.isNowB Between (LocalDate.MIN, LocalDate.MAX); DateUtils.isDateB Between (LocalDate.of (2019, 1, 1), LocalDate.MIN, LocalDate.MAX);

Pri presune metódy je preto potrebné urobiť ju neverejnou.

Je však možné konkrétnym spôsobom zviditeľniť naše prvky výberom ďalších možností.

4. Inlining

Teraz, keď sme sa zaoberali extrakciou, poďme si povedať o jej náprotivku: inlining. Pri vložení ide o to, vziať prvok kódu a nahradiť ho tým, z čoho je vyrobený. Pre premennú by to bol výraz, ktorému bol priradený. Pre metódu by to bolo jej telo. Predtým sme videli, ako vytvoriť novú triedu a delegovať na ňu niektoré naše prvky kódu. Ale sú chvíle možno budeme chcieť delegovať metódu na existujúcu triedu. O tom je táto časť.

Na vloženie prvku musíme kliknúť pravým tlačidlom myši na tento prvok - buď jeho definíciu, alebo odkaz na ňu - a spustiť prvok Refaktor>V rade možnosť. To môžeme dosiahnuť aj výberom prvku a stlačením klávesu Ctrl + Alt + N kľúče.

V tomto okamihu nám IntelliJ ponúkne niekoľko možností, či už chceme vložiť premennú alebo metódu, či už sme vybrali definíciu alebo odkaz. Tieto možnosti sú:

  • Vložte všetky odkazy a odstráňte prvok
  • Vložte všetky odkazy, ale prvok ponechajte
  • Zarovnajte iba vybraný odkaz a ponechajte prvok

Zoberme si naše isNowB Between metóda a zbaviť sa teraz premenná, ktorá sa teraz zdá byť trochu prehnaná:

Vložením tejto premennej by sme dosiahli nasledujúci výsledok:

public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {return isDateB Between (LocalDate.now (), startingDate, endsDate); }

V našom prípade bolo jedinou možnosťou odstránenie všetkých odkazov a odstránenie prvku. Poďme si však predstaviť, že sa tiež chceme zbaviť isDateB Between volať a zvoliť vloženie. Potom by nám IntelliJ ponúkol tri možnosti, o ktorých sme hovorili predtým:

Výber prvého by nahradil všetky volania telom metódy a odstránil by metódu. Pokiaľ ide o druhú, nahradila by všetky volania telom metódy, ale metódu by ponechala. A nakoniec, posledný by iba nahradil súčasné volanie telom metódy:

verejná trieda DateUtils {public static boolean isNowB Between (LocalDate startingDate, LocalDate endsDate) {LocalDate date = LocalDate.now (); dátum návratu.isBefore (koncový dátum) && date.isAfter (počiatočný dátum); } public static boolean isDateB Between (LocalDate date, LocalDate startingDate, LocalDate endsDate) {return date.isBefore (endsDate) && date.isAfter (startingDate); }}

Náš hlavný metóda v SimpleClass zostáva tiež nedotknutá.

5. Sťahovanie

Predtým sme videli, ako vytvoriť novú triedu a delegovať na ňu niektoré naše prvky kódu. Ale sú chvíle možno budeme chcieť delegovať metódu na existujúcu triedu. O tom je táto časť.

Ak chcete presunúť prvok, musíme postupovať podľa týchto krokov:

  • Vyberte prvok, ktorý chcete presunúť
  • Kliknite pravým tlačidlom myši na prvok
  • Spustiť Refaktor> Presunúť možnosť
  • Vyberte triedu príjemcu a viditeľnosť metódy
  • Stlačte Zadajte

To môžeme dosiahnuť aj lisovaním F6 po výbere prvku.

Povedzme, že do našej pridáme novú metódu SimpleClass, isDateOutstide (), ktoré nám povedia, či je dátum mimo intervalu dátumov:

public static boolean isDateOutside (LocalDate date, LocalDate startingDate, LocalDate endsDate) {return! DateUtils.isDateB Between (date, StartingDate, EndingDate); }

Potom si uvedomíme, že jeho miesto by malo byť v našom DateUtils trieda. Rozhodli sme sa to teda presunúť:

Naša metóda je teraz v DateUtils trieda. Vidíme, že odkaz na DateUtils vo vnútri metódy zmizla, pretože už nie je potrebná:

public static boolean isDateOutside (LocalDate date, LocalDate startingDate, LocalDate endsDate) {return! isDateB Between (date, startingDate, endsDate); }

Príklad, ktorý sme práve vytvorili, funguje dobre, pretože sa týka statickej metódy. V prípade inštančnej metódy však veci nie sú také jednoznačné.

Ak chceme presunúť inštančnú metódu, IntelliJ vyhľadá triedy, na ktoré sa odkazuje v poliach aktuálnej triedy, a ponúkne presunutie metódy do jednej z týchto tried (za predpokladu, že ich upravujeme).

Ak v poliach nie je uvedená žiadna modifikovateľná trieda, potom IntelliJ navrhuje vytvorenie metódy statický pred premiestnením.

6. Zmena podpisu metódy

Na záver si povieme niečo o funkcii, ktorá nám umožňuje zmeniť podpis metódy. Účelom tejto funkcie je manipulovať s každým aspektom podpisu metódy.

Ako obvykle musíme túto funkciu spustiť niekoľkými krokmi:

  • Vyberte metódu, ktorú chcete zmeniť
  • Pravým tlačidlom myši kliknite na metódu
  • Spustiť Refaktor> Zmeniť podpis možnosť
  • Priniesť zmeny do podpisu metódy
  • Stlačte Zadajte

Ak uprednostňujeme klávesovú skratku, je možné použiť Ctrl + F6 tiež.

Táto funkcia otvorí dialógové okno veľmi podobné funkcii extrakcie metód. A tak máme rovnaké možnosti ako pri extrakcii metódy: zmena názvu, viditeľnosti a tiež pridanie / odstránenie parametrov a ich jemné doladenie.

Poďme si predstaviť, že chceme zmeniť našu implementáciu isDateB Between považovať hranice dátumu za inkluzívne alebo exkluzívne. Za týmto účelom chceme pridať a boolovský parameter našej metódy:

Zmenou podpisu metódy môžeme pridať tento parameter, pomenovať ho a dať mu predvolenú hodnotu:

public static boolean isDateB Between (LocalDate date, LocalDate startingDate, LocalDate endsDate, boolean inclusive) {return date.isBefore (endsDate) && date.isAfter (startingDate); }

Potom už len musíme prispôsobiť telo metódy podľa našich potrieb.

Keby sme chceli, mohli sme skontrolovať Delegovať pomocou metódy preťaženia možnosť s cieľom vytvoriť inú metódu s parametrom namiesto úpravy súčasnej.

7. Potiahnite hore a stlačte dole

Náš kód Java má zvyčajne hierarchie tried - odvodené triedy rozširujú základnú triedu.

Niekedy chceme medzi týmito triedami presúvať členov (metódy, polia a konštanty). Tam prichádza vhod posledné refaktorovanie: umožňuje nám to vytiahnuť členov z odvodenej triedy do základnej triedy alebo ich vytlačiť zo základnej triedy do každej odvodenej triedy.

7.1. Vytiahni

Najskôr vytiahnime metódu do základnej triedy:

  • Vyberte člena odvodenej triedy, ktorého chcete vytiahnuť
  • Kliknite pravým tlačidlom myši na člena
  • Spustiť Refaktor> Vytiahnuť členov hore ... možnosť
  • Zatlačte na Refaktor tlačidlo

V predvolenom nastavení nie je pre túto funkciu k dispozícii žiadna klávesová skratka.

Povedzme, že máme odvodenú triedu s názvom Odvodené. Používa súkromné doubleValue () metóda:

public class Derived extends Base {public static void main (String [] args) {Derived subject = new Derived (); System.out.println ("Zdvojnásobenie 21. Výsledok:" + subject.doubleValue (21)); } private int doubleValue (int číslo) {návratové číslo + číslo; }}

Základná trieda Základňa je prázdny.

Čo sa teda stane, keď zastavíme doubleValue () do Základňa?

Stali sa dve veci doubleValue () keď stlačíme „Refactor“ vo vyššie uvedenom dialógovom okne:

  • presunie sa do Základňa trieda
  • jeho viditeľnosť sa mení od súkromné do chránené aby Odvodené trieda to môže stále používať

The Základňa trieda potom má metódu:

public class Base {protected int doubleValue (int number) {return number + number; }}

Dialógové okno na vytiahnutie členov (na obrázku vyššie) nám dáva niekoľko ďalších možností:

  • môžeme vybrať ďalších členov a vytiahnuť ich všetkých naraz
  • môžeme si pozrieť ukážku našich zmien pomocou tlačidla „Náhľad“
  • iba metódy majú začiarkavacie políčko v stĺpci „Vytvoriť abstrakt“. Ak je začiarknuté, táto možnosť poskytne základnej triede abstraktnú definíciu metódy počas načítania. Aktuálna metóda zostane v odvodenej triede, ale získa @ Override anotácia. Následne sa ďalšie odvodené triedy nebudú kompilovať potom preto, lebo im chýba implementácia tejto novej, abstraktnej základnej metódy

7.2. Tlačiť dole

Nakoniec zatlačme člena na odvodenú triedu. Toto je opak toho, čo sme práve predviedli:

  • Vyberte člena základnej triedy, ktorý chcete potlačiť
  • Kliknite pravým tlačidlom myši na člena
  • Spustiť Refaktor> Zatlačte členov dole ... možnosť
  • Zatlačte na Refaktor tlačidlo

Rovnako ako pri vyťahovaní členov nahor, ani pri tejto funkcii nie je v predvolenom nastavení k dispozícii žiadna klávesová skratka.

Opäť stlačíme metódu, ktorú sme práve vytiahli. The Základňa trieda vyzerala na konci predchádzajúcej časti takto:

public class Base {protected int doubleValue (int number) {return number + number; }}

Teraz poďme doubleValue () až do Odvodené trieda:

To je Odvodené triedy po stlačení tlačidla „Refaktor“ vo vyššie uvedenom dialógovom okne.The doubleValue () metóda je späť:

public class Derived extends Base {private int theField = 5; public static void main (String [] args) {Derived subject = new Derived (); System.out.println ("Zdvojnásobenie 21. Výsledok:" + subject.doubleValue (21)); } protected int doubleValue (int number) {návratové číslo + číslo; }}

Teraz obe Základňa triedy a Odvodené triedy sú späť na pôvodnom mieste v predchádzajúcej sekcii „Vyťahovanie“. Takmer to je - doubleValue () ponechal chránené viditeľnosť Základňa (To bolo súkromné pôvodne).

IntelliJ 2019.3.4 skutočne prináša varovanie pri zatlačení dole doubleValue (): „Vynútení členovia nebudú viditeľní z určitých hovorových webov“. Ale ako vidíme v Odvodené trieda vyššie, doubleValue () je skutočne viditeľný pre hlavný() metóda.

Dialógové okno na potlačenie členov (obrázok vyššie) nám tiež poskytuje niekoľko ďalších možností:

  • ak máme viac odvodených tried, potom IntelliJ vtlačí členov do každej odvodenej triedy
  • môžeme stlačiť viacerých členov
  • môžeme si pozrieť ukážku našich zmien pomocou tlačidla „Náhľad“
  • iba metódy majú začiarkavacie políčko v stĺpci „Zachovať abstrakt“ - Je to podobné ako pri získavaní členov: Ak je začiarknuté, táto možnosť ponechá abstraktnú metódu v základnej triede. Na rozdiel od vytiahnutia členov táto voľba vloží implementácie metód do všetkých odvodených tried. Tieto metódy tiež získajú @ Override anotácia

8. Záver

V tomto článku sme mali možnosť hlboko sa ponoriť do niektorých funkcií refaktoringu, ktoré ponúka IntelliJ. Samozrejme sme nepokryli všetky možnosti, pretože IntelliJ je veľmi silný nástroj. Ak sa chcete dozvedieť viac informácií o tomto editore, vždy sa môžeme obrátiť na jeho dokumentáciu.

Videli sme niekoľko vecí, ako napríklad premenovať naše prvky kódu a ako extrahovať určité správanie do premenných, metód alebo tried. Naučili sme sa tiež, ako vložiť niektoré prvky, ak sme ich nepotrebovali samostatne, presunúť nejaký kód inam alebo dokonca úplne zmeniť existujúci podpis metódy.


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