Quando capita di trovarsi con una classe troppo grossa (con 20-60 di metodi) probabilmente li ci sono troppe responsabilità, conviene individuarle e poi estrarle mettendole in nuove classi
Ecco alcuni modi di individuare le responsabilità a partire dal codice esistente di una classe:
- Scrivi i nomi di tutti i metodi della classe insieme alla visibilità (public, privare, friend, internal, ...) e prova a raggrtupparli in base alle similitudini nel nome
- Guarda i metodi privati, internal e protected. Quando sono molti probabilmente li c'è una classe nella classe. Una classe con livello di astrazione inferiore che aspetta di essere estratta
- Cerca le cose che sono scolpite nel codice che invece potrebbero cambiare. Estraile in classi che contengono questi dettagli di più basso livello e usale attraverso interfacce più astratte per rompere la dipendenza
- Scrivi le variabili globali di classe e traccia il grafo dei metodi che usano ogni variabile, quando emerge un grappolo di metodi che insistono sulle stesse variabili quella è una potenziale classe da estrarre
- Prova a descrivere a parole la responsabilità principale della classe, le altre responsabilità che ci sono oltre a questa sono candidate per essere estratte in altre classi (vedi il Single Responsibility Principle o SRP e l' Interface Segregation Principle ISP)
- Se ancora con basta fai del refactoring esplorativo (modifiche da fare velocemente e rollbackare subito dopo) modificando il codice (spostando ed estraendo metodi e variabili) che aiuta a capire dipendenze e relazioni tra variabili e metodi
- Concentrati sulla funzionalità che stai implementando, se i metodi che stai implemnetando mettono a disposizione un modo alternativo di fare qualcosa che era possibile già prima allora potresti aver identificato una responsabilità che puoi estrarre e poi sostituire.
Sempre da Working Effectively with legacy code di M.C.Feathers , li queste euristiche sono dettagliate con esempi anche in C#. figure e spiegazioni.
Tags : Team Work | Agile | Pratiche | Progettazione Software |