"// ..." -Kommentare am Ende des Codeblocks nach "}" - gut oder schlecht? [geschlossen]


18

Ich habe oft solche Kommentare gesehen:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

und manchmal sogar so weit wie

if (condition) {
   ...
} // if (condition)

Ich habe diese Praxis nie verstanden und sie daher nie angewendet. Wenn Ihr Code so lang ist, dass Sie wissen müssen, um welche Endung es sich }handelt, sollten Sie ihn möglicherweise in separate Funktionen aufteilen. Außerdem können die meisten Entwickler-Tools auf die entsprechende Klammer zugreifen. Und schließlich ist der letzte für mich ein klarer Verstoß gegen das DRY-Prinzip; Wenn Sie die Bedingung ändern, müssen Sie daran denken, den Kommentar ebenfalls zu ändern (andernfalls kann er für den Betreuer oder sogar für Sie unübersichtlich werden).

Warum nutzen die Leute das? Sollten wir es benutzen oder ist es schlechte Praxis?


In PHP verwende ich die alternative Syntax für Kontrollstrukturenif(condition): ... else: ... endif;
systemovich

@Geoffrey van Wyk - wirklich? Ich habe noch nie jemanden gesehen, der diese außerhalb von Vorlagendateien verwendet. Sie sind extrem unüblich, aber für jeden, denke ich.
Craige

4
@Craige: Jedes von PHP nativ unterstützte Sprachkonstrukt ist nicht "Extrem unstandard" - der PHP-Interpreter definiert, was "Standard" ist.
Billy ONeal

Ada hat spezifischen Marker für das Ende der meisten Konstrukte: if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Ich finde, dass es der Lesbarkeit hilft (und es wird vom Compiler überprüft, welche Kommentare nicht sind).
Keith Thompson

Antworten:


32

Ich würde sagen, wenn Ihr Code so lang ist, dass Sie Ihren Klammern nicht einfach folgen können, muss Ihr Code für die meisten Sprachen überarbeitet werden.

In Template-Sprachen (wie PHP) kann dies jedoch gültig sein, da Sie möglicherweise einen großen HTML-Block haben, der den Anfang und das Ende der Bedingung oder Schleifenstruktur voneinander trennt.


5
Völlig gültiger Punkt für PHP, wenn Sie PHP mit HTML gemischt verwenden. 1 Punkt für Gryffindor.

3
Selbst mit PHP als Template-Sprache, gemischt mit HTML, können Sie immer noch einrücken. Sie sollten auch keine geschweiften Klammern verwenden, wenn Sie PHP als Vorlagensprache verwenden, sondern die while(): endwhile;und foreach(): endforeach;Konstrukte usw.
Htbaa

9
Ich verstehe nicht wirklich, warum Sie das PHP nicht umgestalten sollten. Wahrscheinlich in eine andere Sprache.
Tom Hawtin - Tackline

@Htbaa: Ich kann nicht glauben, dass ich die ganze Zeit PHP verwendet habe und nichts davon wusste. Vielen Dank! Bezüglich des Einrückens ziehe ich es vor, den bedingten HTML-Code wie den Rest der Seite einzurücken, anstatt mit dem PHP übereinzustimmen, das ihn erstellt.
Matt Ellen

3
@Tom: Ich habe gelacht, mich aber schuldig gefühlt. : P

17

Es ist ein Code-Geruch und in der Regel ein Kater aus altmodischen Code-Stil. Vor anständigen IDEs war das Refactoring schwieriger und nicht mehr so ​​häufig wie heute. Daher waren die Methoden länger, und diese Kommentare halfen, sie besser zu navigieren.


15

Dies ist eine schreckliche Praxis, die durch viele Faktoren überholt ist.

  • Die meisten modernen IDEs markieren die entsprechende Klammer, wenn sich das Caret auf einem der Symbole befindet.
  • Wenn Sie sauber codieren, werden Sie selten eine Stelle finden, an der Ihre Methode mehr als 10 Zeilen umfasst.

Ich stelle fest, dass viele Java-Programmierer diese Einstellung haben, und dadurch sieht der Java-Code sehr schmutzig aus und der Fokus wird vom Code weg und auf die Kommentare gerichtet.

Es wird dringend davon abgeraten, dies zu verwenden.


