PhpStorm Atunci când IDE-ul contează cu adevărat

Oh, îmi place editorii de text rapid și simplu. Fiind un utilizator Linux, am trăit ani de zile în compania Kate și KWrite. Cu unele trucuri și pluginuri le-aș putea face cu adevărat inteligente. Am scris proiecte întregi în Perl, Bash, și chiar unele PHP și Java în acei editori. Pot să apreciez tot entuziasmul care se desfășoară în jurul textului Sublime sau TextMate, dar nu am putut trăi fără un IDE plin de furie astăzi.

Cultura

Am observat că există două tipuri de programatori. Primul tip are tendința de a utiliza aplicații care pot oferi o productivitate mai mare și mai mare a manipulării codului, dar cu prețul curbei de învățare abrupte și a dificultății de utilizare. Acești programatori sunt cei care preferă Vi (m) sau Emacs.

A doua categorie de programatori tind să migreze de la editori simpli la IDE-uri. Acest lucru este la fel de natural ca o evoluție ca prima categorie. Cu toate acestea, aceasta conduce la o mentalitate diferită și o vedere diferită a proiectului și a codului. Sunt un programator din această categorie, așa că în acest articol vom vorbi despre IDE pe care îl folosesc în acest moment: PhpStorm.

Instrumentele și preferințele utilizatorilor pentru aplicații sunt atât de volatile încât rareori scriu despre un anumit cadru sau o aplicație. Cu toate acestea, dacă folosiți o aplicație de 10-14 ore în fiecare zi, aceasta devine parte din dvs., parte a modului în care vă vedeți codul, proiectele. Se transformă în autostradă pentru fluxul zilnic de lucru. Deci merită să fie menționat și prezentat.


Deci, care este diferența?

Am folosit un editor rapid de text atunci când trebuia să cod doar un script sau un program scurt. Dar nu mai am. Computerele și IDE-urile de astăzi sunt atât de rapide încât există o mică diferență între pornirea PhpStorm și scrierea codului sau pornirea KWrite și scrierea codului. Aplicația în sine este aproape la fel de rapidă ca un editor, iar crearea unui proiect, chiar și pentru unul sau două fișiere reale, nu este nimic mai lent pentru a face aceleași creații de fișiere în editorul dvs..

OK, OK ... Acestea sunt toate asemănările. Dar despre ce este vorba despre IDE? IDE provine din mediul integrat de dezvoltare. Această expresie are două părți cheie: integrat și mediu de dezvoltare. Partea de mediu de dezvoltare poate fi văzută ca editor și caracteristicile specifice pentru manipularea codului sursă: funcții de scriere a codului, evidențiere, auto-completare, caracteristici complexe de editare, cum ar fi multi-select și multi-editare, instrumente de refactoring etc. Partea de integrare poate fi văzută ca integrare între mediul de dezvoltare descris mai sus și diverse instrumente externe, cadrele de testare, sistemul de versiuni a documentelor, instrumentele de depanare și instrumentele UI builder.

Caracteristica cheie a IDE este înțelegerea codului pe care îl scrieți. Un IDE nu are doar o listă de comandă pe care o puteți folosi în limba preferată, cum ar fi PHP. Are algoritmi complexi pentru a înțelege codul. PhpStorm nu vă va sugera o comandă sau o expresie care ar fi incorectă din punct de vedere sintactic. Știe, de exemplu, că nu puteți scrie "print ("Hello World");"direct în interiorul unei clase, fără ao pune într-o funcție, deci nu va sugera"imprimare()"când nu se poate folosi, dar acesta este doar vârful aisbergului. Să vedem câteva exemple mai concrete.


Folosind PhpStorm pentru Seria Tutorial Codul Legacy Refactoring

Da. Dacă ați citit primele două părți ale seriei Codul moștenirii Refactoring, Masterul de aur și Stringurile și constantele magice, este posibil să fi observat că există capturi de ecran afișate în tutorial cu un IDE. Acesta este modul în care arată PhpStorm-ul meu. Iată cum mă ajută PhpStorm, când te înveți să programezi.

Evidențierea codului

