Al momento ho una classe Foo ,
ho deciso che ho bisogno di un secondo tipo di Foo in cui voglio testare un'implementazione significativamente diversa. Senza dubbio condividerò alcune funzionalità con Foo quindi dovrò creare un genitore di Classe astratta per entrambi.
Alla fine del processo voglio:
-
AbstractFoo: una classe astratta -
FooBoo: funzionale identico all'originaleFoo -
FooBar: la nuova sottoclasse di AbstractFoo che ho creato.
Ci sono due modi in cui potrei fare questo:
Copia Incolla, quindi Rifattore
- Crea una copia di
Fooe assegnagli il nomeFooBare rinominaFooinFooBoo - Modifica
FooBarcon la nuova implementazione - Ispeziona,
FooBareFooBoo, sposta i metodi che sono uguali tra loro in una classe astrattaAbstractFoo, che entrambi ereditano da
Refactor, quindi Implement
- Rinomina
Foo,FooBoo - Considera quali metodi non sono correlati alla parte dell'implementazione in cui
FooBooeFooBazsaranno diversi. Spostali aAbstractFoo - Crea
FooBaze reimplementa tutti i metodi che rimangono all'interno diFooBoo
Quale è preferibile? * Esiste un altro metodo? *
L'ultima volta che ho dovuto fare questo, è stato perché ho deciso che Foo aveva 2 diverse modalità, che era determinata da un booleano passato al costruttore.
Questa volta (in una classe diversa), è perché voglio provare a utilizzare un motore diverso sotto che potrebbe essere più veloce.
Voglio mantenere FooBoo in giro perché ha una sottoclasse che penso sarà molto più difficile da implementare per FooBaz , e voglio anche essere in grado di verificare che alla fine si comportino allo stesso modo.