Viele Leute behaupten, "Kommentare sollten erklären, warum, aber nicht wie". Andere sagen, "Code sollte sich selbst dokumentieren" und Kommentare sollten knapp sein. Robert C. Martin behauptet, dass (in meinen eigenen Worten umformuliert) Kommentare häufig "Entschuldigungen für schlecht geschriebenen Code" sind.
Meine Frage lautet wie folgt:
Was ist falsch daran, einen komplexen Algorithmus oder ein langes und verschlungenes Stück Code mit einem beschreibenden Kommentar zu erklären?
Auf diese Weise müssen andere Entwickler (einschließlich Sie selbst) nicht den gesamten Algorithmus Zeile für Zeile lesen, um herauszufinden, was er tut, sondern können einfach den benutzerfreundlichen beschreibenden Kommentar lesen, den Sie im Klartext geschrieben haben.
Englisch ist so konzipiert, dass es von Menschen leicht verstanden werden kann. Java, Ruby oder Perl wurden jedoch entwickelt, um die Lesbarkeit von Menschen und die Lesbarkeit von Computern in Einklang zu bringen und so die Lesbarkeit des Textes zu beeinträchtigen. Ein Mensch kann ein Stück Englisch viel schneller verstehen als ein Stück Code mit der gleichen Bedeutung (solange die Operation nicht trivial ist).
Fügen Sie nach dem Schreiben eines komplexen Codeteils in einer teilweise für Menschen lesbaren Programmiersprache einen beschreibenden und präzisen Kommentar hinzu, der die Funktionsweise des Codes in freundlichem und verständlichem Englisch erklärt.
Einige werden sagen "Code sollte nicht schwer zu verstehen sein", "Funktionen klein machen", "beschreibende Namen verwenden", "Spaghetti-Code nicht schreiben".
Aber wir alle wissen, dass das nicht ausreicht. Dies sind nur Richtlinien - wichtige und nützliche -, aber sie ändern nichts an der Tatsache, dass einige Algorithmen komplex sind. Und sind deshalb schwer zu verstehen, wenn man sie Zeile für Zeile liest.
Ist es wirklich so schlecht, einen komplexen Algorithmus mit ein paar Zeilen Kommentaren zur allgemeinen Funktionsweise zu erklären? Was ist falsch daran, komplizierten Code mit einem Kommentar zu erklären?
quelle
Antworten:
In den Begriffen des Laien:
Endeffekt:
Sich selbst zu erklären ist gut, es ist besser, es nicht zu brauchen.
quelle
Es gibt verschiedene Gründe, warum Code kompliziert oder verwirrend ist. Die häufigsten Gründe lassen sich am besten beheben, indem Sie den Code überarbeiten, um ihn weniger verwirrend zu machen, und keine Kommentare hinzufügen.
Es gibt jedoch Fälle, in denen ein ausgewählter Kommentar die beste Wahl ist.
Wenn es der Algorithmus selbst ist, der kompliziert und verwirrend ist, und nicht nur seine Implementierung - die Art, die in mathematischen Fachzeitschriften geschrieben wird und immer als Mbogos Algorithmus bezeichnet wird -, dann setzen Sie einen Kommentar ganz am Anfang der Implementierung so etwas wie "Dies ist Mbogos Algorithmus zum Auffrischen von Widgets, der ursprünglich hier beschrieben wurde: [URL of Paper]. Diese Implementierung enthält Verfeinerungen von Alice und Carol [URL eines anderen Papiers]." Versuchen Sie nicht, detaillierter darauf einzugehen. Wenn jemand mehr Details benötigt, muss er wahrscheinlich die gesamte Zeitung lesen.
Wenn Sie etwas, das als eine oder zwei Zeilen in einer speziellen Notation geschrieben werden kann, zu einem großen Globus imperativen Codes erweitert haben, ist es eine gute Möglichkeit, diese eine oder zwei Zeilen in einen Kommentar über der Funktion einzufügen sagen dem Leser , was es soll tun. Dies ist eine Ausnahme vom Argument "Aber was ist, wenn der Kommentar nicht mehr mit dem Code synchron ist?", Da die spezialisierte Notation wahrscheinlich viel einfacher zu finden ist als der Code. (Wenn Sie eine Spezifikation stattdessen in Englisch verfasst haben, ist dies umgekehrt.) Ein gutes Beispiel ist hier: https://dxr.mozilla.org/mozilla-central/source/layout/style/nsCSSScanner.cpp#1057 ...
Wenn der Code insgesamt unkompliziert ist, aber ein oder zwei Dinge enthält, die übermäßig verwickelt, unnötig oder einfach falsch aussehen , aber aus Gründen so sein müssen, setzen Sie einen Kommentar direkt über das verdächtig aussehende Bit, in das Sie geben die Gründe an . Hier ist ein einfaches Beispiel, in dem nur erklärt werden muss, warum eine Konstante einen bestimmten Wert hat.
quelle
4
sollte seinCHAR_BIT / 2
;-)CHAR_BITS
der 16 und sizeof (size_t) 2 waren, aber der Maximalwert von size_t z. B. 2 ^ 20 [size_t mit 12 Füllbits] war?reallocarray
, und OpenBSD glaubt im Allgemeinen nicht daran, auf Möglichkeiten einzugehen, die in ihrer ABI nicht vorkommen.int
. Wie es gegeben ist, hängtuint32_t x,y,z;
die Bedeutung von(x-y) > z
von der Größe von abint
. Eine Sprache, die für das Schreiben von robustem Code entwickelt wurde, sollte es Programmierern ermöglichen, zwischen einem Typ zu unterscheiden, bei dem zu erwarten ist, dass Berechnungen den Bereich des Typs überschreiten, und einem, bei dem Berechnungen, bei denen der Bereich des Typs überschritten werden, stillschweigend umbrochen werden sollen Es wird nicht erwartet, dass die Reichweite des Typs überschritten wird, aber ...Es geht nicht um richtig oder falsch, sondern um die "Best Practice", wie im Wikipedia-Artikel definiert :
Die beste Vorgehensweise besteht darin, zuerst den Code zu verbessern und Englisch zu verwenden, wenn dies nicht möglich ist.
Es ist kein Gesetz, aber es ist weitaus üblicher, kommentierten Code zu finden, der umgestaltet werden muss, als umgestalteten Code, der Kommentare erfordert.
quelle
//This code seriously needs a refactor
Es wird ein Tag kommen, an dem Ihr schöner, perfekt gestalteter, gut strukturierter und lesbarer Code nicht mehr funktioniert. Oder es wird nicht gut genug funktionieren. Oder es entsteht ein Sonderfall, in dem es nicht funktioniert und angepasst werden muss.
An diesem Punkt müssen Sie etwas tun, das die Dinge ändert, damit es richtig funktioniert. Insbesondere bei Leistungsproblemen, aber auch häufig in Szenarien, in denen sich eine der von Ihnen verwendeten Bibliotheken, APIs, Webdienste, Gems oder Betriebssysteme nicht wie erwartet verhält, können Sie Vorschläge machen, bei denen dies nicht der Fall ist notwendigerweise unelegant, aber kontraintuitiv oder nicht offensichtlich.
Wenn Sie keine Kommentare haben, um zu erklären, warum Sie diesen Ansatz gewählt haben, besteht eine sehr gute Chance, dass sich in Zukunft jemand (und möglicherweise sogar Sie) den Code ansieht und prüft, wie er "behoben" werden kann Etwas lesbareres und eleganteres, das versehentlich Ihre Korrektur rückgängig macht, weil es nicht wie eine Korrektur aussieht.
Wenn jeder immer perfekten Code geschrieben hätte, wäre es offensichtlich, dass Code, der unvollständig aussieht, um eine knifflige Intervention aus der realen Welt herumarbeitet, aber so funktionieren die Dinge nicht. Die meisten Programmierer schreiben oft verwirrenden oder etwas verworrenen Code. Wenn wir dem begegnen, ist es eine natürliche Neigung, ihn aufzuräumen. Ich schwöre, meine Vergangenheit ist ein wirklicher Idiot, wenn ich alten Code lese, den ich geschrieben habe.
Daher sehe ich Kommentare nicht als Entschuldigung für schlechten Code, sondern als Erklärung dafür, warum Sie das Offensichtliche nicht getan haben. Mit
// The standard approach doesn't work against the 64 bit version of the Frobosticate Library
können zukünftige Entwickler, einschließlich Ihres zukünftigen Selbst, auf diesen Teil des Codes achten und ihn mit dieser Bibliothek testen. Sicher, Sie können die Kommentare auch in Ihre Versionskontroll-Commits einfügen, aber die Leute werden sich diese erst ansehen, nachdem etwas schief gelaufen ist. Sie lesen Codekommentare, wenn sie den Code ändern.Leute, die uns sagen, dass wir immer theoretisch perfekten Code schreiben sollten, sind nicht immer Leute mit viel Erfahrung im Programmieren in realen Umgebungen. Manchmal müssen Sie Code schreiben, der eine bestimmte Leistung erbringt, manchmal müssen Sie mit fehlerhaften Systemen zusammenarbeiten. Das bedeutet nicht, dass Sie dies nicht auf elegante und gut geschriebene Weise tun können, aber nicht offensichtliche Lösungen bedürfen einer Erklärung.
Wenn ich Code für Hobbyprojekte schreibe, von denen ich weiß, dass niemand sie jemals lesen wird, kommentiere ich immer noch Teile, die ich verwirrend finde - zum Beispiel beinhaltet jede 3D-Geometrie Mathematik, mit der ich nicht ganz zuhause bin -, weil ich weiß, wann ich zurückkomme In sechs Monaten werde ich völlig vergessen haben, wie man dieses Zeug macht. Das ist keine Entschuldigung für schlechten Code, sondern eine Anerkennung einer persönlichen Einschränkung. Alles, was ich tun würde, wenn ich es unkommentiert lassen würde, wäre, mir in Zukunft mehr Arbeit zu schaffen. Ich möchte nicht, dass mein zukünftiges Ich etwas unnötig neu lernen muss, wenn ich es jetzt vermeiden kann. Welchen möglichen Wert hätte das?
quelle
Die Notwendigkeit von Kommentaren ist umgekehrt proportional zur Abstraktionsebene des Codes.
Zum Beispiel ist Assemblersprache für die meisten praktischen Zwecke ohne Kommentare unverständlich. Hier ist ein Auszug aus einem kleinen Programm, das Terme der Fibonacci-Reihe berechnet und ausgibt :
Selbst mit Kommentaren kann es ziemlich kompliziert sein, zu grocken.
Modernes Beispiel: Regexe sind oft sehr niedrige Abstraktionskonstrukte (Kleinbuchstaben, Nummer 0, 1, 2, neue Zeilen usw.). Sie benötigen wahrscheinlich Kommentare in Form von Mustern (Bob Martin, IIRC, erkennt dies an). Hier ist ein regulärer Ausdruck, der (meiner Meinung nach) mit HTTP- (S) und FTP-URLs übereinstimmen sollte:
Während die Sprachen die Abstraktionshierarchie verbessern, kann der Programmierer evokative Abstraktionen (Variablennamen, Funktionsnamen, Klassennamen, Modulnamen, Schnittstellen, Rückrufe usw.) verwenden, um eine integrierte Dokumentation bereitzustellen. Es ist faul, dies zu vernachlässigen und Kommentare zu verwenden, um darüber zu schreiben, ein schlechter Dienst für den Betreuer und respektlos gegenüber ihm.
Ich denke dabei an Numerical Recipes in C übersetzt meist wörtlich zu Numerical Recipes in C ++ , die ich schließen , begann als Numerical Recipes (in FORTAN), mit allen Variablen
a
,aa
,b
,c
,cc
, usw. durch jede Version beibehalten. Die Algorithmen mögen korrekt gewesen sein, aber sie haben die Abstraktionen der bereitgestellten Sprachen nicht ausgenutzt. Und sie machen mich fertig. Auszug aus einem Artikel von Dr. Dobbs - Fast Fourier Transform :Als Sonderfall zur Abstraktion verfügt jede Sprache über Redewendungen / kanonische Codefragmente für bestimmte allgemeine Aufgaben (Löschen einer dynamischen verknüpften Liste in C). Unabhängig davon, wie sie aussehen, sollten sie nicht dokumentiert werden. Programmierer sollten diese Redewendungen lernen, da sie inoffiziell Teil der Sprache sind.
Also das Mitnehmen: Nicht-idiomatischer Code, der aus einfachen Bausteinen besteht, die nicht vermieden werden können, benötigt Kommentare. Und das ist WAAAAY weniger notwendig, als es passiert.
quelle
dec dword [term] ; decrement loop counter
. Auf der anderen Seite fehlt in Ihrem Assembler-Beispiel ein Kommentar vor jedem "Code-Absatz", in dem erläutert wird, was der nächste Codeblock tut. In diesem Fall entspricht der Kommentar normalerweise einer einzelnen Zeile im Pseudocode, z. B.;clear the screen
gefolgt von den 7 Zeilen, die zum Löschen des Bildschirms tatsächlich erforderlich sind.^(((ht|f)tps?)\:\/\/)?(www\.)*[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$
? Achten Sie auf numerische Adressen."The need for comments is inversely proportional to the abstraction level of the code."
Fasst so ziemlich alles genau dort zusammen.Ich glaube nicht, dass an Kommentaren im Code etwas falsch ist. Die Idee, dass Kommentare meiner Meinung nach irgendwie schlecht sind , ist darauf zurückzuführen, dass einige Programmierer die Dinge zu weit gehen. Es gibt in dieser Branche eine Menge Bandwagoning, insbesondere in Richtung extremer Ansichten. Irgendwo auf dem Weg wurde kommentierter Code zu schlechtem Code und ich bin mir nicht sicher warum.
Kommentare haben Probleme - Sie müssen sie auf dem neuesten Stand halten, wenn Sie den Code aktualisieren, auf den sie verweisen, was viel zu selten vorkommt. Ein Wiki oder ähnliches ist eine geeignetere Ressource für eine gründliche Dokumentation Ihres Codes. Ihr Code sollte lesbar sein, ohne dass Kommentare erforderlich sind. In Versionskontroll- oder Revisionsnotizen sollten Sie die von Ihnen vorgenommenen Codeänderungen beschreiben.
Keiner der oben genannten Punkte macht jedoch die Verwendung von Kommentaren ungültig. Wir leben nicht in einer idealen Welt. Wenn eine der oben genannten Situationen aus irgendeinem Grund fehlschlägt, hätte ich lieber einige Kommentare , auf die ich zurückgreifen könnte.
quelle
Ich denke, du liest ein bisschen zu viel in dem, was er sagt. Ihre Beschwerde besteht aus zwei Teilen:
(1) ist unvermeidlich. Ich glaube nicht, dass Martin dir widersprechen würde. Wenn Sie so etwas wie die schnelle Quadratwurzel schreiben , brauchen Sie einige Kommentare, auch wenn es sich nur um "böses Fließkomma-Bit-Level-Hacking" handelt. Abgesehen von etwas Einfachem wie einer DFS- oder Binärsuche ist es unwahrscheinlich, dass die Person, die Ihren Code liest, Erfahrung mit diesem Algorithmus hat. Daher sollte in den Kommentaren zumindest erwähnt werden, was es ist.
Der meiste Code ist jedoch nicht (1). In den seltensten Fällen werden Sie eine Software schreiben, die nichts anderes als handgerollte Mutex-Implementierungen, obskure lineare Algebraoperationen mit unzureichender Bibliotheksunterstützung und neuartige Algorithmen ist, die nur der Forschungsgruppe Ihres Unternehmens bekannt sind. Der meiste Code besteht aus Bibliotheks- / Framework- / API-Aufrufen, E / A, Boilerplate und Komponententests.
Über diese Art von Code spricht Martin. Und er beantwortet Ihre Frage mit dem Zitat von Kernighan und Plaugher am Anfang des Kapitels:
Wenn Sie lange, verschlungene Abschnitte in Ihrem Code haben, ist es Ihnen nicht gelungen, Ihren Code sauber zu halten . Die beste Lösung für dieses Problem ist nicht, einen absatzlangen Kommentar oben in die Datei zu schreiben, um zukünftigen Entwicklern zu helfen, sich darin zurechtzufinden. Die beste Lösung ist, es neu zu schreiben.
Und genau das sagt Martin:
Das ist dein (2). Martin stimmt zu, dass langer, verschachtelter Code Kommentare benötigt - aber er gibt dem Programmierer, der ihn geschrieben hat, die Schuld für diesen Code, nicht irgendeine nebulöse Vorstellung, dass "wir alle wissen, dass das nicht genug ist". Er argumentiert, dass:
quelle
Nichts als solches. Das Dokumentieren Ihrer Arbeit ist eine gute Praxis.
Das heißt, Sie haben hier eine falsche Dichotomie: Schreiben von sauberem Code vs. Schreiben von dokumentiertem Code - die beiden sind nicht gegensätzlich.
Sie sollten sich darauf konzentrieren, komplexen Code zu vereinfachen und in einfacheren Code zu abstrahieren, anstatt zu denken, "komplexer Code ist in Ordnung, solange er kommentiert ist".
Im Idealfall sollte Ihr Code einfach und dokumentiert sein.
Wahr. Aus diesem Grund sollten alle Ihre öffentlichen API-Algorithmen in der Dokumentation erläutert werden.
Idealerweise sollten Sie nach dem Schreiben eines komplexen Code Folgendes tun (keine vollständige Liste):
Keiner dieser Schritte ist trivial (dh jeder kann einige Stunden dauern) und die Belohnungen dafür sind nicht unmittelbar. Daher werden diese Schritte (fast) immer beeinträchtigt (von Entwicklern, Managern, Terminen, Markteinschränkungen / anderen realen Bedingungen, mangelnder Erfahrung usw.).
Sie sollten sich niemals darauf verlassen müssen, die Implementierung zu lesen, um herauszufinden, was eine API tut. Wenn Sie dies tun, implementieren Sie Client-Code basierend auf der Implementierung (anstelle der Schnittstelle) und das bedeutet, dass Ihre Modulkopplung bereits zum Teufel ist. Sie führen möglicherweise undokumentierte Abhängigkeiten mit jeder neuen Codezeile ein, die Sie schreiben, und sind fügte bereits technische Schulden hinzu.
Nein, das ist gut. Es reicht jedoch nicht aus, ein paar Kommentarzeilen hinzuzufügen.
Die Tatsache, dass Sie keinen komplizierten Code haben sollten, wenn dies vermieden werden kann.
Um komplizierten Code zu vermeiden, müssen Sie Ihre Schnittstellen formalisieren, ~ 8 Mal mehr für das API-Design als für die Implementierung ausgeben (Stepanov schlug vor, mindestens das 10-fache für die Schnittstelle im Vergleich zur Implementierung auszugeben) und ein Projekt mit dem entsprechenden Wissen entwickeln Sie erstellen ein Projekt und schreiben nicht nur einen Algorithmus.
Ein Projekt umfasst API-Dokumentation, Funktionsdokumentation, Code- / Qualitätsmessungen, Projektmanagement usw. Bei keinem dieser Prozesse handelt es sich um einmalige, schnell auszuführende Schritte (alle benötigen Zeit, erfordern Voraussicht und Planung, und alle erfordern, dass Sie regelmäßig zu ihnen zurückkehren und sie mit Details überarbeiten / vervollständigen).
quelle
Ich würde dies als leichten Missbrauch von "Kommentaren" betrachten. Wenn der Programmierer etwas anstelle des gesamten Algorithmus lesen möchte , ist dies die Funktionsdokumentation. OK, die Funktionsdokumentation wird möglicherweise tatsächlich in Kommentaren in der Quelle angezeigt (möglicherweise zum Extrahieren mit Doc-Tools). Syntaktisch handelt es sich jedoch um einen Kommentar für Ihren Compiler. Sie sollten sie jedoch für unterschiedliche Zwecke betrachten. Ich denke nicht, dass "Kommentare sollten knapp sein" notwendigerweise "Dokumentation sollte knapp sein" oder sogar "Copyright-Vermerke sollten knapp sein" bedeutet!
Kommentare in der Funktion sind für jemanden lesbar , ebenso wie der Code. Wenn Ihr Code einige schwer verständliche Zeilen enthält und Sie diese nicht leicht verständlich machen können, ist ein Kommentar für den Leser hilfreich, um ihn als Platzhalter für diese Zeilen zu verwenden. Dies kann sehr nützlich sein, wenn der Leser nur versucht, das Wesentliche herauszufinden, aber es gibt ein paar Probleme:
Es gibt Ausnahmen, aber die meisten Leser müssen den Code selbst verstehen. Kommentare sollten geschrieben werden, um dies zu unterstützen, und nicht, um es zu ersetzen. Aus diesem Grund wird empfohlen, dass in den Kommentaren angegeben wird, warum Sie es tun. Ein Leser, der die Motivation für die nächsten Codezeilen kennt, hat eine bessere Chance zu sehen, was er tut und wie.
quelle
Oft müssen wir komplizierte Dinge tun. Es ist sicherlich richtig, sie für das zukünftige Verständnis zu dokumentieren. Manchmal ist der richtige Ort für diese Dokumentation im Code, wo die Dokumentation mit dem Code auf dem neuesten Stand gehalten werden kann. Es lohnt sich aber auf jeden Fall, eine separate Dokumentation zu betrachten. Dies kann auch einfacher für andere Personen sein, einschließlich Diagrammen, Farbbildern und so weiter. Dann ist der Kommentar einfach:
oder auch nur
Sicherlich sind die Leute mit den Funktionen
MatchStringKnuthMorrisPratt
oderencryptAES
oder zufriedenpartitionBSP
. Weitere undurchsichtige Namen sollten in einem Kommentar erläutert werden. Sie können auch bibliografische Daten und einen Link zu einem Artikel hinzufügen, aus dem Sie einen Algorithmus implementiert haben.Wenn ein Algorithmus komplex und neuartig und nicht offensichtlich ist, ist er auf jeden Fall ein Dokument wert, auch wenn er nur für den internen Unternehmensumlauf bestimmt ist. Überprüfen Sie das Dokument in der Quellcodeverwaltung, wenn Sie befürchten, dass es verloren geht.
Es gibt eine andere Kategorie von Code, die weniger algorithmisch als bürokratisch ist. Sie müssen Parameter für ein anderes System einrichten oder mit den Fehlern eines anderen zusammenarbeiten:
quelle
doPRD239Algorithm
, dass sie mir Aufschluss gibt Nichts über die Funktion, ohne den Algorithmus nachschlagen zu müssen. Der GrundMatchStringKnuthMorrisPratt
und dieencryptAES
Arbeit besteht darin, dass sie mit einer Beschreibung ihrer Arbeit beginnen und anschließend die Methodik beschreiben.Ich vergesse, wo ich es gelesen habe, aber es gibt eine scharfe und klare Linie zwischen dem, was in Ihrem Code erscheinen soll und dem, was als Kommentar erscheinen soll.
Ich glaube, Sie sollten Ihre Absicht kommentieren, nicht Ihren Algorithmus . Ich kommentiere, was du vorhast, nicht was du tust .
Zum Beispiel:
Hier gibt es keinen Versuch zu erklären , was jeder Schritt durchführt, alle heißt es ist , was es soll tun.
PS: Ich habe die Quelle gefunden, auf die ich mich bezog - Coding Horror: Code sagt Ihnen wie, Kommentare sagen Ihnen warum
quelle
Future
und gibt an, dassget()
durch eine anschließende Überprüfung festgestellt wird,null
ob dasFuture
Programm bereits ausgeführt wurde. Dabei wird die Absicht und nicht der Prozess korrekt dokumentiert ."Ja wirklich?" Seit wann?
Gut gestalteter Code mit guten Namen ist in den allermeisten Fällen mehr als ausreichend. Die Argumente gegen die Verwendung von Kommentaren sind bekannt und dokumentiert (wie Sie sich beziehen).
Aber das sind Richtlinien (wie alles andere). In dem seltenen Fall (meiner Erfahrung nach etwa alle zwei Jahre), in dem sich die Situation verschlechtert, wenn sie (aufgrund von Leistungs- oder Kohäsionsanforderungen) in kleinere lesbare Funktionen umgewandelt wird, geben Sie einen ausführlichen Kommentar ein, in dem Sie erklären, was die Sache eigentlich ist tun (und warum Sie Best Practices verletzen).
quelle
Der Hauptzweck von Code besteht darin, einem Computer zu befehlen, etwas zu tun. Ein guter Kommentar ist also niemals ein Ersatz für guten Code, da Kommentare nicht ausgeführt werden können.
Abgesehen davon sind Kommentare in der Quelle eine Form der Dokumentation für andere Programmierer (einschließlich Sie selbst). Wenn es sich bei den Kommentaren um abstraktere Themen handelt, als der Code bei jedem Schritt tut, sind Sie besser als der Durchschnitt. Diese Abstraktionsstufe hängt vom verwendeten Tool ab. Kommentare, die Assembler-Routinen beigefügt sind, weisen im Allgemeinen eine niedrigere "Abstraktionsstufe" auf als beispielsweise diese APL
A←0⋄A⊣{2⊤⍵:1+3×⍵⋄⍵÷2}⍣{⍺=A+←1}⎕
. Ich denke, das wäre wahrscheinlich einen Kommentar über das Problem wert, das es lösen soll, hmmm?quelle
Wenn der Code trivial ist, benötigt er keinen erklärenden Kommentar. Wenn der Code nicht trivial ist, ist der erläuternde Kommentar höchstwahrscheinlich auch nicht trivial.
Das Problem mit nicht-trivialer natürlicher Sprache ist, dass viele von uns nicht sehr gut darin sind, sie zu lesen oder zu schreiben. Ich bin mir sicher, dass Ihre schriftlichen Kommunikationsfähigkeiten ausgezeichnet sind, aber dennoch kann jemand mit einem geringeren Verständnis der geschriebenen Sprache Ihre Worte missverstehen.
Wenn Sie sich sehr bemühen, eine natürliche Sprache zu schreiben, die nicht falsch interpretiert werden kann, erhalten Sie so etwas wie ein juristisches Dokument (und wie wir alle wissen, sind diese Dokumente ausführlicher und schwer zu verstehen als Code).
Code sollte die prägnanteste Beschreibung Ihrer Logik sein, und es sollte nicht viel Debatte über die Bedeutung Ihres Codes geben, da Ihr Compiler und Ihre Plattform das letzte Wort haben.
Persönlich würde ich nicht sagen, dass Sie niemals einen Kommentar schreiben sollten. Nur, dass Sie sich überlegen sollten, warum Ihr Code einen Kommentar benötigt und wie Sie dies beheben können. Dies scheint ein häufiges Thema bei den Antworten zu sein.
quelle
Ein Punkt, der noch nicht erwähnt wurde, ist, dass es manchmal hilfreich sein kann, genau zu kommentieren, was ein Codeteil tut, wenn eine Sprache eine bestimmte Syntax für mehrere Zwecke verwendet. Angenommen, alle Variablen sind vom Typ
float
:Die Wirkung der explizit ein Gießens
float
zufloat
ist das Ergebnis zu zwingen, mit einfacher Genauigkeit gerundet werden; Der Kommentar kann also so gesehen werden, als würde er einfach sagen, was der Code tut. Vergleichen Sie andererseits diesen Code mit:Hier besteht der Zweck des Casts darin, zu verhindern, dass der Compiler auf die effizienteste Art und Weise quäkt (f2 / 10).
Ohne diesen Kommentar könnte jemand, der den vorherigen Code überprüft hat, der Meinung sein, dass die Besetzung fälschlicherweise hinzugefügt wurde, um zu verhindern, dass der Compiler quietscht, und dass sie nicht benötigt wird. Tatsächlich dient die Besetzung dem Zweck, genau das zu tun, was die Sprachspezifikation angibt: Das Ergebnis der Berechnung muss auf eine Genauigkeit gerundet werden, selbst bei Maschinen, bei denen das Runden teurer wäre als das Ergebnis auf einer höheren Genauigkeit zu halten. Angesichts der Tatsache, dass eine Besetzung von
float
eine Reihe von unterschiedlichen Bedeutungen und Zwecken haben kann, kann das Festlegen, welche Bedeutung in einem bestimmten Szenario beabsichtigt ist, dazu beitragen, klar zu machen, dass die tatsächliche Bedeutung mit der Absicht übereinstimmt.quelle
someFloatProperty
, die genaueste Darstellung dessen zu haben ,f2/10
was er kann; Der Hauptzweck der zweiten Besetzung besteht also darin, den Code einfach kompilieren zu lassen . Im ersten Beispiel wird die Umwandlung jedoch eindeutig nicht für den normalen Zweck (Ändern eines Kompilierungstyps in einen anderen) benötigt, da die Operanden bereits vorhanden sindfloat
. Der Kommentar dient deutlich zu machen , dass die Besetzung ist für einen sekundären Zweck benötigt werden (Rundung).(float)
im zweiten Beispiel keine Kommentare zu der Besetzung abgeben müssen. Die Frage ist nach der wörtlichen Konstante0.1
. Sie haben (im nächsten Absatz des Textes) erklärt, warum wir schreiben würden0.1
: "Es ist genauer als das Multiplizieren mit 0,1f." Ich schlage vor, dass das die Wörter sind, die im Kommentar sein sollten.double
für Konstanten oder Zwischenberechnungen zu verwenden, deren Wert möglicherweise nicht darstellbar istfloat
[obwohl in Sprachen, die ärgerliche, explizite Double-to-Float-Casts und Faulheit erfordern] kann sein,float
Konstanten nicht für die Geschwindigkeit zu verwenden, sondern um Ärger zu minimieren.Kommentare, die erklären, was der Code tut, sind eine Form der Vervielfältigung. Wenn Sie den Code ändern und dann vergessen, die Kommentare zu aktualisieren, kann dies zu Verwirrung führen. Ich sage nicht, benutze sie nicht, sondern benutze sie nur mit Bedacht. Ich abonniere die Maxime von Onkel Bob: "Nur kommentieren, was der Code nicht sagen kann".
quelle