Acest lucru este esențial. Majoritatea editorilor simpli pot face, de asemenea, evidențierea codului de bază, dar un IDE este o poveste diferită. Aici puteți avea diferite setări de evidențiere pentru diferite limbi, cum ar fi PHP, HTML, CSS și așa mai departe. Fiecare cu regulile sale proprii. De exemplu, îmi place să am verde șiruri în CSS și portocaliu în PHP și HTML.

În partea stângă, puteți vedea toate tipurile de fișiere și limbile acceptate (unele pot fi adăugate prin pluginuri), în centru puteți vedea diferitele elemente de limbă PHP care pot fi configurate separat, în partea dreaptă sus sunt opțiunile fiecare element poate avea, iar în partea de jos este o previzualizare.

Când vânam niște corzi magice în sesiunea noastră de refăctorizare, am reușit să găsim cu ușurință aceste corzi doar prin găsirea de materiale portocalii pe ecran. Același lucru este valabil și pentru constantele și numerele magice. Când au fost căutați, culoarea albastră era prietenul nostru.

Structura și aspectul sunt esențiale atunci când trebuie să înțelegem codul sursă, iar colorarea și evidențierea corespunzătoare sunt esențiale în această chestiune.

Refactoring Tools Overview

Am folosit numeroase IDE-uri și editoare de-a lungul carierei mele. Cel pe care mi-a plăcut-o și l-am apreciat a fost NetBeans. Dar după aproximativ cinci ani de utilizare exclusivă a NetBeans, a trebuit să renunț la asta. Există ceva ce PhpStorm poate oferi, că nici un alt editor sau IDE pentru PHP nu poate face. Acesta este un set de instrumente de refactorizare care sunt atât de necesare în munca noastră de zi cu zi.

Evidențierea, indentarea, gestionarea proiectelor, șabloanele, macro-urile sunt toate caracteristicile găsite în majoritatea editorilor. Integrarea cu mediile de testare și cu debuganții sunt, prin definiție, parte a oricărui IDE. Cu toate acestea, uneltele de refactorizare inteligente și complexe sunt o poveste complet diferită.

În calitate de programatori, petrecem jumătate din codul nostru de citire a timpului, aproximativ 40% modificând și refăcând codul existent și, dacă suntem norocoși, cu adevărat norocoși, 10% scriind cod complet nou. A avea caracteristici refactorizante bune, rapide și fiabile ne va ajuta să ne concentrăm mai mult eforturile asupra refacerii și mai puțin asupra modului de a face acest lucru. Vom economisi timp, de asemenea, dar consider că câștigul cu mai puțin efort este mult mai important. Când puteți să renunțați la ideea despre proces în IDE și să gândiți doar logica, algoritmul, dependențele, principiile SOLID, este un câștig de productivitate care trebuie luat în considerare.

De aceea am părăsit NetBeans-ul gratuit și open source pentru PhpStorm-ul plătit. Există, în PhpStorm, un set de instrumente de refactorizare care îl fac deosebit, merită să plătească.

Introducerea variabilei locale

Una dintre cele mai simple refactorizări cu care am lucrat deja în Magic Strings & Constants a fost introducerea variabilei locale, cunoscută și sub denumirea de "Variabilă de extragere". Iată un memento cu pașii pe care trebuie să le luăm pentru a folosi acest refactor:

  • Adăugați o variabilă cu valoarea dorită.
  • Găsiți toate utilizările valorii.
  • Înlocuiți toate utilizările cu variabila.

Acești pași sunt ușor de urmărit dacă avem o singură valoare care trebuie transformată într-o variabilă, dar cum rămâne cu pasul doi? Cum găsiți în mod fiabil toate aparițiile acelei valori? Trebuie să analizați codul și să luați decizii conștiente despre ce să înlocuiți și ce nu. Iată un exemplu.

clasa SomeClass function printAPairOfPlayers () echo "Jucătorii sunt:"; echo "Numele jucătorului:". $ This-> getRandomPlayerName (); echo "Numele jucătorului:". $ This-> getRandomPlayerName ();  funcția printOnePlayer () echo "Numele jucătorului:". $ This-> getRandomPlayerName ();  function getRandomPlayerName () // Unele logica pentru a gasi nume de jucatori // retur $ playerName; 

