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
Foo
e assegnagli il nomeFooBar
e rinominaFoo
inFooBoo
- Modifica
FooBar
con la nuova implementazione - Ispeziona,
FooBar
eFooBoo
, 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
FooBoo
eFooBaz
saranno diversi. Spostali aAbstractFoo
- Crea
FooBaz
e 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.