PhpStorm quando l'IDE conta davvero

Oh, adoro gli editor di testo veloci e semplici. Essendo un utente Linux, ho vissuto anni in compagnia di Kate e KWrite. Con alcune modifiche e plugin potrei renderli davvero intelligenti. Ho scritto interi progetti in Perl, Bash e anche alcuni PHP e Java in quegli editor. Posso apprezzare tutto l'entusiasmo che circonda Sublime Text o TextMate, ma oggi non potrei vivere senza un IDE in piena regola.

La cultura

Ho osservato che ci sono due tipi di programmatori. Il primo tipo ha la tendenza a utilizzare applicazioni in grado di offrire una maggiore e maggiore produttività della manipolazione del codice, ma al costo della brusca curva di apprendimento e della difficoltà di utilizzo. Questi programmatori sono quelli che preferiscono Vi (m) o Emacs.

La seconda categoria di programmatori tende a migrare da semplici editor agli IDE. Questo è naturale per un'evoluzione come prima categoria. Tuttavia, porta a una diversa mentalità e una diversa visione del progetto e del codice. Sono un programmatore di questa categoria, quindi in questo articolo parleremo dell'IDE che uso al momento: PhpStorm.

Gli strumenti e le preferenze utente per le applicazioni sono così volatili che raramente scrivo su un framework o un'applicazione specifica. Tuttavia, se utilizzi un'applicazione 10-14 ore al giorno, diventa parte di te, parte di come vedi il tuo codice, i tuoi progetti. Diventa l'autostrada per il tuo flusso di lavoro quotidiano. Quindi merita di essere menzionato e presentato.


Quindi, qual è la differenza?

Ero solito pubblicare un veloce editor di testo quando avevo bisogno di codificare solo un breve script o programma. Ma non lo faccio più. I computer e gli IDE di oggi sono così veloci che c'è poca differenza tra l'avvio di PhpStorm e la scrittura del codice o l'avvio di KWrite e la scrittura del codice. L'applicazione stessa è quasi veloce come un editor, e la creazione di un progetto, anche per uno o due file effettivi, non è più lenta se si eseguono le stesse creazioni di file nell'editor.

OK, OK ... Queste sono tutte somiglianze. Ma cos'è questa storia di IDE? L'IDE proviene dall'ambiente di sviluppo integrato. Questa espressione ha due parti chiave: integrato e sviluppo dell'ambiente. La parte dell'ambiente di sviluppo può essere vista come l'editor e le funzionalità specifiche per la manipolazione del codice sorgente: funzionalità di scrittura del codice, evidenziazione, completamento automatico, funzioni di modifica complesse come selezione multipla e modifica multipla, strumenti di refactoring e così via. La parte di integrazione può essere vista come integrazione tra l'ambiente di sviluppo sopra descritto e vari strumenti esterni, framework di test, sistema di controllo delle versioni dei documenti, debugger e strumenti di creazione dell'interfaccia utente.

La caratteristica fondamentale di un IDE è la sua comprensione del codice che scrivi. Un IDE non ha solo un elenco di comandi che puoi usare nella tua lingua preferita, come PHP. Ha algoritmi complessi per capire il tuo codice. PhpStorm non ti suggerirà un comando o un'espressione che sarebbe sintatticamente scorretta. Ad esempio, sa che non puoi scrivere "stampare ('Hello World');"direttamente all'interno di una classe, senza metterlo in una funzione. Quindi non suggerirà il"stampare()"Comanda quando non può essere usato, ma questa è solo la punta dell'iceberg. Vediamo alcuni esempi più concreti.


Utilizzo di PhpStorm per la serie di esercitazioni sui codici legacy di refactoring

Sì. Se hai letto le prime due parti della serie di codici di refactoring Legacy, The Golden Master e Magic Strings & Constants, potresti aver notato che ci sono schermate mostrate nel tutorial con un IDE. Ecco come appare il mio PhpStorm. E il seguito è come PhpStorm mi aiuta, quando ti insegno a programmare.

Evidenziazione del codice