În printAPairOfPlayers () putem observa că șirul "Numele jucatorului: "se repetă de două ori. Dacă vrem să extragem șirul într-o variabilă locală, o variabilă în interiorul funcției, va trebui să înlocuim ambele apariții în printAPairOfPlayers () dar nu și cel din printOnePlayer (). Dacă printOnePlayer () ar fi 100 de linii de mai jos, s-ar putea să nu realizăm că există o altă dublare a șirului într-o altă metodă.

Vrem o variabilă locală. Mai întâi creați variabila, executați testele, apoi căutați șirul și găsiți-l în cel de-al doilea ecou declarații. Îl înlocuim, conducem testele, ne uităm din nou, o găsim în ultima ecou declarație, o înlocuim, executăm testele. Uităm din nou, ajungem la sfârșitul metodei. Decidem că am terminat cu refactorizarea variabilelor locale cu extract. Acesta este un proces cognitiv destul de solicitant, mai ales cu un cod urât și neînțelept.

Nu ar fi util să apăsați o singură comandă rapidă sau să selectați o opțiune dintr-un meniu contextual și să efectuați toate acestea de IDE? Ar fi minunat, iar PhpStorm este capabil să o facă pentru tine.

În codul de mai sus, trebuie doar să poziționați cursorul în "Numele jucatorului: "șir de oriunde și Click dreapta.

După selectarea opțiunii "Variabila extras ... ", PhpStorm vă va analiza codul și va căuta diverse coduri pe care doriți să le extrageți. Va propune două posibilități pentru cazul nostru.

Aceasta nu este doar o trăsătură interesantă, ci una foarte utilă. Există atât de multe cazuri când duplicarea poate apărea în afara câmpului vizual. Atunci când se propune o extracție, analiza este realizată de PhpStorm pe întregul cod, nu doar câteva linii pe care le puteți vedea pe ecran. În acest caz, opțiunile sunt evidente. Pentru exercițiul nostru, să alegem doar partea de șir, fără concatenare.

Acum că piesa de cod pe care dorim să extragem a fost identificată, următorul pas este să-l numim. "playerHeadersString"pare un nume de variabilă sensibilă. Nu trebuie să puneți"$"în fața numelui în câmpul de intrare PhpStorm va pune în cod pentru tine în mod automat Un alt aspect important este că există o casetă de selectare PhpStorm a găsit toate aparițiile pentru variabila noastră Am selectat să extragem o variabilă locală, PhpStorm a știut să caute numai în metoda curentă și a găsit doar două apariții. Același șir din metodă printOnePlayer (), nu a fost numărate și nici nu a fost propusă și nu va fi înlocuită. Asta ar duce la un cod incorect, iar PhpStorm este suficient de inteligent pentru a nu scrie codul nevalid pentru tine.

Mai puțin teste

Un alt avantaj al programului PhpStorm este că nu trebuie să conduceți frecvent testele. Când am făcut un refactor manual, conducem testele după fiecare pas. Dacă am făcut o greșeală sau am înlocuit ceva care am crezut că este același, dar în realitate nu era, aveam nevoie de o plasă de siguranță pentru a ne spune imediat acest lucru. Cu toate acestea, PhpStorm nu va înlocui ceva care nu este logic corect în context. S-ar putea să vă surprindeți că o bucată de cod pe care ați așteptat să o extrageți nu va fi, dar cel puțin veți fi siguri că codul rezultat va fi corect. În plus, avem pași mai puțini. În mod manual, facem doar un singur pas. După acel pas, trebuie să efectuăm testele noastre o singură dată.

Nu contează cum te uiți la ea, este mai ușor, mai rapid și cu mult mai puțin predispusă la erori decât orice alt mod de a face refactorizarea.

Extragerea variabilei de clasă

Pentru a extrage șirul nostru într-o variabilă de clasă - cunoscută și ca câmp de clasă - putem folosi funcția "Extrageți câmpul"opțiunea de refactorizare din același meniu ca mai sus. Vom fi rugați să identificăm codul de care trebuie să extragem și vom fi prezentați cu o formă ușor diferită.

Pe lângă numele său, acum avem trei întâlniri găsite. PhpStorm știa că am vrut o variabilă de clasă și a fost capabilă să identifice același șir atunci când este necesar. De asemenea, avem opțiuni pentru a inițializa variabila în diverse locuri și pentru a-și stabili vizibilitatea. Prin selectarea opțiunilor ca în imagine, codul rezultat va fi la fel ca în cele de mai jos.

