[Vorneweg: Java inside. Sry.]
Original von buhrmi
Was Kommentare betrifft bin ich irgendwie anders eingestellt als die meisten...
Ich versuche immer Code so zu schreiben und zu formatieren, dass das Überfliegen und Verstehen der Methode schneller geht als das Lesen eines eventuellen Kommentares. Wenn ich mal Kommentare schreibe, dann nur zum einfacheren Verständnis des Codes. Was genau eine Methode macht und wozu sie gut ist, sollte sich durch den Methodennamen und dem Kontext ergeben. Ein Kommentar braucht man da nicht...
Eine Ausnahme sehe ich bei Blackbox-artigen öffentlichen Schnittstellen, wo ich gern mal lange Kommentare drüberklatsche. Besonders für diejenigen, die keine Erfahrung mit Ruby haben.
Ja, genauso. Die Beispiele von Todi42/Torsten entsprechen dem auch.
Inline-Kommentare (d.h. Implementierung) sind für mich nur folgenden Situationen wichtig:
- Es wird etwas sehr Unübliches gemacht (etwa ein Fallthrough im Switch-Case, evtl. ein continue/break in einer Schleife, ignorierte Exceptions, u.ä.). In der Regel sind statische Code-Analyse-Programme auch in der Lage diese entsprechende Kommentierungen zu erkennen und diesen "schlechten" Code doch ohne Warnung zu erlauben.
- Das unnatürliche Behandeln von Exceptions (Java), sei es des explizite Nichtbeachten oder das explizite Benandeln.
- Es gibt etwas extrem spezielles, feste Literale, spezielle Inline-Konfigurationen.
- Es ist wirklich so harte Materie (Algorithmus), dass eine Kommentierung als sinnvoll erscheint.
Bei Schnittstellenkommentierung (das primär wichtige) ist natürlich auch relevant wie das Gesamtsystem aussieht.* "Mein" Projekt (nicht in der BG-Szene) läuft auf Basis des Spring Frameworks - wenn man sich nun darauf einlässt und die Strukturen und Konventionen einhält, spart man sich nicht manchen Code, sondern auch Kommentar-Boilder-Code.
Ein weiterer Punkt ist die Fachlogik: Kommentare auf Entitäten halte ich zu mindestens bisher für überflüssig. Darüber hinaus ändert sich das in einem agileren Projekt eh dauernd - und bei ORM sollte man ja in der Lage sein, und sprechende Entitäten schreiben zu können. Spezielle Service-Aufgaben werden entweder kommentiert, oder wahlweise auf eine externe Dokumentation (Trac, Wiki) ausgelagert, falls es schon zu komplex für eine Inline-Doc sein sollte (bzw. jene nicht ausreicht).
Ich gehe auch hin, und kommentiere Teile der Fachlogik selbst in einem Service-Interface nicht mehr: Warum sollte ich List := getAccounts(), Account := getAccountByUsername(string) des Services/DAO noch irgendwie kommentieren? Aus der Schnittstelle gehen Variablentypen eindeutig hervor und die Datenbanktransaktion wird in diesem Falle (Service) auch per Annotation angegeben (JPA/Hibernate). Einzig allein die Fehlerbehandlung (Was passiert im Falle von username=null?) könnte man erwähnen; sowie was passiert, wenn etwa kein Benutzer gefunden wurde.*
Falls also etwa ein leerer Username überhaupt relevant wäre, ergibt die Rückgabe eben ein defensives NULL. Das gleiche gilt für den Fall, das kein passender existiert. Eine Exception zu werfen ist dagegen sehr offensiv und muss auf jeden Fall benannt werden - und behandelt.
Halb OT: Je nach Sprache, Framework und Vorlieben gibt es auch die Möglichkeit, im Code direkt bestimmte Prüfungen vorzunehmen. In C gibt es die banalen Asserts, in Java passende Äquivalente in diversen Bibliotheken. Für Schnittstellen (also Methoden, d.h. beim Aufruf der Methode selbst) beinhalten etwa die FindBugs-Annotationen eine Reihe von Extras, um Prüfungen zur Prüfzeit (nicht Ausführung!) zu minimieren (Supress Warnings) oder zu erweitern (Beispiel: findByUsername(@NotNull String username)). Der Vorteil von so einer Vorbedingungen ist, dass sie sogar mit Hilfe einer Code-Analyse (hier: FindBugs) wahlweise während der Entwicklung oder auf dem Build-Server verwendet werden kann.
* Auch das kann man minimieren, indem für das Projekt übliche Standardvorgehen aufstellt und einhält. Also beispielsweise grundsätzlich tolerante, und defensive Schnittstellen.. oder sehr offensive, die jeden Fehler bereits mit einer Exception quittieren.
Es kommt darauf an, für was man entwickelt. Ein JavaScript-Projekt entwickele und kommentiere ich natürlich ganz anders als das Java-Projekt. Oder gar PHP-Projekt. ;) (Stichwort: Variablentypen).