Was ist eine gute Möglichkeit, if-else-Klauseln zu kommentieren? [geschlossen]

15

Wenn ich ein typisches if-else-Konstrukt in einer beliebigen Sprache schreibe, frage ich mich, wie ich es am besten (in Bezug auf Lesbarkeit und Übersicht) kommentieren kann. Besonders wenn ich die else-Klausel kommentiere, fühlen sich die Kommentare für mich immer unangebracht an. Nehmen wir an, wir haben ein Konstrukt wie dieses (Beispiele sind in PHP geschrieben):

if ($big == true) {
    bigMagic();
} else {
    smallMagic()
}

Ich könnte es so kommentieren:

// check, what kind of magic should happen
if ($big == true) {
    // do some big magic stuff
    bigMagic();
} else {
    // small magic is enough
    smallMagic()
}

oder

// check, what kind of magic should happen
// do some big magic stuff
if ($big == true) {
    bigMagic();
}
// small magic is enough
else {
   smallMagic()
}

oder

// check, what kind of magic should happen
// if:   do some big magic stuff
// else: small magic is enough
if ($big == true) {
    bigMagic();
} else {
    smallMagic()
}

Was sind Ihre Best-Practice-Beispiele, um dies zu kommentieren?

Gipfel
quelle
8
else { // for future reader: sorry, at the moment of writing this I did not have time and skills to come up with a better way to express my logic
Mücke
1
Warum ist Bigger besser / vorzuziehen / anders? Ich weiß es nicht.
JeffO
Ist das ein Thema für Fragen oder Argumente? Auch wenn die Frage gut gemeint ist, sind das Kriegstreiber.
Unabhängige
1
Ich finde es interessant, dass so viele Menschen das Gefühl haben, dass diese Frage ihre Beantwortung wert ist, aber nicht, dass sie es wert ist, zur Sprache gebracht zu werden. Obwohl ich an den Antworten interessiert bin (meine ist die einzige +1), scheint die Frage ein typisches Beispiel für ein Problem mit dem Fahrradauswurf zu sein.
Canisrufus
1
@canisrufus Es sieht für dich nur so aus, weil die Abwärtsstimmen die Aufwärtsstimmen ausgleichen. In diesem Moment gibt es 6 positive und 4 negative Stimmen für ein Netto +2.
Caleb

Antworten:

34

Ich bevorzuge entweder:

if ($magic == big) {
    bigMagic();
}
else {
    smallMagic();
}

oder:

if ($magic == big) {
    // big magic requires a big surprise, so I'm telling you about it here
    surprisingThing();
}
else {
    // give a magical feeling even if $magic is noMagicAtAll
    smallMagic();
}

Es scheint ein wenig albern zu sein, einen Kommentar zu schreiben, in dem erklärt wird, was Ihr Zustand überprüft, es sei denn, der Code gibt dies nicht eindeutig an. Selbst dann ist es besser, den Code neu zu schreiben, um ihn so klar wie möglich zu gestalten. Das Gleiche gilt für die Körper der Bedingungsblöcke - wenn Sie den Grund für die Ausführung von etwas Offensichtlichem angeben können, tun Sie dies, anstatt zu kommentieren.

Ich bin nicht mit der Philosophie einverstanden, niemals Kommentare zu schreiben, aber ich glaube daran, Kommentare zu vermeiden, die aussagen, was der Code sagen soll. Wenn Sie einen Kommentar wie "Überprüfen Sie, welche Art von Magie passieren soll" schreiben, wenn der Code sagen könnte if ($magic == big) {..., hören die Leser sehr schnell auf, Ihre Kommentare zu lesen. Durch die Verwendung von weniger, aussagekräftigeren Kommentaren erhält jeder Ihrer Kommentare einen höheren Stellenwert, und die Leser achten mit größerer Wahrscheinlichkeit auf die Kommentare, die Sie verfassen.

Die Auswahl aussagekräftiger Namen für Ihre Variablen und Funktionen ist wichtig. Ein ausgewählter Name kann dazu führen, dass im gesamten Code keine erklärenden Kommentare erforderlich sind. In Ihrem Beispiel $magicoder vielleicht $kindOfMagicscheint es ein besserer Name zu sein als $bigin Ihrem Beispiel, da es sich um die "Art von Magie" handelt, die getestet wird, nicht um die "Größe" von etwas.

Sagen Sie so viel wie möglich in Code. Speichern Sie Prosa für die Fälle, die mehr Erklärung erfordern, als Sie vernünftigerweise in Code schreiben können.

Caleb
quelle
13
+1 übertreibe keine Kommentare, klarer Code erfordert keine Kommentare
Ratschenfreak
3
@ratchetfreak Scheint, als wären wir uns größtenteils einig, aber Kommentare sind oft notwendig, um den Code klarer zu machen. Das Bereitstellen von historischem Kontext, Erklären für überraschendes Verhalten oder Auflösen von Mehrdeutigkeiten erfolgt am besten mit Kommentaren.
Caleb
1
Guter Punkt, Caleb. Es ist wahr, dass Code sich selbst automatisch kommentieren sollte, solange dies möglich ist.
Acme
7
Gute Kommentare erklären nicht das, was - "Prüfe, welche Art von Magie sollte passieren" - sie erklären das Warum, dh "Benutzer können die Art von Magie auswählen, die ausgeführt werden soll" oder "Der Dienst wird große Magien füllen, wenn sie es sind." verfügbar, so müssen wir den Typ überprüfen "oder was auch immer. Egal wie gut Ihre Codierung ist, die Gründe sind denen unbekannt, die mit den Geschäftsregeln nicht vertraut sind.
Bruno Brant
1
Das Problem ist, dass es am einfachsten ist, schwer lesbaren Code zu schreiben und nicht zu kommentieren. Es ist auch einfacher, schwer lesbaren Code zu schreiben, ihn aber gut zu kommentieren, als durchgehend Code zu schreiben, der so gut ist, dass er keine Kommentare benötigt.
Asfallows
11

Versuchen Sie es mit erklärenden Variablennamen

Kommentare können großartig sein, aber wenn möglich, sollte der Code selbstdokumentierend sein. Eine Möglichkeit hierfür sind erklärende Variablennamen. Zum Beispiel stattdessen:

if (user.has_sideburns && user.can_gyrate) {
  // This user is a potential Elvis impersonator

}

Ich würde eine benannte Variable bevorzugen:

is_potential_elvis_impersonator = user.has_sideburns && user.can_gyrate

if (is_potential_elvis_impersonator) {
  ...
}
Nathan Long
quelle
2
Ich gehe noch einen Schritt weiter und Verwendung: is_potential_elvis_impersonator. (Ist / Hat / etc. Präfix für Boolesche Variable ..)
Jake Berger
@jberger - ich mag es. Antwort entsprechend bearbeiten.
Nathan Long
3

Nur um einige Kommentare zu vervollständigen:

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. ( Clean Code von Robert C. Martin )

BTW: Ich empfehle dieses Buch.

CSA
quelle
3

Kommentare sollten den Code nicht umschreiben, sondern erklären Dinge, die nicht im Code enthalten sind (größeres Bild, warum, warum keine Alternative gewählt wurde ...) Und Ihre Beispielkommentare sind genau das: Umschreiben des Codes.

Sie haben manchmal das Gefühl, dass zu Beginn des elseZweigs eine Umschreibung erforderlich ist , aber dies ist oft ein Zeichen dafür, dass Ihr thenZweig zu groß ist.

Ein Programmierer
quelle
2

In Ihrem speziellen Beispiel sind Kommentare wahrscheinlich nicht erforderlich. Wie Caleb sagte , wenn der Code klar geschrieben ist und Variablen semantische Namen haben, ist es weniger wahrscheinlich, dass Anweisungen kommentiert werden müssen.

Vergleichen Sie Ihr Snippet damit:

if ($x) {
    func1();
} else {
    func2();
}

In diesem Fall möchten Sie auf jeden Fall Kommentare verwenden, um zu beschreiben, was x, func1 und func2 darstellen (und die Person zu schlagen, die die Dinge nach diesem Schema benannt hat, besonders wenn Sie es waren). Man kann nicht einmal sagen, ob $xes sich um einen Booleschen handeln soll. Aber auch dies ist ein Fall, in dem Sie nicht unbedingt Kommentare benötigen, wenn Sie umgestalten und umbenennen können.

Im Allgemeinen schreibe ich gerne Kommentare für logische Blöcke, die Dinge beschreiben, die der Code nicht alleine kann. Ein Einzeiler pro ~ 10-20 Zeilen, der beschreibt, was die folgenden wenigen Zeilen auf einer höheren Abstraktionsebene leisten (z. B. // Make the right amount of magic happenfür Ihr Beispiel), hilft Ihnen, sich zu orientieren und gibt einem neuen Prüfer einen Einblick darüber, was Sie wann tun .

Ich schreibe diese Einzeiler tatsächlich oft ein, bevor ich mit dem Schreiben von Code beginne, damit ich nicht den Überblick über den Fluss verliere, den das Segment haben soll.

Wenn Sie es wirklich vorziehen (oder ein Mandat erfordert), Klauseln in einem if-Block zu kommentieren, ungeachtet der Lesbarkeit des Codes, empfehle ich:

// Broad description of block
if (something) {
    //Do this because something
    something();
} else {
    //Do this because !something
    somethingElse();
}

Ich denke, es ist das sauberste, weil der Kommentar mit dem Code übereinstimmt, zu dem er gehört. Ein Kommentar, der beschreibt, was Code tut, sollte so nah wie möglich an dem Kommentar sein, den er beschreibt.

asfallows
quelle
2
if (IsWeekDay(day))
{// weekday -> alarm at 7am
   ...
}
else if(day == DayOfWeek.Saturday)
{// saturday -> alarm at 11am
   ...
}
else
{// (sunday) -> no alarm
   ...
}

Ich halte meine Klammern in einer Reihe und setze sie direkt hinter die Klammer.

[Condition] -> [pseudo-code]

Ansonsten bedeutet es technisch, dass alle anderen Bedingungen fehlgeschlagen sind, daher verwende ich normalerweise runde Klammern.

([Condition]) -> [pseudo-code]

Hinweis: Dies ist für C #.

Jake Berger
quelle
1

Ich versuche, Kommentare innerhalb des Blocks zu verwenden, die angeben, was dieser Block tut (Ihr erstes Beispiel).

Wo dies irgendwie zusammenbricht, ist bei der Verwendung elseif. Ich benutze Basic, damit es keinen expliziten Endeblock gibt, und muss oft kommentieren, welche Bedingung überprüft wird, wenn sie zu lang ist (natürlich mit einem Zeilenumbruch).

'Check XYZ
If Condition1 then
  'We need to do T and S
  DoCodeFor1();

'Check ABC
ElseIf Condition1 then
  'This requires something else to be done
  DoCodeFor2()

Else
  'We have no other option than to...
  DoCodeFor3()

End If
Deanna
quelle
Ja, dies funktioniert wirklich besser, wenn Sie eine Sprache ohne Klammern verwenden.
Acme
1
  • Halten Sie Ihre bedingten Blöcke wirklich kurz.
  • Rufen Sie eine Methode mit einem aussagekräftigen Namen auf, wenn der bedingte Code mehr als ein oder zwei Zeilen lang sein soll.
  • Verwenden Sie aussagekräftige Namen für Ihre Variablen.
  • Stellen Sie sicher, dass die bedingte Anweisung in ihrer Bedeutung klar und nicht verschleiert oder lang ist. Wenden Sie eine Methode an, wenn dies dazu beiträgt, die Inhalte sauber und lesbar zu halten.

Wenn all dies fehlschlägt, fügen Sie vor der if-Anweisung einen sehr kleinen beschreibenden Kommentar hinzu, um Ihre Absicht zu verdeutlichen. Ansonsten sollte es eigentlich gar keinen Kommentar geben.

S.Robins
quelle
0

In C ++ oder C # würde ich normalerweise keine einfachen Fälle kommentieren (wenn klar ist, was passiert) und diese Art von Stil zum Kommentieren des finalen Sonst ...

if (pattern == AAA)
{
  DoSomethingAAA();
}
else if (pattern == BBB)
{
  DoSomethingBBB();
}
else // if (pattern == CCC)
{
  DoSomethingCCC();
}
dodgy_coder
quelle
4
Oder besser "pattern.doSomething ()" und OO seinen Job machen lassen.
Paul Tomblin