Desigur, dacă doriți să fie publică sau inițializată în constructor, tot ce trebuie să faceți este să selectați opțiunile corespunzătoare și să lăsați PhpStorm să lucreze pentru dvs..

Inițializarea variabilei dependente de context

Când extrageți o variabilă, doriți să o inițializați cât mai aproape posibil de prima utilizare a acesteia. În majoritatea cazurilor, acest lucru este simplu, mai ales dacă există o singură utilizare a variabilei. Dar cum rămâne cu cazurile mai complexe? Să revedem una dintre extrasele noastre variabile din Magic Strings & Constants.

În rola () metoda, pe linia 73 - cea selectată - există un număr "11"Este un număr magic pe care tocmai l-am identificat și vrem să-l extragem.

Dacă facem manual metoda extrasului nostru, trebuie să urmați acești pași:

  • Definiți o variabilă chiar deasupra acelei linii cu valoarea 11.
  • Executați testele.
  • Schimbați valoarea cu variabila.
  • Executați testele.
  • Căutați altă apariție a numărului 11.
  • Identificați-o la linia 90.
  • Înlocuiți valoarea cu variabila noastră.
  • Aruncă testele. Ei vor eșua.
  • Întrebați-vă unde să puneți inițializarea variabilei astfel încât să funcționeze și cât mai aproape posibil de utilizarea acesteia.
  • Mutați inițierea variabilei la un nivel în sus.
  • Executați testele. Încă nu reușesc.
  • Mutați inițializarea variabilei cu un nivel mai în sus, în afara tuturor instrucțiunilor if.
  • Executați testele. Ei trec în sfârșit.
  • Căutați alte apariții.
  • Nu mai găsiți. Esti gata.

Acum, acest lucru este complicat pentru un om de a face. Și este predispusă la erori. Am presupus că aveți teste care vă pot ajuta, dar ce se întâmplă dacă lucrați la un cod obscur de netestabil? PhpStorm va înțelege contextul codului dvs. Acesta va extrage corect variabila pentru toate aparițiile și va pune exact unde ar trebui să fie.

Icebergul sub vârful

Ceea ce am prezentat mai sus despre uneltele de refactorizare este doar vârful aisbergului. Extragerea variabilelor este probabil cea mai simplă și mai ușoară refactorizare pe care o puteți face. Încă nu am folosit metoda de extragere sau subclasa extrasă sau chiar niște redenumire mai complexă în lecțiile noastre de refactorizare, dar noi o vom face. Vom învăța cum să le faceți manual, dar vă încurajez să folosiți un smart IDE pentru a vă face treaba.

Redenumire

PhpStorm este foarte bun la redenumirea variabilelor sau a metodelor, chiar peste sute de clase. Imaginați-vă cât de dificil ar fi să schimbați numele unei metode publice utilizate în 100 de clase diferite în proiectul dvs. PhpStorm poate face o slujbă de cinci minute în loc de două ore de muncă. Se poate găsi și schimba numele tuturor metodelor și va trebui doar să verificați meciurile dorite înainte de a le spune să acționeze. 

Da, da ... Veți avea nevoie să verificați unele întâlniri găsite deoarece PHP este un limbaj dinamic și în unele cazuri nu există nici un fel de PhpStorm sau alt algoritm sau program al IDE, poate ști ce tip de obiect este folosit pentru apelul respectiv. Imaginează-ți că ai două clase complet diferite. Pe fiecare dintre ele, aveți o metodă publică numită "Găsiți toate()"Acest lucru este foarte comun și corect. 

De ce trebuie să evaluăm schimbările?

Acum, există 50 de clase care utilizează clasa întâi și încă 50 folosind clasa a doua. Dacă ați utilizat interfețe adecvate și tastați sugestii acolo unde este posibil, PhpStorm va propune schimbarea claselor corecte. Dar dacă nu ați specificat tipul pe care îl utilizați sau nu ați utilizat nici o interfață implementată de clasa dvs. cu Găsiți toate() metodă, nu există nici o modalitate de a spune în mod automat, care dintre cele două clase, ambele având o Găsiți toate() , vor fi utilizate. Aceasta este esența tastării dinamice a PHP. Dar, în timp ce acest lucru este un avantaj în unele cazuri, este un dezavantaj atunci când trebuie să facem refactorizarea așa. Când se întâmplă acest lucru, singurul lucru care se poate face este ca un om să evalueze necesitatea schimbării.

