Ich habe oft gehört, dass nicht verwendeter Code aus dem Projekt gelöscht werden muss. Es ist mir jedoch nicht klar "warum?".
Meine Punkte für das Nichtlöschen sind:
- Code ist bereits geschrieben und es werden Anstrengungen unternommen
- Code kann in einer syntetischen und realen Umgebung getestet werden
- Wenn es gut organisiert ist (gruppiert, separates Paket, lose gekoppelt usw.), stört es Sie nicht bei der gesamten Code-Analyse oder beim Refactoring
- Code kann in Zukunft verwendet werden
- Nach dem Löschen kann sich der Autor unwohl fühlen
Könnte jemand die Vorteile des Löschens (oder Beibehaltens) von nicht verwendetem Code erklären?
refactoring
Alex Stamper
quelle
quelle
Antworten:
Hier sind einige Gründe, warum nicht verwendeter Code entfernt werden sollte:
Jeder, der neu an einem Projekt arbeitet, muss nicht nur den Arbeitscode verstehen, sondern auch nicht verwendetes Material. Dies ist Zeitverschwendung und schafft Verwirrung.
Es besteht die Gefahr, dass irgendwann jemand eine Änderung vornimmt, die versehentlich den "ruhenden" Code betrifft und Fehler verursachen kann. Ich weiß, dass es bei Projekten passiert ist, an denen ich gearbeitet habe.
Die Pflege eines Codes ist ein Verwaltungsaufwand. Durch die Beibehaltung des alten redundanten Codes wird diese Belastung erhöht. Das Zusammenführen von Änderungen im Hauptzweig wird beispielsweise schwieriger, da mehr Code verarbeitet werden muss und mehr Möglichkeiten bestehen, Fehler zu machen.
Was im Laufe der Zeit passiert, ist, dass immer mehr alter unbenutzter Code zur Codebasis hinzugefügt wird. Dies erhöht die Verwirrung, das potenzielle Missverständnis und den Verwaltungsaufwand.
Die Wahrscheinlichkeit, dass der nicht verwendete Code jemals wieder verwendet wird, ist sehr unwahrscheinlich. Mit der Zeit nimmt diese Möglichkeit der Wiederverwendung ab. Wenn Code entfernt werden soll und als wichtig genug angesehen wird, kann der Code verzweigt und dokumentiert werden.
Alle persönlichen Gefühle, die ein Codierer in Bezug auf Code hat, an dem er möglicherweise hart gearbeitet hat, sind verständlich. Aber um professionell zu sein, müssen diese Gedanken zum Wohle der Allgemeinheit beiseite gelegt werden. Zeit steht für niemanden und es gibt keinen Platz für die Aufbewahrung von historischem Code in einer funktionierenden Codebasis.
quelle
@suspectus hat die Gründe für das Löschen von Code hervorragend dargestellt. Ich möchte Ihre individuellen Aufzählungszeichen für die Aufbewahrung von Code ansprechen.
Wenn der bereits geschriebene Code jedoch nicht verwendet wird, sind dies nur Kosten ohne (zukünftigen) Wert. Es ist eine vergebliche Anstrengung, und die Erhaltung des nicht verwendeten Produkts dieser Bemühungen bestätigt diese Bemühungen nicht. Wir behalten Code bei, weil er jetzt nützlich ist und nicht als eine Art Denkmal für die Bemühungen der Autoren.
Es tut mir leid, ich weiß nicht, was du damit meinst.
Wenn es in der Codebasis vorhanden ist, egal wie gut es organisiert ist, trägt es zur Wartungs- und Verständnislast bei. Es kann zwar so organisiert werden, dass es weniger belastet wird, aber wenn es weg ist, ist es überhaupt keine Belastung.
In der Agile Schule sagen wir YAGNI : Du wirst es nicht brauchen. Ja, vielleicht haben Sie in Zukunft eine Verwendung dafür, aber wir können heute nicht genug über die Bedürfnisse von morgen wissen, um dies mit jeder Art von Zuverlässigkeit vorhersagen zu können. Anders zu denken ist Arroganz, die zur Hybris tendiert. Was wir über morgen wissen können , ist: Wir möchten, dass unsere Codebasis einfach zu ändern ist und nicht verwendeter Code diese Eigenschaft beeinträchtigt.
Der Autor muss darüber hinwegkommen. Wir haben alle Dinge geschrieben, die sich als nicht nützlich erwiesen haben - weitaus besser, um auf einen Code-Code verweisen zu können, der alle verwendet wird (weil die nicht verwendete Cruft gelöscht wurde), als auf einen Code-Body, von dem Sie sagen können ein paar Methoden, "und die ist tatsächlich in Gebrauch!"
quelle
Ist es nicht schwierig genug, Code aufzunehmen und die Absicht herauszufinden, aber jetzt müssen Sie herausfinden, welche Teile nicht verwendet werden?
quelle
Es ist auch unnötig. Wenn Sie es für nichts verwenden, ist es (per Definition) nutzlos, unabhängig davon, was es tut oder wie viel Aufwand dafür aufgewendet wurde.
Wenn es nutzlos ist, ist es immer noch nutzlos, selbst wenn Sie Tests haben. Wenn der Code nutzlos ist, sollten auch die Tests für ihn nutzlos sein (wenn Sie also den kommentierten Code dort belassen, entsteht Mehrdeutigkeit - behalten Sie die Tests bei? Wenn Sie den Clientcode des kommentierten Codes hatten, kommentieren Sie auch den Clientcode? )
Nicht so. Alle Ihre Tools (Quellcodeverwaltung, statische Analyse, Dokumentationsextraktor, Compiler usw.) werden langsamer ausgeführt, da sie mehr Daten verarbeiten müssen (und ein größerer oder kleinerer Teil dieser Daten Rauschen ist).
Wenn der Code andererseits nicht gut organisiert ist, werden statische Analysen, Refactoring und andere Probleme durcheinander gebracht.
Sie bringen Rauschen in die Eingabe Ihrer Werkzeuge ein und hoffen, dass sie damit richtig umgehen.
Was ist, wenn Ihr statisches Analysetool ein Verhältnis von Kommentaren zu Code berechnet? Sie haben es nur durcheinander gebracht, mit etwas, das bis gestern relevant war (oder wann immer der Code kommentiert wurde).
Am relevantesten ist jedoch, dass kommentierte Codeblöcke zu Verzögerungen beim Verständnis des Codes für Wartung und Weiterentwicklung führen und solche Verzögerungen fast immer viel kosten. Fragen Sie sich Folgendes: Wenn Sie die Implementierung einer Funktion verstehen müssen, worauf müssen Sie lieber achten? zwei Zeilen klaren Codes oder zwei Zeilen Code und weitere 26 Kommentare, die nicht mehr aktuell sind?
Wenn ja, finden Sie es im SCM Ihrer Wahl.
Wenn Sie ein kompetentes SCM verwenden und sich darauf verlassen, dass der tote Code erhalten bleibt (anstatt die Quelle zu überladen), sollten Sie nicht nur sehen, wer diesen Code gelöscht hat (Autor festschreiben), sondern aus welchem Grund (Nachricht festschreiben) und aus welchem anderen Grund Änderungen wurden zusammen mit ihm vorgenommen (der Rest der Unterschiede für dieses Commit).
So?
Sie sind (ich nehme an) ein ganzes Entwicklerteam, das dafür bezahlt wird, die beste Software zu entwickeln, die Sie können, und nicht "die beste Software, die Sie können, ohne die Gefühle von X zu verletzen".
Es ist Teil der Programmierung, dass der meiste geschriebene Code letztendlich verworfen wird. Zum Beispiel sagte Joel Spolsky irgendwann, dass für sein Unternehmen ungefähr 2% des geschriebenen Codes produziert werden.
Wenn Sie dem Ego der Entwickler Vorrang vor der Qualität der Codebasis einräumen, werden Sie die Qualität Ihres Produkts opfern, für ... was genau? Die Unreife Ihrer Entwicklerkollegen bewahren? Die unrealistischen Erwartungen Ihrer Kollegen schützen?
Bearbeiten: Ich habe einen triftigen Grund gesehen, auskommentierten Code in der Quelle zu belassen, und es ist ein sehr spezifischer Fall: Wenn der Code in einer seltsamen / nicht intuitiven Form geschrieben ist und die saubere Art des Umschreibens dies nicht tut arbeiten aus einem wirklich subtilen Grund. Dies sollte auch erst angewendet werden, nachdem wiederholt versucht wurde, das Problem zu beheben, und jedes Mal, wenn der Versuch denselben Fehler erneut eingeführt hat. In einem solchen Fall sollten Sie den kommentierten intuitiven Code als Kommentar hinzufügen und erklären, warum er nicht funktioniert (damit zukünftige Entwickler die gleiche Änderung nicht erneut versuchen):
quelle
Toter Code verschmutzt Ihren Code
Toter Code verringert die Verständlichkeit und Lesbarkeit.
Die besten Codes werden immer wiederverwendet, und wenn Sie tote Codes haben, wird die Wiederverwendbarkeit verringert
Wir basieren auf einem modularen Codierungsansatz, bei dem wir Codes für die Interaktion mit unseren Programmierkollegen entwerfen, nicht für eine Maschine. Wir sollten die meiste Energie einsetzen, um es ihm / ihr zu erleichtern, unseren Code zu verstehen. Die Maschine wird sowieso in Ordnung sein.
Toter oder kommentierter Code ist wie falsche Wegweiser, die nur Menschen verwirren. Vermeiden Sie ihn also um jeden Preis.
quelle
Umfassende Veränderungen . Wenn etwas, das überall im System geändert werden muss, auch im toten Code vorhanden ist, ändern Sie es? Es ist sehr schwer zu wissen, ob es definitiv nicht irgendwo verwendet wird, daher ist es immer ein Risiko. Und selbst wenn es nichts kaputt machen würde, würde der tote Code überhaupt funktionieren, wenn er nach dieser Änderung wieder verwendet würde?
Wenn es um eine umfassende Änderung geht, müssen die Entwickler auch jeden Ort überprüfen, der den Code enthält, und im Fall von totem Code ist dieser redundant. Und das Überprüfen dauert länger, wenn der Code tot ist, da es schwierig ist zu überprüfen, ob er nirgendwo verwendet wird.
Es ist äußerst wertvoll, wenn Sie wissen, dass ein Teil der Codebasis nicht verwendet wird, da Sie ihn dann entfernen können. Wenn Sie es bleiben lassen, kann es in Zukunft schwierig oder fast unmöglich sein, sicher zu sein, dass es tatsächlich nicht verwendet wird. Zum Beispiel einige Dinge, die Code auf überraschende Weise verwenden: Reflexion, dynamisches Aufrufen von Routinen, die aus Zeichenfolgen verkettet sind, Auswertung, Framework-Magie .
Wenn jedoch eine hohe Wahrscheinlichkeit besteht, dass Code in Zukunft verwendet wird, ist es einfacher, ihn hinzuzufügen, wenn er sich direkt neben dem anderen Code befindet, anstatt im Versionskontrollsystem. Möglicherweise erinnern Sie sich nach einer Weile nicht mehr an Wörter, die der Code enthielt, sodass es sehr schwierig sein kann, den Code aus dem Darm des VCS zu finden. Aber ich würde toten Code nur selten existieren lassen und selbst dann würde ich den Code auskommentieren.
quelle
Diese Liste mag einfach erscheinen, aber jede dieser Listen zeigt sich auf hunderte verschiedene Arten und fügt Widerstand hinzu, der während des gesamten Entwicklungsprozesses Synergien schafft. Die Ineffizienz kann oft auf einfache und mathematische Weise nachgewiesen oder nachgewiesen werden.
Als Antwort auf Ihre Punkte ...
Aber es muss oft gepflegt werden. Es wird auch noch in Dingen wie in Datei suchen angezeigt.
Ich bin mir nicht sicher, was du damit meinst. Ich denke, es ist das gleiche wie beim letzten Mal. Sie meinen, dass der Code bereits getestet wurde und eine Bereinigung möglicherweise einen erneuten Test erfordert. Das sind Kosten, die sich normalerweise lohnen, da sie sich in 90% der Fälle auszahlen und um zu vermeiden, dass sie vor Produktionsbeginn gereinigt werden sollten. Fast jeder Code hat zwei Iterationen, damit es funktioniert und sauber wird. Der Grund dafür ist, dass zweimal getestet werden muss, weil jemand den letzten Schritt übersprungen hat. Wenn Ihr Code auch zu teuer ist, um das Diff, den Test (was wahrscheinlich ist, wenn er mit viel unbenutztem Code unordentlich ist) usw. zu überprüfen, dann ist das ein weiteres ganzes Problem.
Ihr Code sollte sowieso so sein, aber das mildert das Problem nur mäßig. Es ist das seltsamste Argument zu hören, dass etwas organisiert und doch unrein sein sollte. Es ist normal zu versuchen, den Code modular zu halten und Abhängigkeiten zu reduzieren, aber Sie möchten auch wiederverwendbaren Code, und wenn alle Ihre Module eine Insel sind, sind Sie wahrscheinlich nicht trocken. Möglicherweise führen Sie auch eine übermäßige Entkopplung durch, die nichts anderes bewirkt, als das Problem nicht verwendeten unordentlichen Codes zu mindern.
Viele Leute legen Wert auf geschriebenen Code. Wenn es jetzt nicht verwendet wird, ist es Eigengewicht und in der Realität wird oft nur ein Bruchteil des nicht verwendeten Codes verwendet, wenn Sie diesen Pfad beschreiten. Höchstwahrscheinlich ist es nicht wahrscheinlich, dass nicht verwendeter Code verwendbarer oder verwendeter Code ist. Der am wahrscheinlichsten wiederverwendete Code ist bereits verwendeter Code, der etwas bewirkt.
Schlimmer ist, dass nicht verwendeter Code keinen Zweck hat. Wenn jemand vorbeikommt und etwas ändern muss, das sich auf nicht verwendeten Code auswirkt, wird er ratlos sitzen und herausfinden, was dieser nicht verwendete Code ohne Zweck tun muss.
Es ist leicht für die Leute, sich so zu fühlen, wenn sie anfangen, da Code viel Aufwand erfordert. Einmal fließend und daran gewöhnt, wird Code wie Fahrradfahren. Sie werden feststellen, dass die Kosten für das Schreiben eines solchen Codes sinken, wenn die Kosten für die Aufrechterhaltung des Codes sinken.
Dies ist das Problem des Autors. Einerseits ist es egoistisch, eine Menge unbenutzten Codes herumzulassen, damit andere damit umgehen müssen. Wenn ein Autor seine Gefühle über die Codequalität stellt, sollte er wahrscheinlich nicht codieren. Sie gehen die Straße entlang mit diesem von Ihnen können ihren Code nicht reparieren, wenn er kaputt ist, weil es ihre Gefühle verletzt. Es ist kein gutes Zeichen, wenn jemand an Code angehängt ist, nur weil er ihnen gehört und nicht weil er gut ist. Ein Autor sollte sich über die Bereinigung seines Codes freuen. Dies ist, als würde jemand Ihren Müll für Sie herausnehmen und in den Papierkorb werfen.
Ich wäre überglücklich, wenn jemand das für mich tun würde. Was es einfacher machen könnte, über diese Gefühle hinwegzukommen, ist, anstatt darauf zu warten, dass jemand anderes es tut, es selbst zu versuchen. Schreiben Sie einen Code, den Sie erstellt haben, iterativ neu, damit er eine bessere Leistung erzielt, sich präzise bewegt, weniger überschüssig und flexibler ist und jedes Mal weniger Code enthält. Versuchen Sie, sich nicht gut über die Menge des Codes zu fühlen, sondern darüber, wie viel Sie mit so wenig Code erreichen können. Dies ist mühsam, um ein höheres Level zu erreichen. Sobald Sie dies getan haben, wird Ihr gesamter Code auf einem guten Level angezeigt, sodass er nicht mehr so oft geebnet werden muss.
quelle
Zunächst sollten Sie immer ein Quellcodeverwaltungstool verwenden, um Ihre Projekte zu verwalten. Daher ist das Entfernen von nicht verwendetem Code eine gute Vorgehensweise, da Sie jederzeit die Quellcodeverwaltung verwenden können, um den entfernten Code abzurufen. Für mich ist der Grund für das Entfernen von nicht verwendetem Code, dass nur die Person, die den Code kennt, davon nicht weiß. Jemand anderes im Team wird auf diesen Code stoßen und versuchen herauszufinden, was er tut und wie er in die gesamte Anwendung passt und wird nach so viel Mühe enttäuscht sein, dass der Code überhaupt nicht verwendet wird :)
quelle
Diese Diskussion ist mehrere Jahre alt, aber ich bin gerade darauf gestoßen ...
Eine Sache, die ich nicht erwähnt habe, ist die Arbeit, die anfallen muss, um den nicht verwendeten Code zu entfernen. In vielen Fällen ist der Zeit- und Arbeitsaufwand zum Entfernen des nicht verwendeten Codes nicht trivial. Außerdem fallen in der Regel zusätzliche Kosten für das Testen und Dokumentieren des überarbeiteten Systems an. Nur eine weitere Sache, die im Entscheidungsprozess berücksichtigt werden muss.
quelle
Ich denke, dass Sie zwei Fälle haben können: - Anwendungscode: Wenn er nicht verwendet wird, ist er möglicherweise nicht getestet und wird im Laufe der Zeit nicht gewartet. Vielleicht können Sie zu einem "internen Code-Repository" wechseln. - API-Code: Wenn Sie eine Bibliothek schreiben, ist es meiner Meinung nach Eine bessere Wahl, um es zu pflegen, aber innerhalb Ihres aktiven Entwicklungsprozesses
quelle
Sind Sie sicher, dass der Code nicht verwendet wird?
Es reicht nicht aus, zu überprüfen, ob der Code noch kompiliert wird. In C ++, wenn Sie eine „nicht verwendet“ entfernen implizit definierte Methode wie
operator=
Sie nicht einen Compiler - Fehler in Gang zu bringen, wird die Klasse nur beginnen leise eine (möglicherweise falsch) Default - Implementierung zu verwenden. In Java oder C # kann der Code über Reflection verwendet werden. In objektorientierten Sprachen kann die Vererbung eine Rolle spielen (die Basisklasse kann jetzt aufgerufen werden). In fast jeder Sprache hat möglicherweise eine andere überladene Funktion übernommen.Überprüfen Sie das Alter des Codes in der Versionskontrolle, nicht nur, dass er nicht verwendet wird. Ich habe Code gesehen, der unbenutzt aussah, aber gerade festgeschrieben wurde und tatsächlich der erste Schritt in einem anderen Entwicklerprojekt war.
Entfernen Sie nicht verwendeten Code aggressiv
Sie zahlen für die Pflege des Codes:
#include
Änderungskette, die eine neue Überlastung des nicht verwendeten Codes einführte, was zu angemessenen Kopfschmerzen für jeden Ingenieur in einem Team von Dutzenden von Entwicklern führte.Ich würde sagen, dass im Wesentlichen der gesamte Code, den der durchschnittliche Entwickler schreibt, innerhalb von fünf Jahren nicht mehr verwendet wird, sodass diese Aktivität niemals aufhört. Lass das nicht du sein; Schreiben Sie nur hochwertigen und absolut notwendigen Code.
quelle