Nelle ultime settimane ho dedicato un po del mio tempo libero a sviluppare un progetto che proprio in questi giorni ha raggiunto il livello di maturità sufficiente per una prima release, il DataTableEditor (se qualcuno è interessato a provarlo... just drop a msg).
Ho proceduto nello sviluppo a piccoli passi (rilasci) realizzando poche funzionalità utente alla volta e facendo Refactoring guidato dalle 'bad smell' che avvertivo dal codice.
Ho avuto anche dei Refactoring da brivido in cui ho "rivoltato" in maniera significativa parte del disegno di codice già bello scritto, capito, commentato e testato.
Devo dirlo, il risultato finale mi soddisfa mooooolto (non avrei mai potuto indovinare il disegno che ne è risultato facendolo tutto up-front) ed ora aggiungere nuove funzionalità come nuovi tipi di colonne che gestiscono automaticamente visualizzazione e data-entry di un tipo dato del db (per es. checkbox per campi boolean, drop-down per le FK, datetimepicker per le date) o nuovi db supportati (Oracle o DB2 oltre che SqlServer) è cosa comprensibile e semplice, direi spontanea e naturale.
Refactoring e TDD vanno a braccetto sostenendosi a vicenda (ed ho anche una passione per il TDD) ma... ma... DataTableEditor è uno User Control e tutte le funzioni sono visuali e per questo programma l'uso di nunitasp sarebbe stato troppo oneroso rispetto le necessità e quindi ho usato gli Assert. Per chi ha memorie scolastiche sono le Weakest Preconditions ma per chi come a me piace scontrarsi con la realtà gli Assert sono campanelli d'allarme: dichiarano i presupposti su cui si basano le righe di codice che li seguono, se i presupposti cambiano il "campanello" suona e avverte il programmatore che c'è qualcosa da sistemare. Per usare in maniera produttiva gli Assert in pagine e controlli ASP.NET ho utilizzato WebAssert (se qualcuno è interessato a provarlo, as usual just drop a msg).
Per fare refactoring ho usato ReSharper 1.5.
Il PC ha 1.25 GB di RAM, non saprei dire se è merito della versione 1.5 o della RAM ma non ho avuto problemi di memoria!
Le funzioni di refactoring che ho usato più pesantemente, anzi direi che sono state indispensabili per me per fare un refactoring così spinto sono:
- Extract Method (che ho usato per le 'code smell' codice duplicato, metodi/classi lunghe, lunghe liste di if/switch/catch)
- Rename e Move Type (man mano che il refactoring procedeva mettevo a fuoco peglio le responsabilità di ogni classe/metodo e per rendere chiara la cosa ho effettuato diversi cambi di nome e alcuni spostamenti di namespace)
Inoltre
- Encapsulate Field non l'ho usato per pigrizia (avevo a disposizione già una macro)
- Change Signature mi avrebbe fatto risparmiare molto tempo ma... ma... mi sono accorto troppo tardi che esisteva ('code smell' lista parametri troppo lunga ma anche dovuto a spostamento di codice per le altre 'code smell' come metodi troppo lunghi etc.) ! ! !
- Gli Extract Interface e Extract Superclass mi sono trovato meglio nel farli a mano ma mi riprometto di provarli meglio ('code smell' per eliminare lunghe liste di if/switch usando il polimorfismo e una interfaccia/classe base, mel mio caso per spostare le responsabilità a causa di shotgun surgery e cambiamenti divergenti o classi lunghe visto che come dicevo con gli ASCX si può fare sono tra classi derivate).
- I convert (Method <=> Property, Interface <=> Abstract) mi interessano molto ma in questo progetto non ne ho avuto bisogno.
- Introduce variable, field, parameter e Inline Variable non le ho usate, accetto a proposito commenti/suggerimenti!!!
Ho avvertito la mancanza di Extract Class (che se non avessi avuto il problema dell'ASCX che dicevo sopra avrei usato al posto di Extract Superclass) ma anche di Collapse Hierarchy e Inline Class.
Invece la segnalazione di classi, metodi, variabili inutilizzate mi ha aiutato ad applicare la recnita di refactoring più potente ed efficace: Delete the code ;-)
Le funzioni extra-refactoring di ReSharper non le ho apprezzate (ad esclusione della sequenza di tasti per navigare al Prec/Succ metodo nell'editor di testo che non ho trovato in VS.NET) e ho addirittura trovato disturbante l'IntelliSense di ReSharper che si sovrappone a quello di Visual Studio (ma come ha segnalato Lorenzo nella ver. 1.5.1 potrà essere disabilitato) insieme ad altre funzionalità extra refactoring.
Sempre nelle funzioni extra-refactoring ho trovato fastidiosa la mancanza di gesione degli alias di namespace (ho ridotto il danno disabilitando l'introduzione automatica dei semplici using o la scrittura automatica dell'intero namespace prima del tipo). Ma qui anche VS.NET 2K3-2K5 ha lo stesso difetto quindi mal comune mezzo gaudio!
In conclusione sono rimasto molto soddisfatto di aver adottato ReSharper e l'ho trovato molto conveniente rispetto al fare refactoring a mano :-)))
Tags : Progettazione Software |