Cu toate acestea, chiar dacă există alte refactorizări prezente în PhpStorm, acesta este deja cel mai bun IDE doar cu refactorizări. Redenumirea, extragerea și inserarea variabilelor, metodele de extragere și inlining sunt cele mai frecvent utilizate refactorizări pe care le facem în fiecare zi. Dacă acestea funcționează bine, avem un IDE câștigător.

Dar PhpStorm nu se oprește aici. Are multe alte instrumente de refactorizare care vă fac să vă simțiți bine în situații dificile. Cu adevărat,cires pe partea de sus"senzație.


Testarea și acoperirea codului

Tu faci TDD, nu? Dacă nu, ar trebui. Testarea este la fel de esențială pentru programarea ca scrierea codului de producție în sine. Nu mi-am putut imagina viața fără TDD. M-am obișnuit cu asta în ultimii câțiva ani, și chiar dacă mă gândesc la cod, fără să mă gândesc la teste, se simte nenatural și dificil.

Testarea și IDE-urile

Cu testarea, procesul și instrumentele trebuie să fie la fel de bune ca și codul de producție. PhpStorm are o mare integrare cu PHPUnit. Acesta este singurul IDE PHP pe care îl știu de fapt că face legătura directă cu cadrul PHPUnit, îl extinde și îl utilizează pentru a aduna toate informațiile care trebuie prezentate. Aceasta oferă o conexiune mult mai intimă cu PHPUnit, o ieșire mai bună pentru utilizator și viteze de rulare mult mai ridicate.

Alte IDE tind să utilizeze doar executabilul PHPUnit, să scrie rezultatul într-un fișier XML și să interpreteze rezultatele pentru a-ți arăta. Acesta este modul în care funcționează NetBeans. Această abordare oferă o flexibilitate mai mare pentru dvs., dacă doriți să hackați sistemul și să îl convingeți să ruleze testele dvs. în moduri neobișnuite (de exemplu, prin telnet sau SSH). Dar acest lucru are și un dezavantaj uriaș. Lucrurile devin lente. Mai întâi de toate, un proces de shell trebuie să fie forked. "exec ()"este întotdeauna un consumator de timp important, apoi rezultatul trebuie scris într-un fișier, eventual pe o mașină la distanță. 

Știm cu toții că sistemul de fișiere este lent, foarte lent. SSD-urile o fac puțin mai bine, dar sunt încă departe de viteza RAM. Apoi, dacă executăm testele de la distanță, trebuie să copiem fișierul pe mașina noastră. Deci, nu numai că trebuie să lăsăm sistemul de fișiere o dată, ci și să adăugăm la acel moment, costul comunicării în rețea, plus scrierea acestuia într-un fișier local. Apoi fișierul trebuie citit înapoi, astfel încât acesta să poată fi prezentat în final utilizatorului.

În timp ce aceasta este o soluție super personalizabilă și flexibilă, este nevoie de timp. Prea mult timp când ne gândim la teste unitare și teste milisecunde. Testele de unitate care durează mai mult de cinci milisecunde pentru a rula nu mai sunt teste unitare.

PhpStorm utilizează PHPUnit intern

PhpStorm rezolvă, sau cel puțin reduce, cheltuielile generale prin utilizarea PHPUnit intern și spunându-i să producă rezultatul în modul preferat de PhpStorm. Acest lucru reduce flexibilitatea. Nu poți să-l pui la încercare în afara limitelor sale. Dar, crește viteza foarte mult. Nu mai Exec, nu mai fișiere scrise la sistemele de fișiere lent. Executarea de la distanță poate adăuga prețul de comunicare în rețea, dar nu putem elimina asta oricum. Un alt avantaj plăcut este că utilizarea directă a PHPUnit permite prezentarea mai detaliată a informațiilor despre testele eșuate într-un mod mai organizat. Așadar, câștigăm pe viteză, detalii și claritate, cu prețul flexibilității.

Fiind obișnuit cu NetBeans, mi-a fost greu la început să accept această inflexibilitate, dar, la sfârșitul zilei, chiar dacă uneori trebuie să rulez un script extern pentru a testa codul meu pe mașini la distanță, câștigurile din integrarea mai bună a PHPUnit sunt predominante.


