V minulém díle seriálu o efektivní práci s PhpStormem jsme si ukázali několik tipů a triků pro práci s textem. Doufám, že od té doby alespoň některé z nich používáte. Dneska se podíváme na zoubek vlastnostem, které automatizují úpravy kódu a využívají toho, že PhpStorm chápe kontext jazyka, ve kterém momentálně píšeme – ať se jedná o PHP, HTML, Javascript nebo SQL.
Code completion a automatické úpravy v kódu
Vlastnosti, které jsem zmiňoval v minulém díle, využijete i při psaní běžného textu nebo HTML. Kromě toho ale PhpStorm exceluje především v pochopení kódu. Napovídání je samo o sobě na velmi vysoké úrovni a mnohdy vás překvapí, co všechno dokáže z kódu vyčíst. Navíc mu můžete napovědět pomocí PHPDoc komentářů. Typickým příkladem jsou magické metody a proměnné. Například komentář třídy /** @property Element_Text $name */
zajistí, že $this->name
bude mít doplňování pro Element_Text
. A to i v případě, že taková proměnná v objektu vůbec neexistuje a používá se magická metoda __get()
.
Pokud jste kdy pracovali v Eclipse, tak možná znáte overwrite a insert mód pro Code Completion. Tedy pokud vám IDE nabídne doplnění právě psaného kódu, tak jestli nabídnutý text vloží nebo jím nahradí následující text. V PhpStormu budete toto nastavení hledat marně. Místo toho existuje na každou věc zvláštní zkratka – Enter
funguje jako insert a Tab
funguje jako overwrite.
Další skvělou věcí, kterou je možné využívat, jsou Intentions (Alt+Enter
) – taková ta malá žárovička, která se tu a tam objeví. Seznam všech možných věcí, které se dají přes Intentions změnit, najdete v Settings. Je jich opravdu spousta a u mnoha z nich byste ani nečekali, že existují (např. Simplify boolean expression).
Aby fungovaly veškeré funkce související s Code Completion, je ale třeba, aby PhpStorm věděl, v kontextu jakého jazyka momentálně pracujete. Ve výchozím stavu se řídí podle přípon souborů. Konfiguraci naleznete v nastavení pod File Types. Na tom by nebylo nic zajímavého, ale PhpStorm dokáže kontext přepnout i v rámci souboru. Říkají tomu Language Injection. Díky tomu se dá například uvnitř stringu napovědět IDE, že se jedná o kus JavaScriptu. Napovědět kontext můžete buď pomocí Intention, nebo prostě vhodným pojmenováním. Tuto funkci nejraději používám na automatické rozpoznání kontextu při použití HEREDOC/NOWDOC. Delší kus JS, který nemůže zrovna být v samostatném souboru, vepíšu do bloku. Ten je uvozený názvem kontextu, tedy např. <<<JS
, <<<SQL
nebo <<<HTML
, a napovídání daného jazyka je ihned automaticky dostupné. V Settings nastavení najdete jako Language Injection a můžete si tam také přidat vlastní prefixy.
Shrnutí
- Naučte se využívat Insert/Overwrite completion
- Intentions (
Alt+Enter
) vám ušetří spoustu psaní - Lanaguage injection vám umožňuje využít zvýrazňování jazyka v rámci stringu a dá se zapnout pomocí Intention
Refaktoring a pokročilé manipulace s kódem
Často se mi stává, že když píšu nějakou složitější business logiku, tak už mi nezbývá mentální kapacita na to, abych si hlídal kvalitu a čitelnost kódu. Když pak kód dopíšu, tak zjistím, že je plný $i
, $var
, $data
, $items
, magických konstant if ($id == 4)
a tak podobně. Proto jsem si zvykl po sobě kód projít a popřejmenovávat a zrefaktorovat, co se dá. Je to méně práce, než byste si mysleli. Pojďme se podívat jak na to.
První funkcí, která pomáhá při refaktoringu, je Rename (Alt+Shift+R
). Je dobré si ho zvyknout používat na jakékoli přejmenovávání. Funguje napříč jazyky a v těch, kterým rozumí, se chová inteligentně a vyhledává i všechna možná použití. Dají se s ním přejmenovávat parametry metod, proměnné, metody i třídy. Typicky tuto funkci používám na přejmenovávání různých $id
parametrů na popisnější varianty $productPhotoId
a tak podobně.
Další funkcí, která je k nezaplacení, je Extract/Inline variable (Alt+Shift+L
, Alt+Shift+I
), která umožňuje vyextrahovat kus kódu do proměnné. Nejprve vám dá na výběr, jak velkou část chcete do proměnné vytáhnout (podobně jako Extend Selection), a pak z ní udělá lokální proměnnou. Typickým příkladem použití je refaktoring ve sprintf
. Na začátku má jen jeden parametr, ale postupně přidáte další dva a v tu chvíli přestane být přehledné, kde končí sprintf
a kde volání metody a které parametry jsou u sprintf
a které u metody. Pomocí Extract variable si třeba jednotlivé parametry sprintf
vytáhnete do proměnné – dokonce pokud stejnou konstrukci používáte na více místech, tak ji to umí nahradit všude. Mimo Extract variable jsou k dispozici i další verze pro extrahování metody, konstanty, atributu, parametru nebo interface. Zajímavá je i funkce Pull Members Up/Push Members Down, kterou můžete přehazovat implementaci metod v rámci hierarchie tříd. Máte konkrétní třídu a do ní přidáte metodu. Potom si ale uvědomíte, že by se hodilo ji mít už v abstraktním předkovi – stačí použít Pull Members Up a nechat si ji přesunout do předka. Všechny tyto věci najdete v kontextovém menu pod položkou Refactor. V případě Extract/Inline variable doporučuji mít nastavenou klávesovou zkratku, protože se to díky tomu naučíte používat častěji.
Pokud často píšete kód s constructor dependency injection, tak se vám bude hodit funkce Create Constructor, kterou vyvoláte pomocí menu Generate (Alt + Insert
). Ta automaticky vygeneruje konstruktor, který naplní vámi vybrané atributy. Případně naopak – pokud si napíšete konstruktor, který má několik parametrů, tak si pomocí Intention Initialize field můžete nechat vygenerovat atributy.
Velmi podobně funguje automatické generování getterů a setterů, kde máte navíc na výběr mezi normálním a fluent setterem.
Poslední položkou v kategorii vytváření kódu je Override Method – ta umožňuje vybrat metody v rodičovské třídě a nechat si je přetížit i s parametry do třídy zděděné. Používám to relativně málo, ale hodí se vědět, že to existuje.
Shrnutí
- Přejmenovávejte pomocí Rename
- Pomocí Extract Variable a Inline Variable snadno zvýšíte čitelnost kódu
- Inicialize field a Generate constructor vám ušetří psaní
Barevné schéma
Nebylo těch informací na vás už trochu moc? Pojďme to trochu odlehčit a popovídat si o barevném schématu. Už od doby Eclipse používám vlastní barevné schéma Grenadine, které si bere hodně z výchozího nastavení Sublime, ale je upravené pro lepší čitelnost. Už několikrát jsem se pokusil přejít na vychvalované Solarized, ale vždycky jsem se musel vrátit kvůli nedostatečnému kontrastu. Všechny ukázky tady ho používají, takže pokud se vám líbí, tak ho můžete zkusit taky. Případně mi pošlete pull-request, pokud se vám podaří opravit nějaký bug. V Settings barevné schéma najdete pod Color & Fonts. Nainstalujete ho tak, že ho nakopírujete do ~/.WebIde100/config/colors
(připadně jiná složka podle verze PhpStormu).
Panely
Doufám, že vás lehčí téma dostatečně uvolnilo a připravilo na trochu radikální myšlenku, která teď přijde. Skryjte si panely u editoru a přestaňte je používat. V nastavení to najdete pod Tab Appearance -> Placement -> None
. Pokud jste jako já zvyklí používat spoustu panelů a zvládáte se v nich orientovat, tak vám může tahle rada připadat jako naprostá pitomost. Ale dejte tomu šanci. Když jsem přemýšlel nad tím, jak používám panely, primárně jsem je měl na přepínání posledních dvou otevřených souborů (přes Ctrl+Tab
) a pak jako takový „index“ posledních použitých souborů. Pro tohle použití jsou ale panely naprosto nevhodné UI. Jakékoli hledání ve více než 3 panelech je neefektivní, protože je stejně musíte procházet sekvenčně. Místo panelů doporučuji používat Recent Files (Ctrl+E
). Zobrazí se seznam posledních použitých souborů a předvybraný je ten, se kterým jste pracovali naposled. Krom toho se v dialogu dá psaním vyhledávat. Neocenitelné je to ve chvílích, kdy editujete soubory s generickými názvy (index.twig
). Typicky jich mám v projektu desítky (pro každý controller jeden). Hledání v nich ulehčí Search Everywhere, jak jsme si ukazovali v minulém díle. Pokud jste ale soubor měli otevřený před chvilkou, tak ho přes Recent Files najdete hned. V mém případě byl přechod až nečekaně lehký.
Shrnutí
Ctrl+E
na hledání posledních použitých souborů- Vypněte si panely
Závěr
Tentokrát jsme si ukázali, jak PhpStorm umí pracovat s kódem, kterému rozumí. Věřím tomu, že když začnete používat Rename a Extract/Inline variable, tak se prakticky okamžitě zlěpší čitelnost vašeho kódu. Po dopsání feature si stačí udělat diff v Gitu a přečíst si ho. Pokud někde vidíte nějakou složitou konstrukci, tak ji zjednodušte vyextrahováním proměnné nebo metody, případě přejmenováním na popisnější název. Navíc čím zažitější ty příkazy budete mít, tím více to budete dělat průběžně při psaní.
Pokud používáte nějaké další funkce, o kterých jsem se nezmínil, určitě se podělte s ostatními v komentářích. A v příštím díle se podrobněji podíváme na práci s verzováním a formátováním kódu. Také si ukážeme, jak v PhpStormu snadno nastavit debugger.