So vermeiden Sie Code-Duplizierung [geschlossen]

7

Ich habe drei C # -Methoden, die fast identisch funktionieren. Genauer gesagt, es gibt eine große Menge an Codewiederholung, aber am Ende führen sie verschiedene Funktionen aus.

Dies ist offensichtlich sehr ineffizient, also, was ist der beste Weg, um Code-Duplizierung zu reduzieren? Sollte ich alles in einer Methode platzieren und einen Schalter & amp; enum für die unterschiedliche Funktionalität am Ende? Alternativ gibt es eine Art, wie Sie 3 separate Klassen haben und das gemeinsame Bit von einem anderen erben können? Ich habe viel darüber gelesen, und von dem, was ich daraus entnehmen kann, werden nur Eigenschaften einer ganz anderen Klasse gewonnen.

    
Jonathan 03.12.2010, 09:13
quelle

9 Antworten

5

Ohne den Code zu sehen, ist es schwierig, ein konkretes Beispiel zu geben, aber es klingt so, als ob Sie eine Delegateninstanz in die Methode übernehmen möchten.

    
Steven Keith 03.12.2010, 09:17
quelle
4

Aus meiner Sicht sollten Sie sich mit einem Stück Papier und einem Stift hinsetzen. Zeichnen Sie alle Funktionen auf, die Ihre Methoden ausführen. Denken Sie daran, dass eine Funktion / Methode eine und nur eine Sache machen sollte.

Nachdem Sie jede Funktion heruntergebremst haben, werden Sie anfangen, Dinge zu sehen, die wiederholt werden, diese sollten in einer Funktion zusammengefasst werden.

    
Luca Matteis 03.12.2010 09:17
quelle
4
  

Ich habe hauptsächlich drei C # -Methoden   mache identische Dinge. Es gibt viel   Code-Wiederholung, aber am Ende, sie   beide führen unterschiedliche Funktionen aus.

Wenn Sie diese Zeile lesen, denke ich, dass Ihre drei Methoden unterschiedliche Implementierungen basierend auf verschiedenen Szenarien haben.

Ich würde vorschlagen, Stratgey Pattern einmal zu sehen, was nützlich sein könnte. Siehe hier

    
TalentTuner 03.12.2010 09:19
quelle
3

Es ist ein gutes Zeichen, dass es Sie nervt.

  

Das ist offensichtlich sehr ineffizient

Die Ineffizienz (etwas mehr Speicherverbrauch) ist heutzutage der unwichtigste Teil. Was schlimm ist, ist, dass es ein Alptraum ist. Wenn Sie beispielsweise einen Fehler in der Routine finden und beheben, müssen Sie daran denken, auch den doppelten Code zu korrigieren. Sie möchten auf jeden Fall doppelten Code herausfiltern, wenn Sie können.

  

Alternativ, gibt es eine Art, wie Sie 3 separate Klassen haben und das gemeinsame Bit von einem anderen erben können? Ich habe viel darüber gelesen, und von dem, was ich daraus entnehmen kann, werden nur Eigenschaften einer ganz anderen Klasse gewonnen.

Eine Unterklasse kann direkt auf alle öffentlichen und geschützten Mitglieder ihrer Oberklasse zugreifen. Wenn Sie beispielsweise eine Animal -Klasse mit einer Poop() -Methode haben, können die Unterklassen Dog und Cat diesen Code teilen.

Aber es gibt viele Möglichkeiten, diese Katze zu enthäuten. Schwer zu sagen, was am besten ist, ohne mehr Details.

    
Mud 03.12.2010 09:30
quelle
2

Können Sie etwas wie folgt tun:

%Vor%     
decyclone 03.12.2010 09:19
quelle
2

Es gibt keine Lösung, die in allen Fällen funktionieren würde, zeigen Sie uns den Code.

Das Problem besteht darin, dass Sie, wenn Sie den Code in eine Funktion einfügen und einen kleinen Teil des Verhaltens im Inneren ändern, die Komplexität des Codes erhöhen, und manchmal ist es besser, etwas doppelten Code zu behalten.

Fast das gleiche Argument funktioniert für die Vererbung. Sie können den allgemeinen Code problemlos in eine gemeinsame Vorgängerklasse einfügen, aber wenn Sie routinemäßig die Vererbung als Werkzeug zur Wiederverwendung von Code verwenden, kann Ihr Design in eine Welt der Schmerzen geraten. Vererbung bedeutet, dass Code in einem Codeabschnitt das Verhalten in anderen Codeabschnitten beeinflussen kann und bevor Sie es kennen, haben Sie einen vernetzten Code-Ball, der fast unmöglich zu ändern ist, ohne zu brechen.

Es ist normalerweise am besten, wenn Sie aus diesen drei Funktionen einen sinnvollen gemeinsamen Teil des Codes extrahieren oder abstrahieren können. Etwas, das Sinn macht, wie ein Muster auf hoher Ebene, anstatt nur ein paar allgemeine Linien, die keine kohärente Arbeit leisten. Eine einfache Regel, die Ihnen helfen kann, ist den extrahierten Code zu benennen: Gibt es einen offensichtlichen, natürlichen Weg, den Chunk zu benennen? Passt es offensichtlich in einen Ihrer Klassen? Wenn dies der Fall ist, könnte es eine gute Lösung sein. Wenn Sie es schwer haben, es zu benennen, und es könnte so ziemlich überall gehen, möchten Sie vielleicht ein bisschen mehr denken.

    
zoul 03.12.2010 09:22
quelle
2

Sie können versuchen, die Methode zu verallgemeinern, indem Sie sie zu einer übergeordneten oder generischen Funktion machen. Andere Ansätze, die Ihnen in den Sinn kommen, sind Entwurfsmuster wie die Template-Methode, mit der Sie das Skelett des Algorithmus definieren und Unterklassen bestimmte Schritte neu definieren können.

    
Nömmik 03.12.2010 09:30
quelle
1
%Vor%     
Pabuc 03.12.2010 09:41
quelle
0

Niemand erwähnt Lambda-Funktionen, sie müssen für .NET 3.5-Entwickler wissen:

%Vor%     
Budda 25.01.2011 00:02
quelle

Tags und Links