Organizarea și căutarea fișierelor

La fel ca majoritatea IDE-urilor, Phpstorm este, de asemenea, orientat spre proiect. De obicei, într-un proiect puteți avea fișiere sursă și teste. Pe măsură ce funcționează PhpStorm, este necesar să specificați un singur dosar ca dosar pentru teste. Consider că este foarte util să aveți aceeași structură de directoare între codul sursă și codul de testare. Acest lucru ajută, de asemenea, PhpStorm pentru a vă găsi mai ușor testele și vă permite să comutați între codul de producție și testele cu o singură comandă rapidă.

Dar nu este totul. Când vine vorba de găsirea și deschiderea fișierelor, există o caracteristică unică în PhpStorm: Mergeți la Tot (sau Căutați totul) - Îl iubesc absolut pe acesta. Mai întâi de toate, comanda rapidă de la tastatură a lui Shift + Shift (schimbare dublă) este atât de natural de utilizat, în al doilea rând, este cea mai utilă facilitate de navigare. Acesta a fost introdus abia recent, iar înainte de el am avut casete separate de navigare și comenzi rapide pentru deschideți fișierul după nume, deschideți fișierul după numele clasei, deschide fișierul care conține simbolul (numele variabilei sau metodei) și așa mai departe. Acum pot doar dubla mișcarea și începe să scriu. Este uimitor și rapid.


Gândurile finale

Există atât de multe caracteristici interesante în IDE-urile de astăzi încât am putea continua cu această poveste pentru alte trei tutoriale și încă nu le spunem toate acestea. Dar trebuie să ne oprim la un moment dat. Deci, ca un finisher minunat pentru mini-maratonul nostru de caracteristici PHPUnit în cadrul PhpStorm, iată câteva dintre ultimele pe care colegii mei și cu mine la Syneto aprecieză:

  • Șabloane live - ele sunt minunate pentru a scrie pe placa de bilete pentru tine. De exemplu, când scriu aceste tutoriale în HTML, trebuie să respect un anumit set de etichete și formatare. Am șabloane mici care pot scrie asta pentru mine, astfel încât timpul petrecut pentru a adăuga o imagine la tutorial, de exemplu, este redus la aproximativ timpul necesar pentru a lovi cheile, în loc să scrie toată sintaxa imaginii și stilul.
  • Management de proiect - acest lucru este destul de comun în IDE-uri. Toate fișierele sunt organizate în proiecte. Dar programatorii de la JetBrains au făcut ceva foarte uimitor. Motorul lor de indexare este rapid ca naiba. Niciun alt IDE nu a putut încărca atât de repede proiectul nostru imens la Syneto și apoi să-l caute atât de repede. De fapt, IDE-uri precum NetBeans sau Eclipse și derivatele sale nu au reușit să indice întregul proiect. Asta a făcut căutarea foarte lentă. PhpStorm face acest lucru și lucrurile sunt rapide în comparație cu orice alt IDE.
  • Integrarea versiunilor de documente - este o altă bijuterie în sac. Mercurial, Git, CVS, Subversiune, îl numiți. PhpStorm se simte ca acasă cu toți. De la comiterea selectivă și împingeți-o pe fuzionarea avansată, cu un instrument de diff și combinare excelent, pentru a filă în ramificație, aveți tot ce aveți nevoie. Deoarece am folosit PhpStorm, am folosit CLI pentru a emite un "hg"comanda probabil de două ori sau cam asa ceva doar lucrări.
  • macrocomenzi - sunt utile pentru acele mici sarcini repetitive enervante pe care trebuie să le faceți. În PHP, fiecare linie trebuie să se încheie cu un punct și virgulă. Cât de des este cursorul dvs. la sfârșitul liniei când ați terminat să scrieți tot codul în el? Foarte rar. De cele mai multe ori, vă aflați în interiorul unor paranteze care completează parametri sau similare. Trebuie să mergeți la capătul liniei și să apăsați pe ";"Aceasta este ușor de automatizat prin macrocomenzi.

Bine, vorbește destul. Acum te las să pleci, să descarci și să încerci singur PhpStorm. A se distra.

Cod