Questo è essenziale. Gli editori più semplici possono anche fare l'evidenziazione di base del codice, ma un IDE è una storia diversa. Qui puoi avere diverse impostazioni di evidenziazione per diversi linguaggi come PHP, HTML, CSS e così via. Ognuno con le proprie regole. Ad esempio, mi piace avere le stringhe verdi in CSS e arancione in PHP e HTML.

Sulla sinistra, puoi vedere tutti i tipi di file supportati e le lingue (alcuni possono essere aggiunti dai plugin), al centro puoi vedere i vari elementi del linguaggio PHP che possono essere configurati separatamente, in alto a destra ci sono le opzioni ogni elemento può avere, e in fondo c'è un'anteprima.

Quando stavamo cercando le corde magiche nella nostra sessione di refactoring, siamo stati in grado di individuare facilmente queste stringhe semplicemente trovando roba arancione sullo schermo. Lo stesso vale per le costanti e i numeri magici. Quando quelli erano ricercati, il colore blu era nostro amico.

Struttura e layout sono essenziali quando è necessario comprendere il codice sorgente e in questa materia è essenziale colorare e evidenziare correttamente.

Panoramica sugli strumenti di refactoring

Ho usato molti IDE ed editori per tutta la mia carriera. Quello che mi è veramente piaciuto e apprezzato è NetBeans. Ma dopo circa cinque anni di utilizzo esclusivo di NetBeans, ho dovuto rinunciarci. C'è qualcosa che PhpStorm può offrire, che nessun altro editor o IDE per PHP può fare. Questo è un insieme di strumenti di refactoring che sono così necessari nel nostro lavoro quotidiano.

Evidenziazione, rientri, gestione dei progetti, modelli, macro sono tutte caratteristiche presenti nella maggior parte degli editori. Le integrazioni con ambienti di test e debugger sono per definizione parte di qualsiasi IDE. Tuttavia, gli strumenti di refactoring intelligenti e complessi sono una storia completamente diversa.

Come programmatori, dedichiamo metà del nostro tempo a leggere il codice, circa il 40% modifica e refactoring del codice esistente e, se siamo fortunati, davvero fortunati, il 10% scrive un codice totalmente nuovo. Pertanto disporre di funzioni di refactoring efficaci, veloci e affidabili ci consentirà di concentrare maggiormente i nostri sforzi su cosa è il refactoring e meno su come farlo. Risparmieremo anche il tempo, ma considero il guadagno in meno sforzo essere molto più importante. Quando puoi scartare il pensiero sul processo nel tuo IDE e pensare solo alla logica, all'algoritmo, alle dipendenze, ai principi SOLIDI, è un guadagno in produttività che deve essere considerato.

Questo è il motivo per cui ho lasciato i NetBeans liberi e open source per il PhpStorm pagato. C'è, in PhpStorm, un set di strumenti di refactoring che lo rende speciale, vale la pena pagare per.

Introduci la variabile locale

Uno dei più semplici refactoring con cui abbiamo già lavorato in Magic Strings & Constants è stato Introdurre la variabile locale, nota anche come "Extract Variable". Ecco un promemoria con i passaggi che dobbiamo compiere per utilizzare questo refactoring:

  • Aggiungi una variabile con il valore desiderato.
  • Trova tutti gli usi del valore.
  • Sostituisci tutti gli usi con la variabile.

Questi passaggi sono facili da seguire se abbiamo un singolo valore da trasformare in una variabile, ma per quanto riguarda il secondo passaggio? Come trovi in ​​modo affidabile tutte le occorrenze di quel valore? Devi analizzare il tuo codice e prendere decisioni consapevoli su cosa sostituire e cosa no. Ecco un esempio.

class SomeClass function printAPairOfPlayers () echo "I giocatori sono:"; echo "Nome giocatore:". $ This-> getRandomPlayerName (); echo "Nome giocatore:". $ This-> getRandomPlayerName ();  function printOnePlayer () echo "Nome giocatore:". $ This-> getRandomPlayerName ();  function getRandomPlayerName () // Qualche logica per trovare i nomi dei giocatori // return $ playerName; 

