Dies ist wie eine ausgleichende Frage in meinem Kopf ohne einfache richtige und falsche Antwort. Ich werde einfach meine persönlichen Erfahrungen hier teilen, einschließlich meiner eigenen Tendenzen und Fehler während meiner Karriere. YMMV erheblich.
Als Einschränkung arbeite ich in Bereichen, die einige sehr große Codebasen beinhalten (Millionen von LOC, manchmal jahrzehntelanges Erbe). Ich arbeite auch in einem besonders besonderen Bereich, in dem kein Kommentar oder keine Klarheit des Codes zwangsläufig dazu führen kann, dass ein kompetenter Entwickler verstehen kann, was die Implementierung tut (wir können nicht unbedingt einen anständigen Entwickler nehmen und ihn dazu bringen, die Implementierung eines Zustands zu verstehen Implementierung der Fluiddynamik auf dem neuesten Stand der Technik basierend auf einem vor 6 Monaten veröffentlichten Artikel, ohne dass er viel Zeit außerhalb des Codes damit verbringt, sich auf diesen Bereich zu spezialisieren. Dies bedeutet im Allgemeinen, dass nur wenige Entwickler einen bestimmten Teil der Codebasis effektiv verstehen und pflegen können.
Aufgrund meiner besonderen Erfahrungen und vielleicht in Verbindung mit der Besonderheit dieser Branche fand ich es nicht mehr produktiv, SoC, DRY zu verwenden, um Funktionsimplementierungen so lesbar wie möglich zu machen und sogar die Wiederverwendbarkeit bis an die äußersten Grenzen zugunsten von YAGNI, Entkopplung, Testbarkeit, Schreiben von Tests, Dokumentation der Benutzeroberfläche (damit wir zumindest wissen, wie eine Schnittstelle verwendet wird, auch wenn die Implementierung zu viel Fachwissen erfordert) und letztendlich Versand der Software.
Legoblöcke
Eigentlich war ich zu einem früheren Zeitpunkt meiner Karriere geneigt, in die entgegengesetzte Richtung zu gehen. Ich war so begeistert von funktionaler Programmierung und Richtlinienklassenentwürfen in Modern C ++ Design und Vorlagen-Metaprogrammierung und so weiter. Insbesondere war ich von den kompaktesten und orthogonalsten Designs begeistert, bei denen Sie all diese kleinen Funktionen (wie "Atome") haben, die Sie auf scheinbar unendliche Weise miteinander kombinieren (um "Moleküle" zu bilden), um die gewünschten Ergebnisse zu erzielen. Ich wollte fast alles als Funktionen schreiben, die aus wenigen Codezeilen bestanden, und an einer so kurzen Funktion ist nicht unbedingt etwas von Natur aus falsch (sie kann immer noch sehr weit anwendbar sein und Code klarstellen). außer dass ich anfing, in die dogmatische Richtung zu gehen und zu denken, mein Code habe etwas falsch gemacht, wenn eine Funktion mehr als ein paar Zeilen umfasste. Und ich habe ein paar wirklich nette Spielsachen und sogar einen Produktionscode aus dieser Art von Code herausgeholt, aber ich habe die Uhr ignoriert: die Stunden, Tage und Wochen, die vergehen.
Insbesondere während ich die Einfachheit jedes kleinen "Legoblocks" bewunderte, den ich auf unendliche Weise kombinieren konnte, ignorierte ich die Zeit und die geistige Kraft, die ich in das Zusammensetzen all dieser Blöcke steckte, um eine ausgeklügelte "Erfindung" zu bilden. Darüber hinaus ignorierte ich in den seltenen, aber schmerzhaften Fällen, in denen etwas mit der aufwändigen Erfindung schief gelaufen war, absichtlich die Zeit, die ich damit verbrachte, herauszufinden, was schief gelaufen war, indem ich eine scheinbar endlose Reihe von Funktionsaufrufen verfolgte, die jedes einzelne dezentrale Legostück und jede Untergruppe von analysierten ihre Kombinationen, wenn das Ganze viel einfacher gewesen wäre, wenn es nicht aus diesen "Legos" gemacht worden wäre, wenn man so will, und nur als eine Handvoll fleischigerer Funktionen oder als mittelschwere Klasse geschrieben.
Trotzdem schloss sich der Kreis und als die Fristen mich zwangen, mir der Zeit bewusster zu werden, wurde mir klar, dass meine Bemühungen mich mehr darüber lehrten, was ich falsch machte als was ich richtig machte . Ich begann hier und da wieder die fleischigere Funktion und das Objekt / die Komponente zu schätzen, dass es pragmatischere Möglichkeiten gibt, ein angemessenes Maß an SoC zu erreichen, wie David Arno
durch Trennen der Dateieingabe von der Zeichenfolgenverarbeitung gezeigt wird, ohne dass die Zeichenfolgenverarbeitung notwendigerweise bis zum Äußersten zerlegt wird körnige Ebene vorstellbar.
Fleischigere Funktionen
Und noch mehr, ich fing an, mit einigen Code-Duplikationen, sogar einigen logischen Duplikationen, einverstanden zu sein (ich sage nicht Copy and Paste-Codierung, alles, worüber ich spreche, ist "Balance" zu finden), vorausgesetzt , die Funktion ist nicht anfällig wiederholte Änderungen vorzunehmen und in Bezug auf seine Verwendung dokumentiert und vor allem gut getestet, um sicherzustellen, dass seine Funktionalität korrekt mit der Dokumentation übereinstimmt und dies auch bleibt. Mir wurde klar, dass Wiederverwendbarkeit weitgehend mit Zuverlässigkeit verbunden ist .
Mir ist klar geworden, dass selbst die fleischigste Funktion, die immer noch einzigartig genug ist, um nicht zu eng anwendbar und zu klobig zu sein, um sie zu verwenden und zu testen, selbst wenn sie eine Logik in einigen entfernten Funktionen an anderer Stelle in der Codebasis dupliziert und vorausgesetzt, dass sie vorhanden ist Gut getestet und zuverlässig, und die Tests stellen vernünftigerweise sicher, dass dies auch so bleibt. Sie sind der am meisten zerlegten und flexiblen Kombination von Funktionen vorzuziehen, denen diese Qualität fehlt. Ich mag einige der fleischigeren Sachen heutzutage gut genug, wenn sie zuverlässig sind .
Es scheint mir auch , dass die meisten der Zeit, es ist billiger zu realisieren Sie sind Gonna Bedürfnis , etwas im Nachhinein und fügen Sie es, sofern der Code zumindest empfänglich ohne Kaskadierung Höllenfeuer zu neuen Ergänzungen ist, als auf Code alle möglichen Dinge , wenn Sie aren Ich werde es nicht brauchen und mich dann der Versuchung stellen, alles zu entfernen, wenn es anfängt, eine echte PITA zu werden, die es zu pflegen gilt.
Das habe ich also gelernt. Dies sind die Lektionen, die ich für notwendig erachtet habe, um sie im Nachhinein in diesem Zusammenhang persönlich zu lernen, und als Einschränkung sollte sie mit einem Körnchen Salz eingenommen werden. YMMV. Aber hoffentlich kann dies für Sie von Nutzen sein, wenn es darum geht, die richtige Balance zu finden, um Produkte zu versenden, die Ihre Benutzer innerhalb eines angemessenen Zeitraums glücklich machen und sie effektiv warten.