Professional PHP Refactoring by Francesco Trucchia (Ideato srl), Enrico Zimuel (Zend Technologies srl)
Ci presentiamo... ft@ideato.it Francesco Trucchia, CTO di Ideato srl Fondatore di Ideato srl, esperto di sviluppo software PHP tramite metodologie agili PHP 5.3 Certified Engineer Co-autore del libro Pro PHP Refactoring Apress edizioni (2010) enrico@zend.com Enrico Zimuel, Senior Consultant & Architect di Zend Technologies srl Software engineer dal 1996 con più di 10 anni di esperienza nello sviluppo in PHP PHP 5 Certified Engineer, Zend Framework Certified Engineer
Sommario PHP Refactoring Quando il codice puzza Il refactoring: cos'è, quando e perchè Le regole I test automatici Gli strumenti Le tecniche Zend Studio per il Refactoring Funzionalità specifiche per il Refactoring Demo
PHP Refactoring
Ideato srl, solution partner Zend Esperti nello sviluppo e integrazione di applicazioni e servizi web 2.0 Il team di sviluppo supporta l'intero processo di realizzazione di nuove idee per il web Il nostro processo produttivo si fonda sui principi del manifesto agile per lo sviluppo del software Dal 2010 è Solution Partner di Zend Technologies in Italia http://www.ideato.it
Quando il codice puzza Non riesci a capire o seguire le logiche del codice? Ci sono troppi commenti inline dentro il codice? Hai paura di aggiungere nuove funzionalità temendo il bug? Ti perdi tra migliaglia di righe di codice? Il codice è procedurale? Se puzza, cambialo! - Kent Back's grandmother
I cattivi odori più famosi (bad smells) Codice duplicato Raggruppamenti di dati Metodi lunghi Classi larghe Lunghe liste di parametri Cambiamenti divergenti Overhead di design Ossessione di chiamate primitive Molta logica condizionale Classi oziose Generalizzazioni inutili Variabili di appoggio o temporanee Commenti
Che cos'è il refactoring Il refactoring è la tecnica attraverso la quale si cambia la struttura interna del software senza modificarne il comportamento esterno
Perchè dovrei fare refactoring (1) In un sistema isolato l'entropia è una funzione non decrescente nel tempo (II legge termodinamica) in altre parole tutti i processi in cui è richiesta energia, come quelli chimici, fisici ecc., subiscono una riduzione di attività se isolati e se non vi sono nuovi apporti energetici
Perchè dovrei fare refactoring (2) Migliora il design del software Semplifica la comprensione del software Aiuta a scovare bug Aumenta la produttiva del team
Quando devo fare refactoring Quando duplico codice (la regola dei tre) Quando aggiungo funzionalità Quando correggo un bug
Le regole Test first Piccole e semplici modifiche Non cambiare mai il comportamento Segui i cattivi odori Segui le tecniche
Perchè testare il software? Perchè... il debug costa ci dobbiamo difendere dall'evoluzione caotica migliora la comunicazione aumenta il feedback incoraggia il cambiamento aumenta la fiducia del team
Test automatici Test unitari: confermano che le singole righe di codice computino il corretto output quando viene passato un input ben definito. Test funzionali: testano l'esperienza utente e ne verificano il corretto funzionamento.
Gli strumenti
Come scegliere l'ide Capacità automatica di: rinominare parametri, metodi e classi spostare parametri, metodi classi incapsulare i parametri di classi in setter e getter
PHPUnit per i test unitari E' un framework della famiglia xunit che permette di testare in maniera unitaria il codice PHP Caratteristiche: Testare il database Usare mock object per testare classi indipendentemente Organizzare i test in suite e gruppi Filtrare i test che si vogliono lanciare Eseguire azioni custom all'inizio e alla fine di ogni test Loggare il risultato dei test in vari formati Integrare i test con software di terze parti (Hudson, Apache Maven, Cruise Control, ecc.)
Selenium per i test funzionali Selenium è un framework multipiattaforma per testare l'esperienza utente (e non solo) su applicazioni web. Selenium fornisce più strumenti: Selenium IDE Selenium RC Selenium Grid PHPUnit si integra con Selenium
Le tecniche
Le tecniche Ci sono più di 50 differenti tecniche di refactoring Ogni tecnica offre una soluzione chiara e a piccoli passi ad un problema di design Le tecniche dovrebbero essere eseguite come dei kata Il kata aiuta ad automatizzare azioni sequenziali
Le tecniche servono a Sistemare il comportamento Cambiare la responsabilità delle classi Razionalizzare i dati Semplificare le logiche condizionali Semplificare le interfacce Semplificare le relazioni tra classi Trasformare codice procedurale ad oggetti
Estarre una classe Cambiare la responsabilità delle classi Problema: Abbiamo una classe che ha responsabilità di più classi Soluzione: Creiamo una nuova classe e spostiamo le proprietà ed i metodi che non appartengono alla classe origine nella nuova classe Meccanismo: Creiamo un test unitario per la classe origine Decidiamo quale proprietà e/o metodo estrarre Creiamo un nuovo test unitario per la nuova classe Creiamo la nuova classe Nel costruttore della classe origine, creiamo un'istanza della nuova classe assegnandola ad una proprietà già esistente o ad una nuova Usiamo il metodo sposta i parametri per spostare ogni proprietà nella nuova classe Usiamo il metodo sposta i metodi per spostare ogni metodo nella nuova classe Decidiamo come esporre la nuova classe attraverso la classe origine
Scomporre la logica condizionale Semplificare le logiche condizionali Problema: abbiamo una dichiarazione condizionale complessa (if/else) Soluzione: Estraiamo la condizione in metodi Estraiamo la parte if e poi la parte else Meccanismo: Estrai la condizione in un metodo privato Estrai i branch condizionali in altri metodi privati
Zend Studio per il Refactoring
Zend Studio 8 E' un IDE professionale per lo sviluppo di applicazioni PHP E' un IDE basato sul progetto Eclipse Agile development +1000 Eclipse plug-in Multipiattaforma: Windows, Linux, Mac Os X
Zend Studio 8: alcune caratteristiche PHP Editor e File Manager Supporto Javascript, CSS, HTML Debug (anche Javascript), Profiling Supporto sistemi remoti e Virtual Machine Integrazione con PHPUnit e PHPDoc Generatore di codice PHP Source Control (CVS, SVN, Local History, Team) Database connectivity Integrazione Zend Framework Integrazione con Zend Server
Zend Studio per il Refactoring PHP In Place Refactoring capacità di rinominare variabili durante l'editing Estrarre variabili/metodi Muovere file/directory Rinominare classi, funzioni e variabili Profiling con funzione di code coverage per determinare le porzioni di codice PHP eseguite a run-time
Demo Demo di Zend Studio per il Refactoring
Riferimenti Pro PHP Refactoring Francesco Trucchia, Jacopo Romei (Apress 2010) Alcuni strumenti: PHPUnit, http://www.phpunit.de/ Selenium, http://seleniumhq.org/ Zend Studio, http://www.zend.com/en/products/studio/
Grazie! Per maggiori informazioni: http://www.zend.com http://www.ideato.it