4
Ich habe einen Mitarbeiter (Java-Entwickler), der dies tut. Außer // für und //, wenn er // rof und // fi verwendet. Es macht mich verrückt und er macht es überall.
Jay

Ja, ich hatte eine, die darauf bestand. AAAAAGHHHHH.
Rig

2
Dies hat wirklich nichts mit Java oder Java-Programmierern zu tun, und es ist nicht üblich oder ein De-facto-Standard, der bei der Programmierung in Java zu tun ist.
Jesper

1
+1.000 für "ist eine schreckliche Praxis".
Scunliffe

6

Code wird zehnmal häufiger gelesen als geschrieben.

Wenn es das Lesen erleichtert, tun Sie es.

Ich würde auch jedem empfehlen, dies zu tun, um die Lesbarkeit zu verbessern. Die Refactoring-Techniken, Klammern in verschiedenen Zeilen usw., die andere Leute erwähnt haben, sind alle gut. Es ist auch gut, die Dinge in verschiedene Funktionen, Methoden oder Klassen aufzuteilen, so dass sich der Code selbst kommentiert. Es gibt auch Möglichkeiten, die meisten "Wenn" - und "For" -Schleifen an offensichtlichen Stellen zu entfernen und so die Notwendigkeit einer der folgenden zu beseitigen.

Aber manchmal lernen die Leute. Wenn das etwas ist, das sie tun, um den Code wirklich lesbarer zu machen, ermutigen Sie ihn, und ermutigen Sie dann auch einige andere Praktiken. Menschen, die lernen, verdienen und werden von Ermutigung profitieren, unabhängig davon, wie sie anfangen. Das Sagen von "Das ist schlecht" ist nicht so nützlich wie das Sagen von "Das andere ist besser".


6
Das ist schlimm. Sogar Lehrbücher für Anfänger tun diese Grausamkeit nicht. "Code wird 10 mal mehr gelesen als geschrieben" ... umso mehr, um die Zeit des Lesers nicht mit dieser Codekruft zu verschwenden.
Thomas Eding

@ Trinithis Was ist, wenn Sie eine switch-Anweisung mit 20 Groß- / Kleinschreibung haben? Manchmal müssen Sie 20 verschiedene Optionen unterstützen, und es ist besser, sie an einem Ort zusammenzufassen, als sie in ein mehrstufiges Entscheidungsschema umzugestalten.
quant_dev

Ich glaube, dies ist eine Praxis von Programmierern, die Gleichaltrige unterschätzen :), dass andere nicht klüger genug sind, um den Code zu lesen, es sei denn. Im Allgemeinen bin ich gegen diese Praxis, aber okay, wenn jemand sie tut, weil es einen Dschungel von Dschungeln gibt, der sie kaum lesbar macht. das mache ich sowieso nicht!
WinW

1
@trinithis Es geht nicht darum, ob es schlecht ist oder nicht, es geht um effektive Möglichkeiten, Menschen dabei zu helfen, besser zu werden, damit sie dadurch wachsen. Effektiv sein> Recht haben. Es ist auch eine absolut vernünftige Sache, wenn Sie beispielsweise alten Code umgestalten, der noch chaotischer ist. Manchmal können schlechte Dinge bessere Zwischenschritte machen und zu etwas noch Besserem führen.
Lunivore

1
@trinithis Entschuldigung, ich kann nicht herausfinden, was du meinst, wenn alles in einer Zeile steht. Ich denke, ich erwähnte, dass es auch andere Möglichkeiten gibt, Code umzugestalten, die Entwickler lernen könnten.
Lunivore

4

Ich habe eine große (C ++) Codebasis voller solcher Dinge:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

Für etwas so Kleines würde ich sagen, dass dies über "Code-Geruch" hinausgeht und zu "Code-Gestank" führt. Besonders in einer IDE, in der ich die schließende Klammer mit einem Tastendruck abgleichen kann, um die öffnende Klammer zu finden. Bei einer längeren Methode werde ich die Klammerübereinstimmung trotzdem über den Terminalkommentar ziehen. Solche Kommentare lenken mich ab und ich neige dazu, sie als Lärm zu betrachten.


Ähm, ich schätze, ich bekomme einige Formatierungen auf dieser Site nicht; Jede Klammer dort oben sollte sich in einer eigenen Zeile befinden, ebenso wie der Methodenkörper.
PSU

