Sie haben Recht - Kopieren-Einfügen funktioniert hervorragend, und DRY hat keinen Sinn, wenn Sie ein Programm erstellen müssen, für das weder die kopierte Vorlage noch die Kopie in Zukunft beibehalten oder weiterentwickelt werden müssen. Wenn diese beiden Softwarekomponenten einen völlig unterschiedlichen Lebenszyklus haben, kann die Kopplung durch Umgestaltung des gemeinsamen Codes in eine gemeinsame Bibliothek, die sich selbst in starker Entwicklung befindet, tatsächlich unvorhersehbare Auswirkungen auf den Aufwand haben. Auf der anderen Seite haben alle diese Teile beim Kopieren von Codeabschnitten in einem Programm oder Programmsystem normalerweise den gleichen Lebenszyklus. Ich werde im Folgenden erläutern, was dies für DRY und das Projektmanagement bedeutet.
Im Ernst, es gibt viele solcher Programme: Zum Beispiel produziert die Computerspielindustrie viele Programme, die über einen kurzen Zeitraum von höchstens einigen Monaten oder einem Jahr gepflegt werden müssen, und wenn diese Zeit abgelaufen ist, kopieren Sie sie Der alte Code aus einem früheren Spiel, bei dem die Wartungszeit überschritten wurde, in die Codebasis eines neuen Spiels ist vollkommen in Ordnung und kann die Dinge beschleunigen.
Leider unterscheidet sich der Lebenszyklus der meisten Programme, mit denen ich in den letzten Jahren zu tun hatte, erheblich davon. 98% der Anforderungen oder Bugfix-Anfragen, die bei mir eingingen, waren Änderungsanfragenfür bestehende Programme. Und wann immer Sie etwas an einer vorhandenen Software ändern müssen, funktioniert "Projektmanagement" oder Planung am besten, wenn Ihre Test- und Debug-Bemühungen recht gering sind - was nicht der Fall ist, wenn Sie etwas an einem Ort ändern, sondern aufgrund von Kopien - Vergangene Geschäftslogik, die Sie leicht vergessen, dass Sie ein Dutzend weiterer Stellen in der Codebasis ändern müssen. Und selbst wenn Sie es schaffen, alle diese Orte zu finden, ist die Zeit, um sie alle zu ändern (und die Änderungen zu testen), wahrscheinlich viel höher, als wenn Sie nur einen Ort zum Ändern haben. Selbst Sie können eine genaue Schätzung der Änderung vornehmen, da die Kosten ein Dutzend Mal höher sind als erforderlich, und dies kann leicht zu einer Kollision mit dem Projektbudget führen.
TLDR - Wenn Sie ein Programm entwickeln, bei dem keine Notwendigkeit oder Verantwortung für die Fehlerbehebung und Wartung des Originals oder der Kopie besteht, können Sie es jederzeit kopieren. Aber wenn Sie, Ihr Team oder Ihr Unternehmen dafür verantwortlich sind oder verantwortlich werden könnten, wenden Sie DRY an, wann immer Sie können.
Beispiel
Lassen Sie mich als Nachtrag erläutern, was "Fehlerbehebung und Wartung" bedeutet und wie dies zu Unvorhersehbarkeit bei der Planung führt, insbesondere innerhalb eines Produkts, und zwar anhand eines Beispiels aus der Praxis. Ich habe in der Tat gesehen, dass solche Dinge in der Realität passieren, wahrscheinlich nicht mit 100 Instanzen, aber die Probleme können sogar beginnen, wenn Sie nur eine doppelte Instanz haben.
Die Aufgabe: 100 verschiedene Berichte für eine Anwendung erstellen, wobei jeder Bericht sehr ähnlich aussieht, einige Anforderungsunterschiede zwischen den Berichten, eine andere Logik, aber insgesamt nicht viele Unterschiede.
Der Entwickler, der diese Aufgabe erhält, erstellt die erste (sagen wir, es dauert 3 Tage). Nach einigen Änderungen oder kleineren Fehlerbehebungen aufgrund von Qualitätssicherung und Kundeninspektion läuft sie anscheinend einwandfrei. Dann fing er an, den nächsten Bericht zu erstellen, indem er das Ganze kopierte und änderte, dann den nächsten und für jeden neuen Bericht durchschnittlich ~ 1 Tag. Auf den ersten Blick sehr vorhersehbar ...
Nachdem die 100 Berichte "fertig" sind, geht das Programm in die reale Produktion und es treten einige Probleme auf, die während der Qualitätssicherung übersehen wurden. Vielleicht gibt es Leistungsprobleme, vielleicht stürzen die Berichte regelmäßig ab, vielleicht funktionieren andere Dinge nicht wie beabsichtigt. Nach Anwendung des DRY-Prinzips konnten 90% dieser Probleme gelöst werden, indem die Codebasis an einer Stelle geändert wurde. Aufgrund des Copy-Paste-Ansatzes muss das Problem jedoch 100-mal und nicht nur einmal gelöst werden. Und aufgrund der Änderungen, die bereits von einem Bericht auf einen anderen angewendet wurden, kann der Entwickler den Fix für den ersten Bericht nicht schnell auf den anderen 99 kopieren und einfügen. Er muss alle 100 Berichte überprüfen, lesen und die Änderung in den geänderten übersetzen melden, testen und eventuell jedes einzeln debuggen. Für die PM, das wird langsam sehr schwierig - er kann sich natürlich die Zeit für eine "normale" Fehlerbehebung nehmen (sagen wir mal 3 Stunden) und diese mit 100 multiplizieren, aber tatsächlich ist dies höchstwahrscheinlich eine falsche Schätzung, einige der Fehlerbehebungen könnten sein leichter zu machen als andere, andere könnten schwerer sein. Und selbst wenn diese Einschätzung korrekt ist, kostet es Sie eine Menge Geld, wenn das Debugging 100-mal so hoch ist, wie es sein musste.
Das gleiche passiert beim nächsten Mal, wenn der Kunde die Änderung der Farbe seines Firmenzeichens in all diesen Berichten, die Konfiguration der Seitengröße oder eine andere neue Anforderung, die alle Berichte auf ähnliche Weise betrifft, anfordert. In diesem Fall können Sie eine Schätzung der Kosten vornehmen und dem Kunden das 100-fache des Preises in Rechnung stellen, den er zu zahlen hätte, wenn der Code TROCKEN gewesen wäre. Versuchen Sie dies jedoch ein paar Mal, und der Kunde bricht das Projekt ab, da er wahrscheinlich nicht bereit ist, Ihre exorbitanten Entwicklungskosten zu bezahlen. Und vielleicht wird dann jemand die Frage stellen, warum dies passiert ist, und mit dem Finger auf die Person zeigen, die die Entscheidung für diese Copy-Paste-Programmierung getroffen hat.
Mein Punkt ist: Wenn Sie Software für andere erstellen, haben Sie zumindest für kurze Zeit die Verantwortung, die Sache zum Laufen zu bringen, Fehler zu beheben, das Programm an sich ändernde Anforderungen anzupassen usw. Auch in einem Projekt auf der grünen Wiese, diese Teile können sich schnell zu weit mehr als dem ursprünglich geplanten Entwicklungsaufwand summieren. Und insbesondere, wenn sich der gesamte kopierte Code in einem Produkt befindet, ist der Zeitraum der Verantwortung für alle Teile gleich. Dies unterscheidet sich erheblich von der Situation, in der Sie älteren Code aus einem toten Projekt, das nicht mehr vorhanden ist, kopiert haben unter aktiver Wartung.