Nel printAPairOfPlayers () possiamo osservare che la stringa "Nome del giocatore: "si ripete due volte. Se vogliamo estrarre quella stringa in una variabile locale, una variabile all'interno della funzione, dovremo sostituire entrambe le occorrenze in printAPairOfPlayers () ma non quello in printOnePlayer (). Se printOnePlayer () sarebbero 100 righe sotto, potremmo non renderci conto che esiste un'altra duplicazione della stringa in un altro metodo.

Quindi vogliamo una variabile locale. Per prima cosa creiamo la variabile, eseguiamo i test, poi cerchiamo la stringa e la troviamo nella seconda eco dichiarazioni. Lo sostituiamo, eseguiamo i test, guardiamo di nuovo, lo troviamo nell'ultimo eco dichiarazione, la sostituiamo, eseguiamo i test. Guardiamo di nuovo, raggiungiamo la fine del metodo. Decidiamo di aver finito con il nostro refactoring di estrazione locale variabile. Questo è un processo cognitivo piuttosto impegnativo, specialmente con codice brutto e non ben compreso.

Non sarebbe utile premere una singola scorciatoia o selezionare un'opzione in un menu di scelta rapida e fare tutto questo dall'IDE? Sarebbe fantastico, e PhpStorm è perfettamente in grado di farlo per te.

Nel codice sopra, posiziona il cursore all'interno del "Nome del giocatore: "stringa ovunque e Clic destro.

Dopo aver selezionato "Estrai variabile ... ", PhpStorm analizzerà il tuo codice e cercherà i vari pezzi di codice che potresti voler estrarre e proporrà due possibilità per il nostro caso.

Questa non è solo una funzionalità interessante, ma molto utile. Ci sono così tanti casi in cui la duplicazione può verificarsi al di fuori del tuo campo visivo. Quando viene proposta un'estrazione, PhpStorm esegue l'analisi su tutto il codice, non solo sulle poche righe che puoi vedere sullo schermo. In questo caso, le opzioni sono ovvie. Per il nostro esercizio, selezioniamo solo la parte stringa, senza concatenazione.

Ora che il pezzo di codice che vogliamo estrarre è stato identificato, il prossimo passo è nominarlo. "playerHeadersString"sembra un nome di variabile ragionevole, non devi metterlo"$"davanti al nome nel campo di inserimento PhpStorm lo inserirà automaticamente nel codice Un altro aspetto importante è che c'è una casella di controllo. PhpStorm ha trovato tutte le occorrenze per la nostra variabile. PhpStorm sapeva di cercare solo nel metodo corrente e trovava solo due occorrenze, la stessa stringa nel metodo printOnePlayer (), non è stato conteggiato, né proposto, e non sarà sostituito. Ciò porterebbe a un codice errato e PhpStorm è abbastanza intelligente da non scrivere codice non valido per te.

Meno test

Un altro vantaggio di PhpStorm è che non è necessario eseguire spesso i test. Quando abbiamo effettuato un refactoring manuale, eseguiamo i nostri test dopo ogni passaggio. Se avessimo fatto un refuso o sostituito qualcosa che pensavamo fosse lo stesso, ma in realtà non lo era, avevamo bisogno di una rete di sicurezza per dircelo rapidamente. Tuttavia, PhpStorm non sostituirà qualcosa che non è logicamente corretto nel contesto. Potresti essere sorpreso dal fatto che un pezzo di codice che ti aspetti di estrarre non sarà, ma almeno puoi essere sicuro che il codice risultante sarà corretto. Inoltre, abbiamo meno passaggi. Manualmente, facciamo solo un singolo passo. Dopo questo singolo passo, dobbiamo eseguire i nostri test una sola volta.

Non importa come lo si guarda, è più facile, più veloce e molto meno soggetto a errori rispetto a qualsiasi altro modo di fare il refactoring.

Estrazione della variabile di classe

Per estrarre la nostra stringa in una variabile di classe, nota anche come campo di classe, possiamo usare "Estrai campo"opzione di refactoring dallo stesso menu di cui sopra. Ci verrà chiesto di identificare il pezzo di codice che dobbiamo estrarre e ci verrà presentata una forma leggermente diversa.

