Quando è necessario modificare un metodo lungo centinaia o migliaia di righe di codice e modificare un comportamento esistente conviene SCOMPORRE IL METODO ABNORME E METTERLO SOTTO TEST con l'aiuto di un tool di refactoring come Resharper.
La strategia è quella di separare la logica dalle intricate dipendenze nel codice e quindi sradicare le dipendenze (ad esempio sostituendo i riferimenti a classi concreti con riferimenti a interfacce) per semplificare il test del codice.
Il metodo non è già coperto da test e quindi è necessario cominciare applicando solo i refactoring previsti dal tool (principalmente RefactoringExtractMethod e RefactoringRenameMethod) evitando refactoring manuali che non sono sicuri senza ne test ne tool.
Una volta fatti refactoring automatici che tipicamente sono a grana grossa e messo il codice sotto test è possibile procedere con le altre modifiche di grana fine e poi con quelle manuali (quelle non supportate dal tool di refactoring).
Riferimenti: Working Effectively with legacy code di M.C.Feathers
P.S. Alcuni Refactoring delle dipendenze che aiutano a testare i metodi estratti:
Parametrize Method: passa come argomenti le dipendenze del metodo in modo da poterle mockare
Expose Static Method: rendi il metodo statico cosi puoi testarlo senza istanziare l'intera classe e le sue dipendenze
Push Down Dependency: sposta le dipendenze difficili da istanziare su una classe derivata
Pull Up Feature: oppure sposta il metodo in una classe base
Extract and Override Getter: metti le dipendenze difficili da mockare in un getter virtuale e nel test implementa l'override che restituisce dei mock
Subclass and Override Method: nel test fai l'override dei metodi le cui dipendenze ostacolano il test del metodo da testare
Extract and Override Call: oppure fai l'override della chiamata al metodo
Tags : Team Work | Agile | Pratiche | Progettazione Software |