J'ai un problème de conception que je voudrais résoudre. J'ai une interface, appelons-le IProtocol
, qui est implémenté par deux classes distinctes. Nous examinons plus de 600 lignes de code ici. La grande majorité des choses qu'ils font est le même, sauf pour certains domaines spécifiques, comme DiffStuff();
Problème de conception - L'héritage est-il la bonne façon de simplifier ce code?
La structure actuelle est quelque chose comme ceci:
public class Protocol1 : IProtocol
{
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Et
public class Protocol2 : IProtocol { MyInterfaceMethod1() { Same1(); Same2(); } }
Je suis préoccupé par les erreurs de copier-coller et t Le problème classique de la duplication de code si je garde les deux protocoles séparés. Nous parlons de 600 lignes de code chacune, pas de méthodes simples.
J'envisage de changer la mise en œuvre de Protocol1 hériter de PROTOCOLE2, comme celui-ci (Protocole2 serait la plupart du temps restent les mêmes, sauf que je dois conclure Same1()
et Same2()
dans des méthodes privées.)
public class Protocol1 : Protocol2
{
void Same1()
{
base.Same1();
}
void Same2()
{
base.Same2();
}
MyInterfaceMethod1()
{
Same1();
DiffStuff();
Same2();
}
}
Est-ce la bonne façon de régler ce problème?
Modifier: Beaucoup de gens m'ont aidé avec cette question, merci pour la compréhension claire. Dans mon cas, les deux objets ne sont pas du même type, même si une grande partie de leur implémentation est partagée, donc je suis allé avec Bobby's suggestion pour utiliser la classe de base abstraite, créant de petites méthodes pour encapsuler les changements entre les classes. Merci supplémentaires:
- jloubert
- Hans
- Passant Jeff sternale
Pourquoi ne pas utiliser une classe abstraite qui définit les méthodes partagées et définitions abstraites pour les nécessaires qui ne sont pas mises en œuvre ? – alternative
Jetez un coup d'œil à "Code propre" par Robet C. Martin –
Vous ne devriez faire hériter 'Protocol1' de' Protocol2' que si cela a du sens. Vous devez demander, "est-ce que chaque Protocol1 est aussi une instance de Protocol2, dans le même sens que chaque Chat est un Mammifère?" Si c'est le cas, faites ce que vous pensez. Sinon, j'irais avec une classe de base abstraite, comme indiqué dans la réponse de Bobby. – jloubert