Oltre al suo nome, ora abbiamo tre eventi trovati. PhpStorm sapeva che volevamo una variabile di classe ed era in grado di identificare la stessa stringa dove necessario. Abbiamo anche opzioni per inizializzare la variabile in vari luoghi e impostarne la visibilità. Selezionando le opzioni come nell'immagine, il codice risultante sarà il seguente.

Naturalmente, se vuoi che sia pubblico o inizializzato nel costruttore, tutto ciò che devi fare è selezionare le opzioni appropriate e lasciare che PhpStorm faccia il lavoro per te.

Inizializzazione della variabile dipendente dal contesto

Quando si estrae una variabile, si desidera inizializzarla il più vicino possibile al suo primo utilizzo. Nella maggior parte dei casi, questo è semplice, specialmente se c'è un uso singolo della variabile. Ma per quanto riguarda i casi più complessi? Rivisitiamo una delle nostre estensioni variabili da Magic Strings & Constants.

Nel rotolo () metodo, on line 73 - quello selezionato - c'è un numero "11". È un numero magico appena identificato e vogliamo estrarlo.

Se eseguiamo manualmente il nostro metodo di estrazione, dobbiamo seguire questi passaggi:

  • Definisci una variabile appena sopra quella linea con il valore 11.
  • Esegui i test.
  • Sostituisci il valore con la variabile.
  • Esegui i test.
  • Cerca un'altra occorrenza del numero 11.
  • Identificalo alla riga 90.
  • Sostituisci il valore con la nostra variabile.
  • Suonarono i test. Lo faranno fallire.
  • Chiediti dove mettere l'inizializzazione della variabile in modo che funzioni e sia il più vicino possibile al suo utilizzo.
  • Sposta l'inizializzazione della variabile di un livello in alto.
  • Esegui i test. Stanno ancora fallendo.
  • Sposta l'inizializzazione della variabile ancora più in alto, al di fuori di tutte le istruzioni if.
  • Esegui i test. Stanno finalmente passando.
  • Cerchi altre occorrenze.
  • Non trovare più Hai fatto.

Ora, questo è complicato da fare per un umano. Ed è soggetto a errori. Presumiamo che tu abbia dei test che ti possono aiutare, ma cosa succede se stai lavorando su un codice non verificabile oscuro? PhpStorm comprenderà il contesto del tuo codice. Estrae correttamente la variabile per tutte le occorrenze e la colloca esattamente dove dovrebbe essere.

L'iceberg sotto la punta

Ciò che abbiamo presentato sopra sugli strumenti di refactoring, è solo la punta dell'iceberg. Estrarre le variabili è probabilmente il più semplice e semplice refactoring che puoi fare. Non abbiamo ancora utilizzato il metodo di estrazione o estratto la sottoclasse o anche alcune rinominazioni più complesse nelle nostre lezioni di refactoring, ma lo faremo. Impareremo come eseguirli a mano, ma ti incoraggerò a utilizzare un IDE intelligente per fare il lavoro per te.

Rinominare

PhpStorm è molto bravo a rinominare variabili o metodi anche attraverso centinaia di classi. Immagina quanto sarebbe difficile cambiare il nome di un metodo pubblico utilizzato in 100 classi diverse nel tuo progetto. PhpStorm può fare un lavoro di cinque minuti invece di un lavoro di due ore. Può trovare e cambiare il nome di tutti i metodi e dovrai solo controllare le miss-match prima di dirgli di agire. 

Sì, sì ... Dovrai verificare alcune occorrenze trovate perché PHP è un linguaggio tipizzato dinamicamente e in alcuni casi, non c'è assolutamente modo che PhpStorm, o qualsiasi altro algoritmo IDE o programma per quella materia, possa sapere quale tipo di oggetto è usato per quella chiamata al metodo specifico. Immagina, hai due classi totalmente diverse. Su ognuno di essi, hai un metodo pubblico chiamato "trova tutto()"Questo è molto comune e corretto. 

Perché abbiamo bisogno di valutare le modifiche?

