Das Robert C. Martin-Zitat wird aus dem Zusammenhang gerissen. Hier ist das Zitat mit etwas mehr Kontext:
Nichts kann so hilfreich sein wie ein gut platzierter Kommentar. Nichts kann ein Modul überladener machen als frivole dogmatische Kommentare. Nichts kann so schädlich sein wie ein alter, schmutziger Kommentar, der Lügen und Fehlinformationen verbreitet.
Kommentare sind nicht wie Schindlers Liste. Sie sind nicht "rein gut". Kommentare sind in der Tat bestenfalls ein notwendiges Übel. Wenn unsere Programmiersprachen ausdrucksstark genug wären oder wir das Talent hätten, diese Sprachen subtil einzusetzen, um unsere Absicht auszudrücken, würden wir kaum Kommentare benötigen - vielleicht gar nicht.
Die ordnungsgemäße Verwendung von Kommentaren soll unser Versäumnis ausgleichen, uns im Code auszudrücken. Beachten Sie, dass ich das Wort Fehler verwendet habe. Ich meinte es. Kommentare sind immer Fehler. Wir müssen sie haben, weil wir nicht immer herausfinden können, wie wir uns ohne sie ausdrücken können, aber ihr Gebrauch ist kein Grund zum Feiern.
Wenn Sie sich also in einer Position befinden, in der Sie einen Kommentar schreiben müssen, überlegen Sie, ob es keine Möglichkeit gibt, den Spieß umzudrehen und sich im Code auszudrücken. Jedes Mal, wenn Sie sich in Code ausdrücken, sollten Sie sich auf den Rücken klopfen. Jedes Mal, wenn Sie einen Kommentar schreiben, sollten Sie eine Grimasse ziehen und das Versagen Ihrer Ausdrucksfähigkeit spüren.
( Von hier kopiert , aber das Originalzitat stammt aus Clean Code: A Handbook of Agile Software Craftsmanship. )
Wie dieses Zitat in "Kommentare sind immer Fehler" reduziert wird, ist ein gutes Beispiel dafür, wie manche Leute ein vernünftiges Zitat aus dem Kontext nehmen und es in ein dummes Dogma verwandeln.
API-Dokumentation (wie javadoc) soll die API dokumentieren, damit der Benutzer sie verwenden kann, ohne den Quellcode lesen zu müssen . Also in diesem Fall die Dokumentation sollte erklären , was das Verfahren der Fall ist. Jetzt können Sie argumentieren, dass "Ruft ein Produkt anhand seiner ID ab" überflüssig ist, da dies bereits durch den Methodennamen angegeben ist. Die zurückgegebenen Informationen null
sind jedoch unbedingt zu dokumentieren, da dies in keiner Weise offensichtlich ist.
Wenn Sie die Notwendigkeit des Kommentars vermeiden möchten, müssen Sie das zugrunde liegende Problem (das null
als gültiger Rückgabewert verwendet wird) entfernen , indem Sie die API expliziter gestalten. Beispielsweise könnten Sie eine Art Option<Product>
Typ zurückgeben, sodass die Typensignatur selbst klar kommuniziert, was zurückgegeben wird, falls das Produkt nicht gefunden wird.
In jedem Fall ist es jedoch nicht realistisch, eine API nur durch Methodennamen und Typensignaturen vollständig zu dokumentieren. Verwenden Sie doc-comments für zusätzliche nicht offensichtliche Informationen, die der Benutzer kennen sollte. Nehmen wir zum Beispiel die API-Dokumentation aus DateTime.AddMonths()
der BCL:
Die AddMonths-Methode berechnet den resultierenden Monat und das resultierende Jahr unter Berücksichtigung der Schaltjahre und der Anzahl der Tage in einem Monat und passt dann den Tag-Teil des resultierenden DateTime-Objekts an. Wenn der resultierende Tag kein gültiger Tag im resultierenden Monat ist, wird der letzte gültige Tag des resultierenden Monats verwendet. Zum Beispiel: 31. März + 1 Monat = 30. April. Der Tageszeitteil des resultierenden DateTime-Objekts bleibt derselbe wie in dieser Instanz.
Es gibt keine Möglichkeit, dies nur mit dem Methodennamen und der Signatur auszudrücken! Natürlich erfordert Ihre Klassendokumentation möglicherweise nicht diese Detailgenauigkeit, sondern ist nur ein Beispiel.
Inline-Kommentare sind auch nicht schlecht.
Schlechte Kommentare sind schlecht. Zum Beispiel Kommentare, die nur erklären, was trivial aus dem Code ersichtlich ist. Das klassische Beispiel ist:
// increment x by one
x++;
Kommentare, die etwas erklären, das durch Umbenennen einer Variablen oder Methode oder durch sonstige Umstrukturierung des Codes verdeutlicht werden könnte, sind ein Codegeruch:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
Dies sind die Kommentare, gegen die Martin spricht. Der Kommentar ist ein Symptom dafür, dass kein eindeutiger Code geschrieben wurde. In diesem Fall werden selbsterklärende Namen für Variablen und Methoden verwendet. Der Kommentar selbst ist natürlich nicht das Problem, das Problem ist, wir brauchen den Kommentar, um den Code zu verstehen.
Kommentare sollten jedoch verwendet werden, um alles zu erklären, was aus dem Code nicht ersichtlich ist, z. B. warum der Code auf eine bestimmte, nicht offensichtliche Weise geschrieben ist:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
Kommentare, die erklären, was ein übermäßig verschlungenes Stück Code bewirkt, sind auch ein Geruch, aber die Korrektur besteht nicht darin, Kommentare zu verbieten, die Korrektur ist die Korrektur des Codes! Konvolutierter Code kommt zwar vor (hoffentlich nur vorübergehend bis zu einem Refactor), aber kein gewöhnlicher Entwickler schreibt beim ersten Mal perfekten, sauberen Code. Wenn verschachtelter Code vorkommt, ist es viel besser, einen Kommentar zu schreiben, der erklärt, was er tut, als keinen Kommentar zu schreiben. Dieser Kommentar erleichtert auch die spätere Umgestaltung.
Manchmal ist Code unvermeidlich komplex. Es kann sich um einen komplizierten Algorithmus handeln, oder es kann sich aus Gründen der Leistung um Code handeln, der die Klarheit beeinträchtigt. Auch hier sind Kommentare erforderlich.