In C ++ öffne ich jedoch häufig oben einen anonymen Namespace für versteckte Implementierungsaufgaben. Irgendwann schließe ich diese Klammer und es ist nützlich zu wissen, was die Klammer hier bedeutet.
CashCow

4

In C ++ gibt es zwei Holdovers, bei denen dies immer noch nützlich ist und der Hinweis "Code aufteilen" nicht unbedingt gilt:

  1. Für Namespaces. Ein Namespace kann eine ganze Datei umfassen, und diese letzte Klammer kann manchmal Personen aus der Welt werfen. Daher ist es hilfreich, einen Kommentar hinzuzufügen, der angibt, dass die Klammer das Schließen eines Namespaces ist. Für den speziellen Codierungsstil in meiner Firma ist dies wichtig, da wir keine Namespaces einrücken, da entschieden wurde, dass eine solche Einrückung nur Speicherplatz in einer Datei verschwenden würde.

  2. Für #ifdef / #endif-Paare. Manchmal ist dort viel Code für die bedingte Kompilierung enthalten, es kann beim Verschachteln unangenehm werden, und der Editor, den wir häufig "hilfreich" verwenden, beseitigt Einrückungen, sodass die Kommentare für einen schnellen Überblick nützlich sind.


+1 für den Namespace-Kommentar und die Gründe. Das ist das einzige Mal, dass ich das mache und aus dem gleichen Grund
JohnB

+ lange switch-Anweisungen.
quant_dev

1

Für mich muss der Code verwirrend sein, um einen Kommentar wie den von Ihnen angegebenen hinzuzufügen.

Wenn nur // IF-Anweisung steht. Dann muss man sich fragen, warum es überhaupt da ist.


Ich stimme zu, es sieht aus wie eine Linie, die //endif
auskommentiert

1

Die Alternative, um zu sehen, was Ihre Zahnspange schließt, besteht darin, dass sich die öffnende in derselben Spalte befindet wie die schließende. Ich finde das viel klarer und lesbarer.

Der Kommentar ist nützlich, wenn es normalerweise schwierig ist, den Verlauf zu verfolgen, da das Öffnen vor langer Zeit stattgefunden hat. Dies sollte normalerweise nur für einen Namespace geschehen (insbesondere für den anonymen in C ++, der für Implementierungsdetails in der Kompilierungseinheit verwendet wird). In den meisten anderen Fällen sollte es offensichtlich sein, was Sie schließen.


1

Dies ist größtenteils ein Überbleibsel aus der Vergangenheit, als Sie in 80x24-Zeichen-Terminalfenstern gearbeitet haben, insbesondere wenn Sie einen Editor mit Fenstern wie EVE verwendet haben. Selbst jetzt erledige ich den größten Teil meiner Arbeit in einer Terminalsitzung mit vim, und ich kann die Sitzung in drei oder vier Unterfenster aufteilen, sodass ich immer nur ein paar Zeilen gleichzeitig sehen kann.

Das heißt, ich habe mich nie wirklich auf die Convention erwärmt, obwohl das meinen Speck bei mehr als einer Gelegenheit gerettet hätte. Ich sehe es nur als Lärm. Wenn Ihre Schleifen oder Bedingungen so groß werden, sollten Sie sich mit Refactoring befassen.


0

Sie geben grundsätzlich alle gültigen Gründe an, warum Sie dies nicht verwenden sollten. Jeder anständige Programmierer sollte diese anwenden. Warum benutzen die Leute es? Weil sie es falsch machen und es nicht besser wissen.


ähm, erkläre bitte die Ablehnung. Ich habe diese Antwort nicht nur erfunden, sondern sie stammt aus einer realen Erfahrung: Mein Kollege, der ein paar Fuß neben mir sitzt, programmiert seit mehr als 10 Ohren so und hatte keine Ahnung, warum dies falsch ist, bis ich ihn erklärte .
1.

Möglicherweise wurde es in einem Lehrbuch verwendet, also kamen ein paar Leute vom College, um es zu benutzen? Es könnte einen Platz in einem Einführungstext haben. Ebenfalls einigermaßen gültig in einem Präprozessor, insbesondere in # ifdef / endif include guards
Martin Beckett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.