Ora, ci sono 50 classi che usano la tua prima classe e altre 50 usano la seconda. Se hai usato le interfacce appropriate e digito il suggerimento dove possibile, PhpStorm proporrà le classi corrette da cambiare. Ma se non hai specificato il tipo che usi, o non hai usato alcuna interfaccia implementata dalla tua classe con il trova tutto() metodo, non c'è modo di dire automaticamente, quale delle due classi, entrambe hanno un trova tutto() metodo, sarà usato. Questa è l'essenza della digitazione dinamica di PHP. Ma mentre questo è un vantaggio in alcuni casi, è uno svantaggio quando abbiamo bisogno di fare refactoring in questo modo. Quando ciò accade, l'unica cosa che può essere fatta è che un umano valuti la necessità del cambiamento.

Con tutti questi, anche se ci sono altri refactoring presenti in PhpStorm, è già il miglior IDE solo con i refactoring. La rinomina, l'estrazione e l'inlining delle variabili, l'estrazione e l'inlining dei metodi sono i refactoring più frequentemente utilizzati ogni giorno. Se funzionano bene, abbiamo un IDE vincente.

Ma PhpStorm non si ferma qui. Ha un sacco di altri strumenti di refactoring che ti fanno sentire bene in situazioni difficili. Ha davvero quello "ciliegina sulla cima" sensazione.


Test e copertura del codice

Fai TDD, giusto? Se non lo fai, dovresti. Il test è essenziale per programmare come scrivere il codice di produzione stesso. Non potevo immaginare la mia vita senza TDD. Mi sono così abituato negli ultimi anni, che persino pensare al codice senza pensare ai test mi sembra innaturale e difficile.

Test e IDE

Con i test, il processo e gli strumenti devono essere altrettanto validi del codice di produzione stesso. PhpStorm ha una grande integrazione con PHPUnit. È l'unico IDE PHP che conosco che collega direttamente al framework PHPUnit, lo estende e lo utilizza per raccogliere tutte le informazioni che devono essere presentate. Ciò gli conferisce una connessione molto più intima con PHPUnit, un risultato migliore per l'utente e velocità di test più elevate.

Altri IDE tendono a utilizzare solo l'eseguibile PHPUnit, scrivere l'output in un file XML e interpretare i risultati per mostrarlo all'utente. Ecco come funziona NetBeans. Questo approccio offre maggiore flessibilità all'utente, se si vuole hackerare il sistema e convincerlo a eseguire i test in modi insoliti (ad esempio su telnet o SSH). Ma anche questo ha un enorme svantaggio. Le cose diventano lente. Prima di tutto, un processo di shell deve essere biforcato. "exec ()"è sempre un consumatore di tempo importante, quindi il risultato deve essere scritto su un file, possibilmente su una macchina remota. 

Sappiamo tutti che il file system è lento, molto lento. Gli SSD lo stanno facendo un po 'meglio, ma sono ancora lontani anni luce dalla velocità della RAM. Quindi, se eseguiamo i nostri test da remoto, abbiamo bisogno di copiare quel file sulla nostra macchina. Quindi non solo abbiamo bisogno di colpire il file system una volta, dobbiamo anche aggiungere a quel tempo, il costo della comunicazione di rete più di scriverlo su un file locale. Quindi il file deve essere riletto, in modo che possa essere finalmente mostrato all'utente.

Mentre quella è una soluzione super personalizzabile e flessibile, ci vuole solo tempo. Troppo tempo in cui pensiamo ai test unitari e ai test al millisecondo. E i test unitari che richiedono più di cinque millisecondi per essere eseguiti non sono più test unitari.

PhpStorm utilizza PHPUnit internamente

PhpStorm risolve, o almeno riduce, il sovraccarico usando PHPUnit internamente e dicendo di produrre il risultato nel modo preferito da PhpStorm. Questo riduce la flessibilità. Non puoi hackerarlo per testare oltre i suoi limiti. Ma aumenta molto la velocità. Non piu exec, non più file scritti per rallentare i file system. L'esecuzione remota può aggiungere il prezzo della comunicazione di rete, ma non possiamo eliminarla comunque. Un altro vantaggio è che l'utilizzo diretto di PHPUnit consente di presentare informazioni più dettagliate sui test non riusciti in modo più organizzato. In questo modo otteniamo velocità, dettagli e chiarezza al costo della flessibilità.

