Migliora il codice della tua applicazione PHP/Laravel con l'analisi statica

Migliora il codice della tua applicazione PHP/Laravel con l'analisi statica

Sei un programmatore PHP? Scopri come l'analisi statica può aiutarti a migliorare la qualità del tuo codice e a ridurre il rischio di errori. Leggi l'articolo per saperne di più.

Questo articolo è stato scritto molto tempo fa. Potrebbe essere stato superato dalla tecnologia.

Oggi vediamo perché dovresti usare un tool per l'analisi statica del codice nei tuoi progetti, piccoli o grandi che siano.

Che cos'è l'analisi statica del codice?

L'analisi statica esegue controlli sul codice sorgente prima che venga compilato o eseguito. Non controlla che il codice faccia ciò che è destinato a fare: a questo servono i test unitari e i test di integrazione. Ma l'analisi statica può eseguire molti controlli utili sul codice senza doverlo eseguire.

Resterai sorpreso di quanto possa essere utile. L'analisi statica può eliminare gli errori più semplici ma facilmente commettibili e far rispettare gli standard e gli stili di codifica nei vari team di sviluppo.

Gli strumenti di analisi statica analizzano il codice per comprenderlo e poi lo utilizzano per verificare cosa potrebbe essere sbagliato.

Alcuni semplici esempi di ciò che l'analisi statica può dirvi:

  • Si sta utilizzando un intero come booleano
  • Si sta passando un array a una funzione che si aspetta una stringa
  • Una determinata funzione non viene mai chiamata
  • Una condizione restituisce sempre true
  • Un frammento di codice è irraggiungibile e non verrà mai eseguito.
  • Una variabile a volte potrebbe essere vuota o di un tipo diverso che non viene controllato

Ad esempio in questo frammento di codice prendiamo una stringa JSON e la trasformiamo in un array associativo:

    $json = file_get_contents( $file_path );
    $json = json_decode( $json, true );

Un tool di analisi statica ci direbbe che la funzione json_decode si aspetta una stringa mentre noi gli stiamo passando il risultato della funzione file_get_contents, che torna una stringa o null se non trova il file, ovvero in alcuni casi, al posto di una stringa, passiamo false.

Questo avviso ci permette di gestire l’eccezione e gestirla prima che, randomicamente, crei malfunzionamenti del software.

Tutte cose che un buon programmatore con un buon IDE potrebbe rilevare in autonomia durante la revisione del codice ma visto che siamo umani e l’errore può scappare, un tool di analisi statica ci torna utile. Se pensate che poi riesce ad analizzare l’intera code base in tempi rapidissimi, perché non usarlo?

Gli strumenti di analisi statica possono essere eseguiti manualmente o automaticamente dal vostro editor/IDE, come hook sulla pipeline di Git o come parte di un processo di distribuzione.

Perché l'analisi del codice è importante?

La scarsa qualità del codice sorgente è causa di molti mal di testa, giornate di superlavoro e notti insonni sia per gli sviluppatori che per i proprietari dei software. La pianificazione e la conduzione dell'analisi del codice sono spesso ignorate dal management, con effetti negativi di lunga durata sull'efficienza dello sviluppo e persino sull'intera azienda.

Per riassumere brevemente, se la qualità del codice sorgente viene lasciata deteriorare:

  • l'aggiunta di nuove funzionalità diventa sempre più difficile, mentre potenzialmente si rompono quelle esistenti nel processo
  • le correzioni dei bug occupano più tempo del team, facendo saltare le scadenze e prolungando gli aggiornamenti cruciali
  • l'inserimento di nuovi sviluppatori richiede più tempo se il codice base è difficile da leggere e da capire
  • la scarsa qualità del codice sorgente può anche avere un impatto negativo sulla percezione del prodotto da parte degli utenti e sull'intera organizzazione
  • le stime di sviluppo future diventano meno accurate se è impossibile prevedere quanto tempo ci vuole per aggiungere nuove funzionalità senza interrompere quelle esistenti.

Perchè, se non lo fate già, vi consiglio di usare l’analisi statica già da oggi?

Se anche tu sei nel mondo della programmazione da tempo, ti sarà capitato di mettere mani su progetti vecchi o scritti da altri. E anche tu quindi ti sarai scontrato con la difficoltà di aggiungere nuove funzionalità senza introdurre bug o instabilità.

