PHP Refactoring – Introduzione
Refactoring, ovvero ottimizzazione del codice esistente.
Troppo spesso come programmatori dobbiamo mettere mano a codice sporco, scritto male e pieno di bug, con il rischio che l’eliminazione di un errore generi altri bug a catena.
Le soluzioni sono due:
- Prendere un bel foglio bianco e pianificare da zero l’applicativo;
- individuare la possibilità di suddividere il programma in porzioni autonome e riscrivere il codice di quest’ultime, in modo da migliorarlo senza apportare macro cambiamenti istantanei.
Il primo caso è quello preferito da ogni sviluppatore, ma purtroppo per esigenze contingenti (budget, tempistiche di messa online) il meno praticabile.
A questo punto siamo costretti ad intraprendere la strada della seconda soluzione, ovvero il refactoring.
Ma quali vantaggi può portarci intraprendere questo passo? Perchè, filosoficamente parlando, tutte le novità sono belle ed interessanti, ma alla fine bisogna sempre fare un raffronto fra costi e benefici.
Direi che i maggiori benefici possono essere qui riassunti:
- Minor numero di righe di codice;
- Individuazione di uno stile univoco di programmazione;
- Scomposizione del codice in patterns riutilizzabili ben consolidati;
- Leggibilità del codice;
- Testing automatico del proprio codice.
Ricordatevi che il refactoring non è un metodo che si esaurisce in due minuti, e che non viene eseguito con cambiamenti massivi, ma è granulare e lungo nel tempo.
Concludiamo l’articolo introducendo i principali caposaldi del refactoring che andremo ad analizzare:
- Incapsulamento interno dello stato di un oggetto;
- Riduzione del codice di una classe;
- Eliminazione di codice non autoesplicativo;
- Naming convention per proprietà e metodi della classe;
- Estrazione di metodi;
- Semplificazione di istruzioni condizionali e ripetitive;
Buon proseguimento nelle prossime puntate.





Loading ...





Direi che il discorso sul refactoring è generico e non riguarda solo PHP. Caposaldo della letteratura in proposito è sicuramente lo splendido Refactoring: Improving the Design of Existing Code di Martin Fowler.
Una sola precisazione: l’esordio del tuo articolo recita “Refactoring, ovvero ottimizzazione del codice esistente”. Si intende ottimizzazione – io direi più che altro miglioramento – dal punto di vista del design, non necessariamente da quello delle prestazioni. Non è una critica al refactoring, semplicemente una considerazione lessicale…
Ue ma qui mi fate tutti le pulci ?
Scherzi a parte credo che riducendo il codice che deve essere scritto, il tempo di esecuzione di una pagina che il parser deve eseguire si riduce, da qui ottimizzazione.
Sono d’accordo con te che il refactoring è generico e non appartiene ad un linguaggio in particolare, ma dato che il PHP mi piace e gli esempi saranno scritti in questo linguaggio di scripting ho voluto mettere l’accento sull’adorabile linguaggio creato da Rasmus Lerdorf.
Il sopracitato Fowler disquisisce dottamente di come il refactoring non sia necessariamente veicolo di ottimizzazione, ma renda senza dubbio più facile ottimizzare quando lo si voglia fare… ma questo è un discorso che col refactoring ha poco a che fare, e richiederebbe pagine per i fatti suoi…
Bah grande rispetto per Fowler, ma se riducendo il codice non ottimizzi sinceramente alzo bandiera bianca sul significato delle parole.
Ridurre il numero totale di linee di codice non significa necessariamente velocizzarne l’esecuzione.
Semplice esempio: se ho più parti di codice simili e le estrapolo in una funzione o in un include, riduco il numero totale di righe di codice ma alla fine quelle che vengono eseguite sulla singola pagina sono sempre le stesse (anzi un po di più).
Ad esempio l’aggiunta di commenti al codice ne rallenta l’esecuzione, viene impiegato più tempo a leggere il file (è più grande) ed il parser php impiega più tempo a processarlo.
Ovviamente il discorso dei commenti non influisce su un linguaggio compilato.
Ottimizzazione in termini di velocità la si ottiene ad esempio
migliorando i cicli ad esempio se scorriamo un insieme di valori alla ricerca di un valore particolare il ciclo va interrotto quando troviamo il valore senza attendere di arrivare alla fine dell’insieme di valori
ottimizzando le if, mettendo la condizione che ha maggior possibilità di avverarsi che decreta se si entra o meno nella if (le successive condizioni non vengono va
nel caso di php rendendo gli include, se possibile, condizionali (php li compila nel momento in cui vengono richiamati e non a prescindere).
questi ovviamente sono solo banali esempi di ottimizzazione del codice.
Beh per quanto riguarda le righe di commento basterebbe creare un piccolo parserino che legge il file e lo salva eliminandole, e questo ottimizzerebbe di qualche ciclo il tempo. Creare un ciclo while che si stoppa controllando che la sua condizione sia falsa, eliminando così il bisogno dell’if interno che se true esegue il break interno migliora i tempi e riduce il codice di qualche riga….
Naturalmente il refactoring non è una scienza esatta e si può vedere o interpretare in vari modi.
L’esempio della riduzione di righe per ottimizzare il codice è stato il primo esempio che mi è venuto in mente, cmq i tuoi argomenti sono validi
Sono d’accordo con Pietro, tra refactoring e ottimizzazione c’è una bella differenza.
Il refactoring non premia affatto l’ottimizzazione, anzi, lo spezzettare il codice in metodi più piccoli comporta più chiamate a metodo e tutti sanno che queste sono molto costose in termini di risorse del sistema.
Qualche volta però il refactoring aiuta, ad esempio riducendo il numero delle variabili in gioco.
La lettura dei libri di Flower è sicuramente il primo passo da fare.
Ammiro comunque la buona volontà di Nicola, migliorarsi è sempre una cosa buona.
Però bisogna studiare studiare studiare….
Ciao
Beh guarda fra scuola, Università e aggiornamenti studio dall’età di 7 anni.
Fowler l’ho letto anni fa ed è stato illuminante, anche se, come dice lui, molte delle tecniche di refactoring le utilizziamo comunemente ogni giorno.
Il refactoring non è solo crescita del numero di metodi all’interno del programma, per esempio si può ridurre gli if all’interno di una funzione con un semplice switch, senza aggiunta di altre chiamate, giusto per fare un esempio.
Credo che quest’argomento sia uno di quelli che maggiormente possa far dibattere i programmatori, da come si vede qui; comunque penso che un buon refactoring permetta anche a chi non ha scritto il codice di comprenderlo velocemente, poi per la velocità esistono gli optimizer che trasformano le pagine in pseudo codice compilato e ottimizzato per il processore, Inoltre con un buon caching lato server possiamo ridurre olteriormente i tempi di attesa.
Insomma in questo Mondo c’è di tutto e di più