Essendo abituato a NetBeans, all'inizio ho trovato difficile accettare questa inflessibilità, ma alla fine della giornata, anche se a volte devo eseguire uno script esterno per testare il mio codice su macchine remote, i vantaggi della migliore integrazione con PHPUnit prevalgono.


Organizzazione e ricerca di file

Come la maggior parte degli IDE, Phpstorm è anche orientato al progetto. Di solito in un progetto è possibile avere file sorgenti e test. Come funziona PhpStorm, è necessario specificare una singola cartella come cartella per i test. Trovo abbastanza utile avere la stessa struttura di directory tra codice sorgente e codice di test. Ciò aiuta PhpStorm a trovare i test più facilmente e ti consente di passare da codice di produzione a test con un unico collegamento.

Ma non è tutto. Quando si tratta di trovare e aprire i file c'è una caratteristica unica in PhpStorm: Vai a Qualunque cosa (o Cerca tutto) - Adoro assolutamente questo. Prima di tutto, la sua scorciatoia da tastiera predefinita di Maiusc + Maiusc (doppio turno) è così naturale da usare, in secondo luogo, è la funzione di navigazione più utile. È stato introdotto solo di recente e, prima di questo, avevamo a disposizione caselle di navigazione e scorciatoie separate apri il file per nome, apri il file per nome della classe, apri il file contenente il simbolo (nome variabile o metodo) e così via. Ora posso solo raddoppiare il turno e iniziare a digitare. È incredibile e veloce.


Pensieri finali

Ci sono così tante fantastiche funzionalità negli IDE di oggi che potremmo continuare con questa storia per altri tre tutorial e ancora non dirlo a tutti. Ma dobbiamo fermarci ad un certo punto. Quindi, come un ottimo rifinitore per la nostra mini-maratona di funzioni PHPUnit all'interno di PhpStorm, ecco alcuni ultimi che apprezzano i miei colleghi e io a Syneto:

  • Modelli dal vivo - sono grandi per la scrittura di boilerplate per te. Ad esempio, quando scrivo questi tutorial in HTML, devo rispettare un insieme specifico di tag e formattazione. Ho dei bei piccoli modelli che possono scrivere questo per me, quindi il tempo impiegato per aggiungere un'immagine al tutorial, ad esempio, è ridotto a circa il tempo necessario per colpire i tasti, invece di scrivere la sintassi e lo stile dell'intera immagine.
  • Gestione di progetto - questo è abbastanza comune negli IDE. Tutti i tuoi file sono organizzati in progetti. Ma i programmatori di JetBrains hanno fatto qualcosa di veramente incredibile. Il loro motore di indicizzazione è veloce come l'inferno. Nessun altro IDE potrebbe caricare il nostro enorme progetto in Syneto così velocemente e quindi cercare in esso così velocemente. In effetti, IDE come NetBeans o Eclipse e i suoi derivati ​​non sono riusciti a indicizzare l'intero progetto. Questo ha reso la ricerca molto lenta. PhpStorm fa questo e le cose sono veloci rispetto a qualsiasi altro IDE.
  • Integrazione di Versioning del documento - è un'altra gemma nella borsa. Mercurial, Git, CVS, Subversion, tu lo chiami. PhpStorm si sente a casa con tutti loro. Dal commit selettivo e passando attraverso la fusione avanzata, con un grande strumento diff e unisci, alla grafica delle filiali, hai tutto ciò di cui hai bisogno. Da quando utilizzo PhpStorm, ho usato la CLI per emettere un "hg"comando probabilmente due o due volte appena lavori.
  • Macro - sono utili per quei piccoli e noiosi compiti ripetitivi che devi fare. In PHP, ogni riga deve terminare con un punto e virgola. Con quale frequenza il tuo cursore si trova alla fine della riga quando hai finito di scrivere tutto il codice al suo interno? Molto raramente. Il più delle volte, ci si trova all'interno di alcune parentesi che riempiono parametri o simili. Devi andare alla fine della linea e colpire ";"Beh, questo è facilmente automatizzabile con i macro.

OK, basta parlare. Ora ti lascio andare, scarica e prova PhpStorm da solo. Divertiti.