Modificare metodi interminabili: quando il tool di Refactoring manca


Quando è necessario modificare un metodo lungo centinaia o migliaia di righe di codice e modificare un comportamento esistente senza l'aiuto di un tool di refactoring conviene   SCOMPORRE IL METODO ABNORME E METTERLO SOTTO TEST   applicando delle tecniche specifiche.


Visto che è difficile scrivere dei test sul quel metodo, allora si inserisce il test dentro il metodo. L'idea consiste nel inserire delle variabili di rilevazione nel codice del metodo che "misurano" se si è comportato correttamente e queste variabili vanno a testare le stesse cose che si testerebbero se si potessero scrivere test unitari sul metodo abnorme. 


La prima è una tecnica di test duale ed equivalente agli unit test per quanto riguarda la possibilità di verificare un comportamento. Se si può istanziare la classe in un test basta dichiarare le variabili di rilevazione pubbliche di classe e testarle dopo aver chiamato il metodo, altrimenti si possono usare dei Debug.Assert() e in questo caso è importante ricordarsi di esercitare il codice in modo che tutti i rami condizionali vengano eseguiti.


Una volta fatti i refactoring per scomporre il metodo e messo sotto test le parti estratte bisogna rimuovere variabili e test e Debug.Assert().


La seconda tecnica consiste nel estrarre piccole parti ci codice conosciuto di cui si sa bene cosa fa e come verificare che sta ancora funzionando correttamente (provando il programma). Con piccole si intende poche righe e poche dipendenze del codice cioè pochi parametri che serve passare al metodo che si estrae.  Conviene partire dalle parti più piccole di codice (con zero parametri), procedendo il disegno e la struttura del metodo abnorme diventa più chiara ed poi è più facile procedere. Quando i parametri sono più di zero torna utile usare anche le variabili di rilevazione.


Ci sono due ulteriori tecniche chiamate Gleaning Dependencies (in breve consiste nel mettere sotto test il codice che implementa la responsabilità principale del metodo abnorme ed estrarre a mano le funzionalità secondarie) e Break out Method Object (in breve consiste nello spostare il metodo estratto in una classe apposita, le variabili locali diventano globali ci classe e i parametri diventano argomenti del costruttore).

 

Riferimenti: Working Effectively with legacy code di M.C.Feathers

 


Tags :   |  |  |  |

 

Print | posted @ Friday, August 22, 2008 8:07 PM

Comments have been closed on this topic.