Zunächst möchte ich mich in dieser Frage von der Polemik fernhalten, ob das Kommentieren von Quellcode gut oder schlecht ist. Ich versuche nur klarer zu verstehen, was die Leute meinen, wenn sie über Kommentare sprechen, die Ihnen sagen, WARUM, WAS oder WIE.
Wir sehen oft Richtlinien wie "Kommentare sollten Ihnen sagen, WARUM; Code selbst sollte Ihnen sagen, WIE". Es ist leicht, der Aussage auf abstrakter Ebene zuzustimmen. Allerdings lassen die Leute dies normalerweise wie ein Dogma fallen und verlassen den Raum ohne weitere Erklärung. Ich habe gesehen, dass dies an so vielen verschiedenen Orten und in so unterschiedlichen Kontexten verwendet wird, dass es so aussieht, als könnten sich die Leute auf den Slogan einigen, aber sie scheinen ganz über verschiedene Dinge zu reden.
Zurück zur Frage: Wenn Kommentare sagen sollten, WARUM, worüber reden wir dann? Ist das der Grund, warum dieses Stück Code überhaupt existiert? Ist es das, was der Stückcode tun soll? Ich wäre sehr dankbar, wenn jemand eine klare Erklärung abgeben und dann einige gute Beispiele hinzufügen könnte (schlechte Beispiele werden nicht wirklich benötigt, können aber als Kontrast verwendet werden).
Es gibt viele Fragen, ob Kommentare gut oder schlecht sind, aber keine, die sich mit der spezifischen Frage befassen, was gute Beispiele für Kommentare sind, die Ihnen sagen, WARUM.
quelle
There are many questions on whether comments are good or bad, but no one that addresses the specific question of what are good examples of comments that tell you WHY.
Wenn jeder ein gültiges Beispiel liefert, dann sind alle die richtigen Antworten. Das Format dieser Website soll einen Frage- und Antwortprozess ermöglichen, bei dem nicht alle Antworten gleich sind.Antworten:
Das häufigste und markanteste Beispiel sind Kommentare zu verschiedenen Problemumgehungen. Zum Beispiel dieses:
Weitere Beispiele finden Sie sicherlich in Git- und Linux-Quellen. Beide Projekte versuchen, diese Regel zu befolgen.
Ich empfehle außerdem, diese Regel bei Commit-Protokollen noch strenger einzuhalten . Bei Codekommentaren kann es vorkommen, dass Sie den Code korrigieren, aber vergessen, den Kommentar zu aktualisieren. Mit der Menge an Code in einem normalen Projekt wird dies früher oder später garantiert. Zum anderen ist das Commit-Protokoll an die jeweilige Änderung gebunden und kann über die Funktionen "Annotate" / "Blame" des Versionskontrollsystems abgerufen werden. Auch hier haben Git und Linux einige gute Beispiele.
Schau dir zB dieses Commit an . (hier nicht kopieren, es ist zu lang). Es enthält vier Absätze, die fast die ganze Seite (und ein bisschen mehr als die Bildschirmseite) umfassen und beschreiben, was genau falsch war und warum es falsch war. Sie verwenden Kommentare wie diese für zwei Zwecke:
(Hinweis: Es dauerte höchstens 10 Minuten, bis ich das Git-Repo nach dem Zufallsprinzip durchsucht hatte, um diese beiden Beispiele zu finden. Es wäre also sicher einfach, dort mehr zu finden.)
quelle
In einem Kommentar erfahren Sie, warum der Code begründet wurde. Beispiel:
In einem Kommentar erfahren Sie, wie der Code funktioniert.
Der Unterschied ist, dass ein Betreuer sich den ersten ansehen und sagen kann: "Oh, das könnte also veraltet sein!" Im zweiten Fall hat der Betreuer einen Kommentar, der Ihnen nichts sagt, was der Code selbst nicht preisgibt (unter der Annahme guter Variablennamen).
Hier ist ein Beispiel aus der Praxis eines Warum-Kommentars aus einem iOS-Code, an dem ich gearbeitet habe, um eine Gateway-Adresse zu erhalten (oder eine vernünftige Vermutung dafür). Ich hätte einfach die Kommentare hinterlassen können, die Dinge wie "Initialize the receive socket" sagten, aber das würde einem Betreuer (oder mir in Zukunft) nur sagen, was passiert ist, und nicht, warum ich diesen seltsamen Fehler machen musste, um die Gateway-Adresse im zu bekommen erster Platz.
quelle
Ich möchte meine Antwort mit einem Zitat von Jeff Atwood in seinem Blog - Post gemacht Start - Code erfahren Sie , wie, Kommentare Sagen Sie , warum :
Er stellt auch fest, dass:
Ich stimme vollkommen zu und an dieser Stelle muss ich hinzufügen, dass ich, bevor ich anfangen kann, den Code so einfach wie möglich zu gestalten, den Code zum Laufen bringen und dann mit dem Refactoring beginnen kann. Während des ersten Durchlaufs vor dem Refactoring hilft das Hinzufügen von Kommentaren sehr.
Wenn Sie beispielsweise 3 verschachtelte Schleifen mit zweidimensionalen Hashtabellen verwenden, um eine Tabelle mit Wochentagen zu füllen, während Sie Daten analysieren, verlieren Sie leicht den Überblick darüber, was jemand oder auch Sie selbst getan haben, wenn Sie einige Wochen lang nicht darauf geachtet und plötzlich umgestaltet haben.
Das obere Beispiel zeigt, wie drei verschachtelte Schleifen vor dem Refactoring funktionieren.
Das Erklären einiger Verzweigungsbedingungen kann helfen, den Code besser zu verstehen, wenn man daran denkt:
Sogar einfacher und offensichtlicher Code funktioniert gut mit Kommentaren. Nur um die Dinge für Kollegen und sogar für sich selbst bei der Pflege von Software ein wenig offensichtlicher, klarer oder verständlicher zu machen.
Sicher, XP gibt an, dass Code selbsterklärend ist, aber tut ein einzeiliger Kommentar weh?
Ich finde auch die folgenden Regeln in diesem Blog sehr hilfreich:
Jeder, der wieder in seinen eigenen Code oder in einen anderen oder sogar älteren Code zurückkehren muss, weiß, dass dies Kopfschmerzen verursachen kann. Anstatt also faul zu sein oder zu versuchen, ein Übercodierer zu sein, der nichts oder nur sehr wenig kommentiert, sollten Sie sich selbst oder einen armen Kerl, der Ihren Code warten muss, das zukünftige Leben erleichtern, indem Sie die angegebenen Regeln befolgen.
Auch viele Programmierentscheidungen werden bei Überprüfungen angezweifelt, und es ist nicht immer klar, warum einige Teile so geschrieben wurden, wie sie waren, auch wenn einige Codeabschnitte aufgrund eines schwerwiegenden Fehlers, der bei der Verwendung des Codes im Laufe der Jahre festgestellt wurde, für das Funktionieren eines Programms von entscheidender Bedeutung sind . Also, um Sie nicht alle mit einem Wort zu langweilen, schließen Sie mit einem letzten Zitat aus acmqueue :
quelle
int directionCode = (x > oldX) ? DIRECTIONCODE_RIGHT : (x > oldX) ? DIRECTIONCODE_LEFT : DIRECTIONCODE_NONE;
wird, fehlerhaft ist. Sicher sollte es sein... (x < oldX) ? DIRECTIONCODE_LEFT : DIRECTIONCODE_NONE;
. Gute Kommentarideen - schlechter Code.Ich neige dazu, Kommentare auf Verweise zu beschränken, in denen eine bestimmte Funktionalität / ein bestimmter Code ausführlicher erklärt wird, oder zu erklären, warum eine bestimmte Art der Programmierung gewählt wird.
In Anbetracht der Tatsache, dass andere Programmierer mit ähnlichen Fähigkeiten Ihren Code verwenden oder lesen, ist es wichtig zu kommentieren, wenn Sie eine andere als die erwartete Methode verwenden, um etwas zu erreichen. Sie können also in einem Kommentar erklären, warum Sie sich für diesen Weg entschieden haben.
Wenn Sie beispielsweise zwei verschiedene Sensoren auf einem Android-Gerät verwenden können und einer nicht Ihren Anforderungen entspricht, können Sie im Kommentar erläutern, warum Sie den anderen gewählt haben.
Das "Warum" sollte also eine Begründung für Ihre getroffenen Entscheidungen geben.
quelle
Kommentare sollten Ihnen sagen, was der Code nicht tut, und nicht unbedingt durch WARUM , WIE oder WAS abgegrenzt sein . Wenn Sie gute Namen und klar umrissene Funktionen haben, ist es durchaus möglich, dass der Code Ihnen genau sagt, was los ist. Zum Beispiel:
Dieser Code benötigt wirklich keine Kommentare. Die Funktions- und Typbezeichnungen machen es leicht verständlich.
Manchmal kann es jedoch schwierig oder unmöglich sein, wirklich fließenden Code wie den oben genannten zu erstellen. Das nächste Codefragment dient beispielsweise zum Auffinden eines statistisch zufälligen Punkts auf einer Kugel. Die Mathematik ist ziemlich undurchsichtig, so dass ein Kommentar mit einem Link zur Erklärung dazu beiträgt, zu erklären, wie es funktioniert. Dies kann in eine Funktion eingebunden werden , die angibt , WAS es tut, ohne dass ein Kommentar erforderlich ist, falls dies mehrmals erforderlich ist. Andernfalls hilft der Linktitel auch in dieser Abteilung.
Ein weiteres Beispiel dafür, wann Kommentare Ihnen sagen, was der Code nicht tut, ist die Erläuterung einer Entscheidung. Im nächsten Beispiel sperrt der Code keine nicht-threadlokale Variable in einem Code mit Thread. Es gibt einen Grund dafür und der Kommentar erklärt WARUM . Ohne den Kommentar könnte es sich um einen Fehler handeln oder einfach nicht einmal bemerkt werden.
Es könnte vielleicht verbessert werden, zu sagen, warum das zufällige Objekt nicht an erster Stelle innerhalb der parallelen Schleife erzeugt wird. Wenn es keinen Grund gibt, könnte es auch jemanden dazu bringen, mitzukommen und zu erkennen, dass die ganze Idee dumm ist und ein guter Ort zum Refactoring ist.
quelle
WriteText
eher als vorangestellt wird//
?Es kann hilfreich sein, verschiedene Arten von "Warum" zu erkennen - insbesondere:
Gründe dafür, dass Code, der übermäßig komplex zu sein scheint, bei einer Vereinfachung nicht funktioniert (z. B. kann eine scheinbar überflüssige Typumwandlung erforderlich sein, um sicherzustellen, dass Code in einigen Eckfällen funktioniert).
Gründe dafür, dass eine bestimmte einfache Operation, die gefährlich aussieht, tatsächlich sicher ist (z. B. "Unsere Datenabrufroutine meldet, dass ein Dummy-Artikel-Artikel nach dem letzten weniger als alles andere und der Artikel danach größer ist; jeder Artikel, der sortiert werden soll." vor einem anderen wird in einer konsistenten aufsteigenden oder absteigenden Reihenfolge mindestens ein weiteres (möglicherweise Dummy-) Element darauf folgen ").
In vielen Fällen kann ein Kommentar des zweiten Typs in einem Teil des Codes mit einem Kommentar des ersten Typs in einem anderen "übereinstimmen" (z. B. "Während es so aussieht, als ob diese Abfolge von Operationen vereinfacht werden könnte, verlässt sich die Fitz-Routine darauf." der Wongle wird erst wütend gemacht, nachdem der Banderschnatz verschwunden ist. ")
quelle
Vergiss nicht, wenn du ein Programm schreibst, tippst du nicht einfach nach dem Zufallsprinzip, sondern machst es, weil du ein Modell dafür hast , was du willst , sei es in einem formellen Dokument oder nur in deinem Kopf. Das Zeug in deinem Kopf ist genauso real wie Software / Daten in einem Computer (und es ist genauso wahrscheinlich, dass es Fehler enthält).
Jemand, der Ihren Code liest, hat dieses Modell möglicherweise nicht im Kopf, sodass Kommentare dazu dienen können, ihm mitzuteilen, wie das Modell war und in welcher Beziehung der Code dazu steht. Ich denke, das ist es, was mit "warum" gemeint ist. Natürlich ist es gut, den Code selbst so selbsterklärend wie möglich zu gestalten, aber das ist nicht immer gut genug. Beispiel:
Darüber hinaus ändert sich das Modell im Laufe der Zeit, und diese Änderungen müssen in den Code übertragen werden. In den Kommentaren muss also nicht nur das "Warum" eines Codes angegeben werden, sondern auch, wie dieser als Reaktion auf erwartete Modelländerungen geändert werden kann. Beispiel:
Ich denke, dieser Zweck für Kommentare wird manchmal vernachlässigt.
quelle
Nicht alle meine Kommentare sind vom Typ "Warum", aber viele sind es.
Dies sind Beispiele aus einer (Delphi) -Quelldatei:
Beachten Sie, dass (my) why- Kommentare in der Regel vor dem Code stehen, der sie ausführen soll (daher mit einem Doppelpunkt abschließen).
Ich habe einige Kommentare, die nur erklären, was passiert, z. B. wenn ein Prozess viele Schritte mit einer logischen Gruppierung hat (und der Code nicht überarbeitet wird, um dies automatisch anzuzeigen), werde ich wie folgt kommentieren:
quelle
Ich verstehe das WARUM als den Grund, warum Sie etwas auf eine möglicherweise seltsame oder möglicherweise unlogische Weise tun, aufgrund der gegebenen Umstände, die dies erfordern. Das WIE kann im Code selbst gesehen werden, egal wie seltsam es ist, auch wenn der Code keinen "Sinn" ergibt. Das WAS wird wahrscheinlich am besten zu Beginn der Klassen- / Funktionsdokumentation erzählt. Sie können also das WARUM hinzufügen , in dem Sie alles erklären, was nicht im WIE und WAS enthalten ist, sowie die besonderen Maßnahmen, die Sie aus Gründen ergreifen müssen, die außerhalb Ihrer Kontrolle liegen.
Außerhalb des Landes der Einhörner und Regenbogen ist das natürlich nicht immer der Fall ...
WIE:
WAS:
WARUM:
quelle
critters.dance()
, dann wiederholt der Kommentar nur das Offensichtliche, und "Wir konnten es auf keine andere Weise zum Funktionieren bringen, als wir es versucht haben" ist völlig nicht hilfreich. Wenn Sie "Wir rufen die Methode für jedes Objekt auf" sagen, wiederholen Sie das, was der Code sehr deutlich sagt.Ich habe gelernt, IMMER Kommentare in C ++ - Headerdateien zu schreiben (da nicht immer klar ist, WAS eine Funktion tut, obwohl der Name einen guten Hinweis gibt), insbesondere, wenn Sie eine API an andere Entwickler weitergeben oder ein Tool für die automatische Verarbeitung wie doxygen verwenden.
Also für mich sieht ein typischer Kommentar so aus
Das einzige Mal, dass ich WARUM-Kommentare verwendet habe, sind Dinge, die schwer zu verstehen sind und manchmal sogar für den Programmierer, wie "BERÜHREN SIE DIESES NICHT! Weil ..." oder "PROGRAMM STURZT AB, WENN DIE LINIE GELÖSCHT WIRD ...".
Problemumgehungen, Hacks und seltsames Verhalten qualifizieren sich für WARUM Kriterien in meinen Augen ...
Ein sehr gutes und sogar komisches Beispiel ist diese "Problemumgehung" für einen durcheinandergebrachten Code, der von einer Person namens Richard geschrieben wurde. Eine andere Person hat sie eingepackt und in den Kommentaren erklärt, warum ... https://stackoverflow.com/a/184673/979785
Leider gibt es einige Male, in denen Sie gezwungen sind, Bull **** einzuwickeln, weil Sie das Original nicht berühren können, entweder weil "es immer so war" oder weil Sie keinen Zugang haben oder ... na ja, Sie Ich habe nicht die Zeit, das Original für den Zweck zu reparieren, der sich nicht wirklich für den Overhead qualifiziert.
quelle
documentation
Tag ist bedauerlich, aber immer noch nicht auf die Frage anwendbar).Code soll Ausführungsplan angeben. Auf diese Weise kann der Programm-Follower (oder der Compiler) herausfinden, was zu tun ist und wie es zu tun ist. Das, was in Schritte unterteilt ist, denen der Programmfolger folgen kann. Die primitiven Schritte sind das Wie.
Die Absicht des Programmierers ist eine andere Sache. In einfachem, klarem und direktem Code ist die Absicht offensichtlich. Jeder einigermaßen geübte menschliche Leser erreicht die Absicht eines Codeblocks, indem er nur den Code liest. Der meiste Code sollte so lauten.
Gelegentlich ist die Beziehung zwischen Absicht und Plan undeutlich. Der Code enthüllt das Was und das Wie, aber nicht das Warum. Dann lohnen sich Kommentare, die die Absicht offenbaren. Die Absicht des Programmierers ist das Warum.
quelle
Mit diesem Problem waten Sie jetzt durch gespeicherte Prozeduren und Ansichten gegen ein komplexes und etwas verschlungenes Datenmodell.
Wir haben (zahlreiche) Auswahlen getroffen wie "Fall, wenn x.account nicht null ist und x.address in (Adresse von fedex auswählen), dann x.account sonst y.account end" und die Produktivität wird erwartet, obwohl es keine Zeit gibt all, um den gesamten Quellcode zu lesen . Und dieses Beispiel ist irgendwie sinnvoll, aber immer noch unergründlich.
Die Kommentare erklären, warum wenn in fedex dann x und wenn nicht dann y Licht auf das gesamte System wirft und wenn wir genug von ihnen lesen, fangen wir an, es zu verstehen. Und das ist zu stark vereinfacht, und es gibt Hunderte oder Tausende ähnlicher Aussagen. Mein Herz strahlt warmherzig in Richtung derjenigen, die die Art Dev aus dem Jahr 2007 verwendet haben, die diese Aussagen gemacht haben.
Also ja, komplexe, verschlungene Datenmodelle und haarige Ansichten und gespeicherte Prozeduren mit mehreren gültigen Pfaden, bitte sagen Sie uns aus Liebe zu Gott, warum.
quelle
Ich habe gerade diesen Kommentar geschrieben. Es ist ein konkretes Beispiel dafür, warum eine Codezeile so ist, wie sie ist, und insbesondere, warum ich sie geändert habe.
Die Methode überprüft gespeicherte Daten und beurteilt, ob sie bis zum heutigen Tag am einen Ende und bis zum Startdatum am anderen Ende vollständig sind.
Wie Sie wahrscheinlich erraten können, war der Größer-als-Operator größer oder gleich. Der Kommentar erklärt, warum der alte Wert Sinn macht und warum der neue Wert besser ist. Wenn sich jemand dies in Zukunft ansieht, wird er feststellen, dass die Verwendung von ">" kein Versehen ist, sondern eine Optimierung. Sie können es dann je nach Bedarf ändern oder verlassen.
quelle