Ho un problema di progettazione che vorrei risolvere. Ho un'interfaccia, chiamiamolo IProtocol
, che è implementato da due classi separate. Stiamo guardando oltre 600 linee di codice qui. La stragrande maggioranza delle cose che fanno è la stessa, tranne per alcune aree specifiche, come DiffStuff();
Problema di progettazione - L'ereditarietà è il modo giusto per semplificare questo codice?
struttura attuale è qualcosa di simile:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
E
public class Protocol2 : IProtocol { MyInterfaceMethod1() { Same1(); Same2(); } }
Mi preoccupo di avere errori di copia-incolla t è un classico problema di duplicazione del codice se tengo separati i due protocolli. Stiamo parlando di 600 righe di codice complete ciascuna, non di semplici metodi.
Sto pensando di cambiare l'implementazione di protocollo1 ereditare da Protocollo2, come questo (Protocollo2 sarebbe per lo più rimanere lo stesso, tranne che avrei dovuto avvolgere Same1()
e Same2()
in metodi privati.)
public class Protocol1 : Protocol2
{
void Same1()
{
base.Same1();
}
void Same2()
{
base.Same2();
}
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
È questo il modo giusto per affrontare questo problema?
Modifica: Molte persone mi hanno aiutato con questa domanda, grazie per la chiara comprensione. Nel mio caso, i due oggetti non sono dello stesso tipo, anche se gran parte della loro implementazione è condivisa, quindi sono andato con Bobby's suggestion per usare la classe base astratta, creando piccoli metodi per incapsulare le modifiche tra le classi. Ulteriori Grazie a:
- jloubert
- Hans Passant
- Jeff sternale
perché non utilizzare una classe astratta che definisce i metodi condivisi e definizioni astratte per i più necessari che non implementati ? – alternative
Dai un'occhiata a "Clean code" di Robet C. Martin –
Dovresti solo rendere 'Protocol1' ereditato da' Protocol2' se questo ha effettivamente senso. Hai bisogno di chiedere, "ogni Protocollo1 è anche un'istanza del Protocollo2, nello stesso senso in cui ogni Gatto è un Mammifero?" Se lo sono, quindi fai ciò che stai pensando. Altrimenti, andrei con una classe base astratta, come mostrato nella risposta di Bobby. – jloubert