<tl;dr>
Ich konnte nicht alle wiederholten Antworten lesen, daher habe ich möglicherweise etwas verpasst (und werde es selbst wiederholen <= sehen, was ich hier getan habe?).
Hier ist die Liste von Dingen, die großartig sind, um das Duplizieren von Code zu verhindern!
- Einfacher zu testen: Sie müssen nur eine 'Kopie' des Codes testen.
- Einfacher zu beheben: Sie müssen den Fehler nur in einer 'Kopie' des Codes finden und ihn einmal beheben.
- Einfacher zu aktualisieren (wie oben): Erforderliche Änderungen können häufig durch Ändern des Codes an sehr wenigen Stellen vorgenommen werden, da Sie sich die Zeit genommen haben, den Code ordnungsgemäß wiederzuverwenden, und nicht dieselben Zeilen an Hunderten oder Tausenden von verschiedenen Stellen in der Quelle kopiert haben.
- Einfacher wiederzuverwenden: Wenn (nicht an wenigen Stellen dupliziert) und in allgemeinen Methoden mit passendem Namen aufbewahrt wird, ist es einfach, sie zu finden und zu verwenden, anstatt eigene Methoden zu schreiben.
- Einfacher zu lesen: duplizierter Code ist schwer zu lesen, weil er unnötig ausführlich ist. Es enthält viele Zeilen, die nicht Teil der Logik und der spezifischen beabsichtigten Funktionalität sind (z. B. allgemeine Befehle zum Einrichten der Bühne für die auszuführende Aktion oder allgemeine einfache wiederholte Aufgaben, die an vielen Stellen benötigt werden). Durch sauberen Code werden die Logik und die Funktionalität hervorgehoben, da keine Wiederholung den Code-Raum verschmutzt.
- Einfacher zu debuggen, da (1) und (5).
- Spart Zeit und Geld und macht in Zukunft noch mehr Spaß. speziell besser robuster Code erstellen. Dies ist die Quintessenz und es ist eine Zusammenfassung von so ziemlich allem oben Genannten. Wenn viele Benutzer dieselbe Funktion verwenden
doFoo1(a, b)
, ist die Wahrscheinlichkeit größer, dass viele der ärgerlichen Fehler und Randfälle aufgedeckt und behoben werden. Wenn jeder den Code kopiert und erstellt doFoo2(specialA)
... doFuu2^n(a, b, c)
dann dupliziert er die Probleme doFoo1
und erstellt konkret viel mehr Arbeit.
</tl;dr>
Lange Version:
Das Problem bei der Codeduplizierung besteht darin, dass sie "exponentiell wächst" (mit anderen Worten, sie wächst schnell), weil Sie beim Duplizieren von Code anderen unwissentlich die Erlaubnis erteilen (zum einen sind Sie nicht mehr in der Lage, sie zu beurteilen) und Sie ermutigen sie, dasselbe zu tun. Sie machen es auch schwieriger, dies nicht zu tun, da es schwieriger ist, nützlichen Code zu erkennen und wiederzuverwenden, wenn die Quelle viele verwirrende redundante Wiederholungen enthält. Vor allem, wenn der Code noch nicht in eine entsprechend benannte Funktion extrahiert wurde. Wenn Sie also auf ein allgemeines, einfach zu lösendes Problem stoßen, werden Sie wahrscheinlich selbst einen Teil des Codes schreiben, der das Problem löst. Und Sie werden wahrscheinlich nicht nach einigen Randfällen suchen und mehr fehlerhaften, nicht getesteten Code hinzufügen.
Eine andere Sache ist, dass dies für einen Anfänger wie ein Problem klingen mag, das nur große Unternehmen betrifft, aber ich fand, dass es winzige Startups nur sehr stark beeinträchtigt (wie in 10.000 Zeilen duplizierten serverseitigen Codes). Es ist ein Geisteszustand. Sie sollten DRY nicht nur beherrschen, sondern sich auch bemühen, andere zu ermutigen, dasselbe zu tun. denn sonst wirst du dich dazu verurteilen, den Code zumeist zu duplizieren. Wenn die DRY-Mittel zur Verfügung stehen und durchgesetzt werden, ist es viel einfacher, sie anzuwenden. Wenn es viel duplizierten Code gibt, ist es viel einfacher, Lösungen zum Kopieren und Einfügen anzuwenden.
Dinge, die ich bei der Code-Duplizierung als schädlich empfinde:
- Ist diese Funktion verwendbar? Nehmen wir an, Sie finden eine Funktion, die genau das tut (oder zu tun scheint, was Sie brauchen), woher wissen Sie, ob sie überhaupt richtig funktionieren soll oder ob es sich nur um Code handelt, der dupliziert und verworfen wurde.
- Redundanter Code. Manchmal duplizieren Leute Code, verwenden ihn und vergessen ihn (sie können ihn in Zukunft immer wieder duplizieren). Irgendwann entfernt jemand die Aufrufe der duplizierten Funktion an einigen Stellen, um sie umzugestalten, aber die nicht verwendete Funktion bleibt auch dann erhalten, wenn sie nicht aktiv verwendet wird.
- Schwer zu finden, wonach Sie suchen. Duplizierter Code nimmt Platz ein und macht das Auffinden nützlicher und benötigter Dinge (mithilfe von Tools wie grep) zu einer schwierigeren Aufgabe, als es sein muss, da Sie Dutzende oder Tausende von Ergebnissen erhalten, für die Sie nur eine Handvoll hätten haben sollen.
- (Wurde bereits erwähnt): Schwer zu pflegen, aber auch schwer für Wartungs- und Regressionszwecke zu verwenden. Wenn Testcode dupliziert und nicht richtig in Funktionen extrahiert wird, duplizieren andere ihn. Wird sich jemand die Mühe machen, eine benutzerfreundliche, einfach zu lesende API zu schreiben, um die Lebensqualität zu verbessern? Nach meiner Erfahrung gibt es oft etwas, das die Leute für dringlicher halten, bis es außer Kontrolle gerät.
- Codeduplizierung ist schwieriger zu lesen, da sie den Code ausführlich macht, wo er nicht sein muss, an Orten, an denen die Ausführlichkeit keine Informationen über die beabsichtigte Funktionalität hinzufügt: zum Beispiel generische Methodenaufrufe, die [immer und immer wieder] verwendet werden Legen Sie den Grundstein für mehrere Arten von beabsichtigter Funktionalität, und erschweren Sie es, dass diese tatsächliche Funktionalität herausspringt.
- Dies wurde viel erwähnt. Wenn der Code falsch ist, muss ein armer Freund oder eine arme Frau jede Verwendung dieses Codes suchen und ändern. Wenn zum Beispiel jemand einen unsicheren SQL-Injection-Aufruf von mysql_query an sehr wenigen Stellen in einer organisierten Klasse verwendet, wo er benötigt wird, wäre es einfach, ihn zu beheben und stattdessen PHP PDO zu verwenden, aber wenn er ihn an mehr als tausend Stellen verwendet und den Aufruf kopiert Außerdem muss der Code, um ihn zu reparieren, praktisch ausgelagert werden oder manchmal gefährlicher, und von Grund auf neu geschrieben werden.
- Das Kopieren von Code ist eine schlechte Angewohnheit. Wenn Sie etwas üben, wird es langsam zu einer zweiten Natur und wirkt sich auf die Menschen in Ihrer Umgebung aus. Junior Entwickler sehen, wie du es tust und tun es auch. Sie sollten üben, was Sie predigen, und sich angewöhnen, das Richtige zu tun. Sie lernen mehr. Das Schreiben von nicht dupliziertem Code ist schwieriger und herausfordernder. Es ist eine lohnende Angewohnheit.
Letzte Anmerkungen zur Verhinderung übereifriger Codeduplizierung und Zusammenfassung:
Dies wurde auch schon früher gesagt, aber manchmal führt das Vermeiden von Duplikaten dazu, dass Sie sich "nach hinten beugen" und Dinge tun, die zu raffiniert (oder unwichtig) sind, als dass andere sie verstehen könnten. Das Schreiben von nicht lesbarem Code (oder, wie wir es scherzhaft nennen, „Jobbewahrungscode“) ist ein Problem an sich, auch wenn die Vermeidung von Code-Duplikaten keine Rolle spielt. Ich bin jedoch der Meinung, dass es viel einfacher ist, Code-Duplikationen zu vermeiden, wenn die richtige Infrastruktur und die richtigen Best Practices von Anfang an eingesetzt werden. Oftmals kann man es vermeiden, unintuitive Dinge zu tun Du machst es von Anfang an richtig.
Was macht man richtig? Nun, das ist eine schwer zu beantwortende Frage, aber eine Sache ist, zu definieren, welche Methoden für das Projekt benötigt werden und zu sehen, was bereits von anderen (außerhalb und innerhalb des Unternehmens) implementiert wurde, und dies, wenn möglich, wiederzuverwenden. Dokumentieren Sie alles, was Sie zur Codebasis hinzufügen, und versuchen Sie, sie allgemeiner zu gestalten, als es sein muss, aber das war's. Übertreiben Sie Designmuster nicht, um den Code flexibel zu machen, wo er nicht sein muss.