Aktualisieren
Meine Antwort in Anführungszeichen zur Hervorhebung:
Meiner Meinung nach ist die Antwort, die besagt, dass die Kommentare nicht in den Kodierungsstandards behandelt werden sollten und dann eine Reihe von Abwehrfragen auflistet, die die einzig richtige Antwort sind.
Das Problem hierbei ist, dass ein Kodierungsstandard genau das ist, ein Standard . Extrem subjektive Ideen sollten nicht in einem Kodierungsstandard enthalten sein . Es kann sich um einen Best Practices-Leitfaden handeln, der jedoch während der Codeüberprüfung nicht gegen Entwickler verwendet werden kann. Meiner persönlichen Meinung nach sollte ein Coding Standard so nah wie möglich an Automated sein. Code Reviews verschwenden so viel Zeit damit, über Namen, Abstände, Tabulatoren, Klammern, Kommentare usw. zu streiten, wenn ALLES automatisiert werden kann. Auch die Beantwortung von tables
und chairs
kann automatisiert werden. LINT'er ermöglichen Wörterbücher, Großschreibungschecks pro Konzept (Variable, Funktion, Methode, Klasse usw.).
Sogar die JavaDoc-Prüfung kann von einem Robot LINT'er implementiert werden, bevor eine Pull-Anforderung akzeptiert wird. Viele Open Source-Projekte machen genau das. Wenn Sie Ihre Pull-Anfrage einreichen, wird der Code mit einer Travis-CI-Datei einschließlich statischer Analyse erstellt und muss alle Codierungsstandards erfüllen, die objektiv ausgedrückt werden können. Kein menschliches Glockenspiel, wenn es darum geht, "es falsch zu machen" oder "keinen Wert" mit einem Kommentar zu versehen oder Variablen falsch zu benennen. Diese Diskussionen haben keinen Wert und werden am besten einem Drittanbieter-Roboter überlassen, der die Hauptlast unserer emotionalen Kodierung übernehmen kann.
Um die Frage tatsächlich zu beantworten, müssten wir uns mit dem Schreiben eines Standards befassen, in dem die folgende Frage beantwortet wird: Hat dieser Kommentar einen Wert geliefert? Ein Kodierungsstandard kann unmöglich den 'Wert' eines Kommentars vorgeben. Daher muss ein Mensch diese Checkliste durchgehen. Die bloße Erwähnung von Kommentaren in einem Kodierungsstandard erzeugt eine Checkliste, die das Originalposter vermeiden möchte.
Das ist der Grund, warum Kommentare normalerweise nicht vom Compiler verarbeitet und entfernt werden. Ihr Wert kann nicht bestimmt werden. Ist der betreffende Kommentar wertvoll? ja oder Nein?. Die Beantwortung dieser Frage ist NP-schwer. Nur Menschen haben die Chance, richtig darauf zu antworten, und selbst dann kann es nur zum Zeitpunkt des Lesens von der Person beantwortet werden, die es liest. Wobei der Wert dieses Kommentars vom Wetter, seinem Leben zu Hause, der letzten Sitzung, an der sie teilgenommen haben, und der Tageszeit und der Menge an Kaffee, die sie getrunken haben, abhängt. Ich vertraue darauf, dass das Bild klarer wird.
Wie kann es jemals in einem Standard richtig ausgedrückt werden? Ein Standard ist nur dann nützlich, wenn er konsequent und fair angewendet werden kann, wenn es bei Fairness eher um Objektivität geht, nicht um Emotionalität.
Ich wetteifere darum, dass ein Kodierungsstandard so objektiv wie möglich bleibt. Die Art und Weise, wie Variablen IS-Ziel genannt werden. Sie können leicht mit einem Wörterbuch verglichen werden, um Rechtschreibung, grammatikalische Struktur und Schreibweise zu überprüfen. Alles, was darüber hinausgeht, ist ein "Pissing Match", das von der Person mit der größten Kraft oder durch "Brauen schlagen" gewonnen wird. Etwas, mit dem ich persönlich Probleme habe, es NICHT zu tun.
Wenn ich kommentiere, spreche ich immer mit meinem zukünftigen Selbst in der dritten Person. Wenn ich in 5 Jahren auf diesen Code zurückkomme, was muss ich dann wissen? Was wäre hilfreich, was wäre verwirrend und was wäre mit dem Code veraltet? Es gibt einen Unterschied zwischen dem Dokumentieren von Code zum Generieren einer durchsuchbaren öffentlichen API und dem Kommentieren von Code, der einem unbekannten Drittanbieter einen Wert liefert, selbst wenn dieser Drittanbieter Sie selbst ist.
Hier ist ein guter Lackmustest. Wenn Sie der EINZIGE am Projekt wären. Sie wussten, dass Sie der einzige im Projekt sind. Was wäre in Ihrem Kodierungsstandard? Sie möchten, dass Ihr Code in Zukunft sauber, selbsterklärend und für sich selbst verständlich ist. Haben Sie eine Codeüberprüfung mit sich selbst, warum Sie nicht zu jeder Zeile einen Kommentar abgegeben haben? Würden Sie jeden einzelnen Kommentar überprüfen, den Sie zu den 100 eingecheckten Dateien erstellt haben? Wenn nicht, warum dann andere zwingen?
Etwas, von dem ich glaube, dass es in diesen Diskussionen fehlt, ist, dass Future You auch ein Entwickler dieses Projekts ist. Wenn Sie nach dem Wert von morgen fragen, sind Sie auch eine Person, die aus dem Kommentar einen Wert ableiten kann. Die Teamgröße spielt meiner Meinung nach keine Rolle. Teamerfahrung spielt keine Rolle, sie ändert sich zu oft.
Keine Menge an Kommentar-Code, der dies überprüft, verhindert, dass ein Schrittmacher abstürzt und einen Patienten tötet. Wenn Sie über einen Kommentar sprechen, der sich auf den Code auswirkt, sprechen Sie jetzt über den Code und nicht über den Kommentar. Wenn es nur eines fehlenden Kommentars bedarf, um jemanden zu töten, riecht etwas anderes daran.
Die Lösung für diese Art der rigorosen Codierung wurde bereits als Methode zum Schreiben von Software selbst bereitgestellt. Und es hat nichts mit Kommentaren zu tun. Das Problem bei Kommentaren ist, dass sie KEINE Auswirkungen auf die Funktionsweise des Produkts haben. Die besten Kommentare der Welt können nicht verhindern, dass Software abstürzt, wenn sie in einen Schrittmacher eingebettet ist. Oder wenn Sie die elektrischen Signale mit einem tragbaren EKG messen.
Wir haben zwei Arten von Kommentaren:
Maschinenlesbare Kommentare
Kommentarstile wie Javadoc, JSDoc, Doxygen usw. sind alle Möglichkeiten, die öffentliche Schnittstelle zu kommentieren, die ein Satz von Code bereitstellt. Diese Schnittstelle darf nur von einem anderen Entwickler (proprietärer Code für ein Zweierteam), einer unbekannten Anzahl von Entwicklern (z. B. JMS) oder für eine gesamte Abteilung verwendet werden. Dieser Code kann durch einen automatisierten Prozess gelesen werden, der dann eine andere Art des Lesens dieser Kommentare, z. B. HTML, PDF usw., erzeugt.
Diese Art von Kommentaren ist leicht zu erstellen. Es wird ein objektiver Prozess, bei dem sichergestellt wird, dass jede öffentlich aufrufbare Methode, Funktion und Klasse die erforderlichen Kommentare enthält. Überschriften, Parameter, Beschreibung et. el. Dies soll sicherstellen, dass es für ein anderes Team einfach ist, den Code zu finden und zu verwenden.
Ich mache etwas, das verrückt aussieht, aber es ist wirklich nicht
Diese Kommentare sollen anderen helfen, herauszufinden, WARUM dieser Code auf eine bestimmte Weise geschrieben wurde. Möglicherweise liegt ein numerischer Fehler in den Prozessoren vor, auf denen der Code ausgeführt wird, und der Code wird immer abgerundet. Entwickler beschäftigen sich jedoch normalerweise mit Code, der gerundet wird. So kommentieren wir , um sicherzustellen , dass ein Entwickler den Code zu berühren versteht , warum der aktuelle Kontext etwas tut es normalerweise scheint unvernünftig, aber in Wirklichkeit geschrieben wurden auf diese Weise absichtlich.
Diese Art von Code verursacht so viele Probleme. Es bleibt in der Regel unkommentiert und wird später von einem neuen Entwickler gefunden und "behoben". Also alles kaputt machen. Selbst dann sind die Kommentare nur dazu da, das WARUM zu erklären, um nicht zu verhindern, dass etwas kaputt geht.
Auf Kommentare kann man sich nicht verlassen
Kommentare sind letztendlich nutzlos und können nicht als vertrauenswürdig eingestuft werden. Kommentare ändern normalerweise nicht die Art und Weise, wie Programme ausgeführt werden. Und wenn doch, dann verursacht Ihr Prozess mehr Probleme, als es sollte. Kommentare sind nachträgliche Gedanken und können niemals etwas anderes sein. Der Code ist alles, was zählt, da dies alles ist, was vom Computer verarbeitet wird.
Das hört sich vielleicht wie ein Idiot an, aber ertragen Sie es mit mir. Welche dieser beiden Zeilen ist wirklich wichtig?
// We don't divide by 0 in order to stop crashes.
return 1 / n;
In diesem Beispiel kommt es nur darauf an, dass wir keine Ahnung haben, was 'n' ist. Es gibt keine Prüfung, ob n 0 ist, und selbst wenn dies der n = 0
Fall ist , hindert nichts einen Entwickler daran, NACH der Prüfung 0 zu setzen ist nutzlos und nichts Automatisiertes kann dies jemals fangen. Kein Standard kann das fangen. Der Kommentar ist zwar hübsch (für einige), hat aber keinen Einfluss auf das Ergebnis des Produkts.
Testgetriebene Entwicklung
Was hat ein Ergebnis auf dem Produkt? Branchen, in denen der geschriebene Code buchstäblich jemanden retten oder töten kann, müssen rigoros überprüft werden. Dies geschieht durch Code-Reviews, Code-Reviews, Testen, Testen, Code-Reviews, Komponententests, Integrationstests, Tests, Staging, monatelange Tests, Code-Reviews und Einzelpersonen-Tests, Staging, Code-Reviews, Testen und schließlich möglicherweise in Produktion gehen. Kommentare haben damit nichts zu tun.
Ich würde eher Code verwenden, der KEINE Kommentare enthielt, eine Spezifikation hatte, Unit-Tests, die die Spezifikation überprüften, Studien über die Ergebnisse der Ausführung des Codes auf dem Produktionsgerät, dann gut dokumentierten Code, der noch nie getestet worden war und nichts zum Vergleichen hatte Code gegen.
Dokumentation ist hilfreich, wenn Sie herausfinden möchten, WARUM jemand etwas auf eine bestimmte Weise getan hat. Im Laufe der Jahre habe ich jedoch festgestellt, dass Dokumentation normalerweise verwendet wird, um zu erklären, warum etwas „Kluges“ getan wurde, wenn es wirklich nicht nötig war so geschrieben sein.
Fazit
Wenn Sie in einem Unternehmen arbeiten, in dem jede Zeile kommentiert werden muss, GARANTIEREN SIE, dass mindestens zwei der Software-Ingenieure im Projekt bereits ein Autodokument-Programm in Perl, Lisp oder Python geschrieben haben, das die allgemeine Vorstellung davon bestimmt, was die Zeile tut und fügt dann einen Kommentar über dieser Zeile hinzu. Da dies möglich ist, bedeutet dies, dass die Kommentare unbrauchbar sind. Suchen Sie nach den Ingenieuren, die diese Skripte geschrieben haben, um den Code automatisch zu dokumentieren, und verwenden Sie sie als Beweis dafür, warum der "Kommentar zu jeder Zeile" Zeit verschwendet, keinen Wert liefert und möglicherweise schädlich ist.
Nebenbei half ich einem engen Freund bei einem Programmierauftrag. Sein Lehrer hatte eine Anforderung gestellt, dass jede Zeile dokumentiert werden musste. So kann ich sehen, woher dieser Denkprozess kommen würde. Fragen Sie sich einfach, was versuchen Sie zu tun, und ist das die richtige Sache? Dann frag dich; Gibt es eine Möglichkeit, das System mit diesem Prozess zu "spielen"? Wenn ja, schafft es dann wirklich einen Mehrwert? Man kann nicht automatisch Komponententests schreiben, bei denen überprüft wird, ob der Code einer bestimmten Spezifikation entspricht, und wenn dies möglich wäre, wäre dies keine schlechte Sache.
Wenn ein Gerät unter bestimmten Bedingungen funktionieren muss, weil es sich im Inneren eines Menschen befindet, ist die einzige Möglichkeit, sicherzustellen, dass es diese nicht tötet, das jahrelange Testen, Überprüfen durch Kollegen, Testen und dann NIEMALS den Code erneut ändern. Dies ist der Grund, warum die NASA solche alte Hard- und Software verwendet. Wenn es um Leben oder Tod geht, nehmen Sie nicht nur eine kleine Änderung vor und checken sie ein.
Kommentare haben nichts damit zu tun, Leben zu retten. Kommentare sind für Menschen, Menschen machen Fehler, auch wenn sie Kommentare schreiben. Vertraue den Menschen nicht. Ergo, traue den Kommentaren nicht. Kommentare sind nicht Ihre Lösung.