Come già scritto tempo fa, per poter stabilizzare questi prodotti software e continuare lo sviluppo occorre avere (o creare nel caso non ci fosse) una suite di test il più completa possibile e successivamente procedere ad un primo refactoring del codice, almeno per le parti obsolete e non più supportate.

Se il codice è poco “strict”, cosa piuttosto facile visto che PHP come linguaggio di programmazione lo permette, inserire un bug diventa facile così come non gestire una eventuale eccezione dovuta ad un return type non previsto.

Quali sono i tool ad oggi disponibili per effettuare analisi statica?

Ci sono svariati strumenti per l’analisi statica del codice ma i più famosi sono:

  • PhpStan
  • Psalm
  • PHP Insights
  • Rector


PHPStan

PHPStan è uno strumento di analisi statica del codice che si concentra sulla ricerca di errori nel codice sorgente senza doverlo eseguire. Individua intere classi di bug prima ancora di scrivere i test per il codice. PHPStan è forse lo strumento più usato e anche uno dei più recenti.

Psalm

Psalm è un altro grande strumento di analisi statica del codice per trovare errori nelle basi di codice PHP. È stato rilasciato nel 2016 e la sua popolarità è cresciuta un po' più lentamente rispetto agli altri. Questo strumento risolve anche i bug in modo automatico, consentendo agli sviluppatori di migliorare il proprio codice senza troppo lavoro aggiuntivo.

PHP Insights

PHP Insights va un po’ oltre l’analisi statica: ci fornisce 4 gruppi di punteggi: codice, complessità, architettura e stile.

Stile: valuta e rileva eventuali problemi sullo stile del codice rispetto agli standard di programmazione.
Complessità: indica un punteggio per la complessità ciclomatica, che è un modo molto semplice per dire quante diramazioni ci sono nel codice. 
Architettura: valuta alcuni aspetti strutturali del codice, come convenzioni di denominazione o della lunghezza delle funzioni o delle classi.
Codice: si va dalle variabili inutili all'evitare di usare alcune funzioni perché possono essere imprevedibili. 

Di default è decisamente restrittivo ma potete personalizzarlo come meglio credete.

Visto che fornisce punteggi, torna utile in fase di refactoring per vedere se stiamo andando nella direzione giusta.

Rector

Ho iniziato a studiarlo da troppo poco per parlartene in maniera approfondita ma, se manterrà le aspettative iniziali, mi sa che a breve Rector avrà un post tutto suo. È costruito sulla base dei componenti di PHPStan per poter fornire tutte le funzionalità di type-hinting, ma va oltre, in quanto può effettivamente correggere le cose. Può sostituire le chiamate di funzione o i nuovi operatori disponibili nelle versioni successive di PHP. C'è un insieme di regole semplici per PHP e PHPUnit, che vale la pena usare, ma ci sono anche regole per eseguire aggiornamenti del codice Laravel. Ad esempio, per cambiare le factory precedenti alla versione 7 con quelle più recenti. 

Ok, ma da quale dovrei partire? PHPStan!

Io per il momento utilizzo PHPStan ad un livello minimo di 6. Se anche tu sviluppi in Laravel poi, esiste un ottimo wrapper, Larastan, che ti permette di avere già riconosciuto, out of the box, tutti i magic methods di Laravel.

Per provarlo, ti basta andare sulla documentazione e seguire le istruzioni per installarlo. Se hai un progetto Laravel invece, installa direttamente il pacchetto Larastan come dipendenza di sviluppo.

Parti con i tuoi controlli in maniera incrementale, per primo il livello 0, correggi gli eventuali errori e poi passa al livello 1 e così via.

PS: pochi giorni fa è uscito Laravel 10 e, finalmente, anche il codice del framework è strettamente type-hinted. Dichiarano di rispettare il livello massimo:

Note finali

Sia chiaro: l'analisi statica non è adatta a tutti gli sviluppatori e a tutti i progetti. Io la amo perché sono felice di accettare un po' di "disordine" visivo nel mio codice se questo mi dà ulteriori garanzie che sia robusto e ben documentato, e in modo da poter utilizzare i controlli automatici forniti dagli strumenti di analisi. Ma non a tutti piace avere dichiarazioni di tipo ovunque.

Detto questo, spero che questo post ti spinga a fare una prova e iniziare a vedere alcuni dei vantaggi che ti può offrire.

Ultima modifica: domenica 19 febbraio 2023

Ancora nessun commento presente

Che ne dici di essere il primo?

Aggiungi il tuo commento

Iscriviti alla mia newsletter

Resterai informato sugli ultimi post, appena verranno pubblicati