Nebenwirkungen minimieren (im Idealfall keine)
Eine Funktion, die 3 Änderungen an Zuständen außerhalb ihres eigenen Bereichs verursacht, ist viel schwieriger zu überlegen und beizubehalten als eine Funktion, die nur etwas eingibt und etwas anderes ausgibt. Sie können nicht nur wissen, was die Funktion bewirkt, Sie müssen sich auch daran erinnern, was sie bewirkt hat und wie sich dies auf alle anderen relevanten Funktionen auswirkt.
Für OOP bedeutet das Minimieren von Nebenwirkungen auch Klassen mit weniger Mitgliedern und insbesondere weniger Mitgliedern, die den Status der Klasse ändern können, da Mitgliedsfunktionen Zustände ändern können, die über ihre eigenen hinausgehen und Nebenwirkungen haben (sie können beispielsweise die Interna der Klasse manipulieren). Dies bedeutet auch, dass Klassen weniger eigene Datenelemente haben, sodass diese Methoden weniger manipulieren können und weniger Nebenwirkungen auftreten können.
Stellen Sie sich als einfaches Beispiel vor, Sie möchten eine ausgefallene Datenstruktur entwerfen, die einen sorted
Zustand beibehält, in dem ermittelt wird, ob binäre oder lineare Suchen ausgeführt werden sollen. In einem solchen Fall kann es nützlich sein, den Entwurf in zwei Klassen zu unterteilen. Wenn Sie sorted
die unsortierte Klasse aufrufen, wird möglicherweise eine Datenstruktur einer anderen Klasse zurückgegeben, deren Inhalt immer sortiert bleibt. Jetzt haben Sie weniger Nebenwirkungen (daher weniger fehleranfällig und einfacher zu verstehen) sowie allgemeineren Code (das frühere Design wäre sowohl für die Verarbeitung als auch für die menschliche intellektuelle Effizienz für kleine Arrays, die nie sortiert werden müssen, eine Verschwendung).
Vermeiden Sie überflüssige externe Abhängigkeiten
Möglicherweise können Sie den knappsten Code implementieren, den Sie sich bei maximaler Wiederverwendung von Code vorstellen können, indem Sie 13 verschiedene Bibliotheken verwenden, um eine relativ einfache Aufgabe auszuführen. Dies überträgt jedoch den intellektuellen Aufwand auf Ihre Leser, da diese mindestens Teile von 13 verschiedenen Bibliotheken verstehen müssen. Diese inhärente Komplexität sollte sofort von jedem gewürdigt werden, der versucht hat, eine Bibliothek von Drittanbietern zu erstellen und zu verstehen, für deren Funktion ein Dutzend anderer Bibliotheken abgerufen und erstellt werden musste.
Dies ist wahrscheinlich eine sehr kontroverse Ansicht, aber ich würde eine bescheidene Codeduplizierung dem entgegengesetzten Extrem vorziehen, vorausgesetzt, das Endergebnis ist gut getestet (nichts Schlimmeres als ungetesteter fehlerhafter Code, der vielfach dupliziert wurde). Wenn Sie die Wahl zwischen drei Zeilen duplizierten Codes zur Berechnung eines Vektorkreuzprodukts oder dem Einlesen einer epischen Mathematikbibliothek haben, um nur drei Codezeilen zu sparen, würde ich die erstere vorschlagen, es sei denn, Ihr gesamtes Team ist an Bord dieser Mathematikbibliothek An diesem Punkt könnten Sie noch überlegen, nur 3 Zeilen Code anstelle von 1 zu schreiben, wenn dies im Austausch für die Entkopplungsvorteile trivial genug ist.
Die Wiederverwendung von Code ist ein Spagat. Wenn Sie zu viel wiederverwenden und die intellektuelle Komplexität auf eine Eins-zu-Viele-Art übertragen, müssen die Leser und Betreuer in den oben gespeicherten drei Zeilen einfachen Codes weitaus mehr Informationen als drei Zeilen Code verstehen . Außerdem wird Ihr Code dadurch instabiler, da sich bei Änderungen an der Mathematikbibliothek möglicherweise auch Ihr Code ändert. Wenn Sie zu wenig wiederverwenden und den intellektuellen Aufwand vervielfachen, profitiert Ihr Code nicht mehr von zentralen Verbesserungen. Es ist also ein Balanceakt, aber die Idee, dass es sich um einen Balanceakt handelt, ist erwähnenswert, da der Versuch, jede kleine Form von bescheidener Vervielfältigung zu beseitigen, dazu führen kann zu einem Ergebnis, das genauso schwer zu halten ist, wenn nicht sogar mehr als das entgegengesetzte Extrem.
Teste den Mist draus
Dies ist eine Selbstverständlichkeit, aber wenn Ihr Code nicht alle Eingabefälle verarbeitet und einige Randfälle übersehen, wie können Sie dann erwarten, dass andere den von Ihnen geschriebenen Code beibehalten, den Sie nicht einmal richtig verstanden haben, bevor er auf ihre Augen und Hände übertragen wurde? Es ist schwierig genug, Code zu ändern, der perfekt funktioniert, geschweige denn Code, der nie ganz richtig war.
Darüber hinaus wird Code, der gründliche Tests besteht, im Allgemeinen weniger Gründe für Änderungen finden. Dies bezieht sich auf die Stabilität, die noch wichtiger ist als die Wartbarkeit, da stabiler Code, der niemals geändert werden muss, keine Wartungskosten verursacht.
Schnittstellendokumentation
Priorisieren Sie "was die Dinge tun" vor "wie die Dinge tun", wenn Sie nicht die gleiche Zeit für die Dokumentation beider Dinge aufwenden können. Eine klare Schnittstelle, die in ihren Absichten, was sie in allen möglichen Eingabefällen tun wird (oder zumindest was sie tun soll), offensichtlich ist, wird eine Klarheit des Kontexts für ihre eigene Implementierung ergeben, die nicht nur das Verständnis dessen leiten wird, wie um den Code zu benutzen, aber auch wie es funktioniert.
Während Code, dem diese Eigenschaften fehlen und der nicht einmal weiß, was er tun soll, SOL ist, egal wie gut die Implementierungsdetails dokumentiert sind. Ein 20-seitiges Handbuch zur Implementierung von Quellcode ist für Leute wertlos, die nicht einmal genau herausfinden können, wie er in erster Linie verwendet werden soll und was er in allen möglichen Szenarien tun soll.
Priorisieren Sie für die Implementierungsseite die Dokumentation Ihrer Aktivitäten, die sich von denen aller anderen unterscheiden. Beispielsweise verfügt Intel über eine begrenzte Volume-Hierarchie für seine Raytracing-Kernel. Da ich in diesem Bereich arbeite, kann ich den Großteil der Code-Aktivitäten auf einen Blick erkennen, ohne die Dokumentation zu durchsuchen. Sie machen jedoch etwas Einzigartiges, nämlich das Überqueren des BVH und das parallele Durchführen von Kreuzungen mit Strahlenpaketen . Hier möchte ich, dass sie ihrer Dokumentation Priorität einräumen, da diese Teile des Codes für die meisten historischen BVH-Implementierungen exotisch und ungewöhnlich sind.
Lesbarkeit
Dieser Teil ist sehr subjektiv. Die Lesbarkeit, die menschlichen Denkprozessen nahe kommt, ist mir eigentlich egal. Der am besten dokumentierte Code, der Dinge auf höchstem Niveau beschreibt, ist für mich immer noch schwer zu befolgen, wenn der Autor bizarre und verschlungene Denkprozesse verwendet, um ein Problem zu lösen. In der Zwischenzeit ist es für mich oft einfacher, einen Kurzcode mit 2 oder 3 Zeichen zu verstehen, wenn die Logik sehr einfach ist. Ich schätze, Sie könnten in einem Peer Review nachsehen, was andere bevorzugen.
Ich interessiere mich hauptsächlich für Wartbarkeit und vor allem Stabilität. Code, der keine Gründe für eine Änderung findet, hat keine Wartungskosten.