Sollten geschweifte Klammern in einer eigenen Zeile erscheinen? [geschlossen]

273

Sollten geschweifte Klammern in einer eigenen Linie stehen oder nicht? Was denkst du darüber?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

oder sollte es sein

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

oder auch

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Bitte seien Sie konstruktiv! Erklären Sie, warum, tauschen Sie Erfahrungen aus und belegen Sie sie mit Fakten und Referenzen.

Tom Wijsman
quelle
104
Ich finde das "== true" ablenkender als die Wahl der Platzierung der Zahnspange.
Dan Dyer
11
@Dan: Ich denke, dass es für die Übersichtlichkeit sehr hilfreich ist, den bedingten Ausdruck immer zu erläutern.
Wizard79
4
Der einzige Grund dafür ist, dass Ihre IDE / Ihr Editor die Erkennung übereinstimmender geschweifter Klammern nicht unterstützt.
Leeand00,
4
@ leeand00: Einige von uns drucken immer noch komplexen / unbekannten Code aus, um ihn zu studieren / zu kommentieren. Ein guter hübscher Drucker mildert jedoch die meisten Probleme.
Shog9
2
Schade, die Frage ist geschlossen. Nach einiger Zeit der Syntax-Verwendung mit Einrückungen wechselte ich zu einer (vielleicht seltsamen) anderen Klammer-Struktur. Wie Ihre erste, aber schließende Klammer in der letzten Zeile des Blocks. (nach Codezeile)
CND

Antworten:

88

Als Student habe ich geschweifte Klammern in dieselbe Zeile gesetzt, damit weniger Zeilen vorhanden sind und der Code auf weniger Seiten gedruckt wird. Es ist ärgerlich, sich ein einzelnes Klammerzeichen anzusehen, das als einziges in einer Zeile gedruckt wird. (Umwelt, Papierverschwendung)

Wenn Sie jedoch große Anwendungen codieren, ist es angesichts des Gruppierungsgefühls erschwinglich, einige Zeilen nur mit geschweiften Klammern zuzulassen.

Unabhängig davon, welchen Stil Sie auswählen, sollten Sie konsistent sein, damit es für Ihr eigenes Gehirn nicht zu einem Aufwand wird, mehrere Stile in verwandten Codeteilen zu verarbeiten . In verschiedenen Szenarien (wie oben) würde ich sagen, dass es in Ordnung ist, verschiedene Stile zu verwenden. Es ist einfacher, den Kontext auf hoher Ebene zu wechseln.

dbza
quelle
6
Auf der anderen Seite ist die Klammer der neuen Linie ein ANSI-STANDARD, K & R nicht. Aber das Schöne an Standards ist, dass es so viele verschiedene gibt (siehe auch uncyclopedia.wikia.com/wiki/AAAAAAAAA ! Auf uncyclopedia).
Quandary
"es gibt weniger Zeilen" Ich habe Terabyte Platz und viele Pixel. Warum sollte ich mehr Zeilen verwenden?
12431234123412341234123
1
@ 12431234123412341234123: Ich denke, er meint, weil einige Leute den Code zur Codeüberprüfung ausdrucken. Und jeder nicht unbedingt notwendige Zeilenumbruch ist Papierverschwendung oder ein km² Waldverschwendung im Maßstab. Wenn Sie es jedoch nicht ausdrucken (ich sicherlich nicht), ist ANSI viel besser als K & R. Außerdem sollte jeder, der drucken möchte, wahrscheinlich einen automatisierten Code-Formatierer verwenden - dies sollte also eine Frage der Werkzeuge sein, keine Frage des Codierungsstils.
Quandary
247

Sie sollten niemals die 3. Methode durchführen.

Wenn Sie beim ersten Mal auf geschweifte Klammern verzichten, sparen Sie möglicherweise ein paar Tastatureingaben, aber der nächste Programmierer, der mitkommt, fügt Ihrer else-Klausel etwas hinzu, ohne zu bemerken, dass der Block fehlt.

Schreiben Sie Ihren Code für andere Personen.

rhettg
quelle
113
Ich wünschte, ich wüsste, woher dieses kleine Stück Weisheit stammt. Weil das Schreiben Ihres Codes für Leute, die sich nicht die Mühe machen, ihn zu lesen, so sinnlos ist, wie Sie nur können ...
Shog9
69
Der zweite Programmierer kann seine eigenen Klammern hinzufügen, wenn er etwas hinzufügt. Er ist nicht dumm, und in einer Codierungskonvention, die das Weglassen von geschweiften Klammern für einfache Dinge wie diese fordert, wird er es wissen, zu schauen.
Ken Bloom
25
Optionale Klammern sind nicht optional. Es gibt nur wenige schlechtere Entwurfsentscheidungen, die in C getroffen und auf die Nachkommen übertragen wurden. Dass es in einer neueren Sprache als C # weiterlebt, macht mich wütend.
Adam Crossland
28
Es spielt keine Rolle, wie schlau Sie sind oder wie tief der Kodierungsstandard für einzeilig ausgelassene Locken ist: Wenn Sie ein Problem oder einen Fehler lösen möchten, werden Sie wahrscheinlich vermissen, dass die Locken ausgelassen wurden. Und für eine Gesamtsumme von 2 Sekunden Arbeit, ist es wirklich so schlimm, explizit zu sein?
Jordanien
11
Es gibt einen Vorteil von Stil 3, den Sie alle vermissen: Sie bekommen mehr Code auf einmal auf Ihren Bildschirm.
Loren Pechtel
203

Lange Zeit argumentierte ich, dass sie gleichwertig oder so nahe beieinander lagen, dass der mögliche Gewinn durch die Auswahl der richtigen Option weit unter den Kosten für Streitigkeiten lag .

Es ist jedoch wichtig , konsequent zu sein . Also sagte ich, lasst uns eine Münze werfen und mit dem Schreiben von Code beginnen.

Ich habe schon einmal gesehen, wie Programmierer sich solchen Veränderungen widersetzten. Komm darüber hinweg! Ich habe in meiner Karriere oft gewechselt. Ich verwende in meinem C # sogar andere Stile als in meiner PowerShell.

Vor ein paar Jahren arbeitete ich in einem Team (ca. 20 Entwickler), das entschied, Eingaben anzufordern, eine Entscheidung zu treffen und diese dann in der gesamten Codebasis durchzusetzen. Wir hätten 1 Woche Zeit, um uns zu entscheiden.

Viel Stöhnen und Augenzwinkern. Viele "Ich mag meinen Weg, weil es besser ist", aber keine Substanz.

Während wir uns mit den Feinheiten der Frage befassten, fragte jemand, wie man mit diesem Problem auf der gleichen Linie umgeht:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Beachten Sie, dass nicht sofort ersichtlich ist, wo die Parameterliste endet und der Body beginnt. Vergleichen mit:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Wir haben gelesen, wie Menschen auf der ganzen Welt mit diesem Problem umgegangen sind, und dabei das Muster gefunden, nach der offenen Klammer eine Leerzeile einzufügen:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Wenn Sie eine visuelle Pause einlegen möchten, können Sie dies auch mit einer Zahnspange tun. Dann werden auch Ihre visuellen Pausen konsistent.

Edit : Zwei Alternativen zur 'Extra Blank Line'-Lösung bei Verwendung von K & R:

1 / Die Funktionsargumente werden anders als im Funktionskörper eingerückt

2 / Setzen Sie das erste Argument in dieselbe Zeile wie den Funktionsnamen und richten Sie weitere Argumente in neuen Zeilen an diesem ersten Argument aus

Beispiele:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Bearbeiten

Ich behaupte immer noch, dass Konsistenz wichtiger ist als andere Überlegungen, aber wenn wir keinen etablierten Präzedenzfall haben , ist Klammer-an-Nächste-Linie der richtige Weg.

Jay Bazuzi
quelle
33
Zu Ihrer Information, ich mag wie eine vernünftige Person klingen, aber ich bin tatsächlich eine Nuss. Bei einfachen einzeiligen Blöcken verwende ich weder Klammern noch Zeilenumbrüche. Dabei wird "if (foo) bar ()" in einer Zeile angegeben. Ich bemühe mich, meinen Code so einfach zu gestalten, dass er kein Problem darstellt.
Jay Bazuzi
38
Kam hierher, um genau dies zu posten. Unzählige Personen, die die öffnende Klammer in derselben Zeile belassen, setzen eine Leerzeile nach (insbesondere zu Beginn von Klassen und Methoden), da es sonst schwierig ist, den Klassen- / Methodenkopf vom Hauptteil zu trennen. Wenn Sie trotzdem eine zusätzliche Linie verwenden, können Sie auch die Klammer dort platzieren und den zusätzlichen Vorteil erzielen, dass die Einrückung einfacher zu sehen ist.
Yevgeniy Brikman
27
Ich habe die leere Zeile nicht gesehen - ich kenne die doppelte Einrückung der Parameter für MyFunction () besser, wenn sie in einer anderen Zeile verlaufen.
Armand
34
Das Aufteilen der Parameter auf mehrere Zeilen ist verrückt.
Fosco
10
Das Argument "Funktionsparameter" ist ein roter Hering. Offensichtlich sollten die Argumente doppelt gemeint sein. Kein Problem, es vom folgenden Code zu unterscheiden.
David Ongaro
99

Die Grundregeln sind:

  1. Befolgen Sie den bestehenden Kodierungsstandard des Projekts.
  2. Wenn es keinen Codierungsstandard gibt und Sie eine vorhandene Codebasis bearbeiten, deren Eigentümer eine andere Person ist, sollten Sie mit dem Stil des vorhandenen Codes übereinstimmen, unabhängig davon, wie sehr Sie ihn mögen / nicht mögen.
  3. Wenn Sie an einem Projekt auf der grünen Wiese arbeiten, besprechen Sie dies mit anderen Teammitgliedern und einigen Sie sich auf einen formellen oder informellen Kodierungsstandard.
  4. Wenn Sie als einziger Entwickler an einem Projekt auf der grünen Wiese arbeiten, entscheiden Sie sich selbst und seien Sie dann rücksichtslos konsequent.

Auch wenn Sie keine externen Einschränkungen haben, ist es (IMO) am besten, nach einem vorhandenen (weit verbreiteten) Codierungsstandard oder einer Stilrichtlinie zu suchen und diese zu befolgen. Wenn Sie Ihren eigenen Stil rollen, besteht eine gute Chance, dass Sie es in ein paar Jahren bereuen werden.

Schließlich ist ein Stil, der mit vorhandenen Stilprüfern und Code-Formatierern implementiert / implementiert werden kann, besser als einer, der manuell "erzwungen" werden muss.

Stephen C
quelle
10
Diese Antwort verdient mehr Stimmen.
AShelly
1
Konsistenz ist der Schlüssel
MediaVince
70

Der Vorteil der ersten Methode besteht darin, dass sie vertikal kompakter ist, sodass Sie mehr Code auf Ihrem Bildschirm anzeigen können. Deshalb bevorzuge ich sie. Das einzige Argument, das ich für die zweite Methode gehört habe, ist, dass es einfacher ist, öffnende und schließende Klammern zu koppeln, aber die meisten IDEs haben eine Tastenkombination dafür und es ist tatsächlich eine falsche Aussage - anstatt eine öffnende Klammer mit einem schließenden zu koppeln eckige Klammer Sie können eine schließende eckige Klammer mit dem Ausdruck "Blockanfang" (wenn, sonst für, während) auf derselben Einrückungsstufe koppeln, damit Sie genauso leicht feststellen können, wo der Blockanfang liegt.

Ich sehe keinen Grund, eine ganze Zeile nur für eine Klammer zu verschwenden, wenn das vorhergehende for / while / if-Konstrukt bereits den Beginn eines Blocks optisch anzeigt.

Trotzdem glaube ich, dass die schließende Klammer in einer eigenen Zeile stehen sollte, da wir etwas brauchen, um das Ende eines Blocks und seine Einrückungsstruktur auf sichtbare Weise anzuzeigen.

EpsilonVector
quelle
12
Nein ... Ich sage Ihnen, warum Sie die Menge an Code, die auf Ihren Bildschirm passt, reduzieren sollten, indem Sie etwas tun, das nicht zur Klarheit des Codes beiträgt.
EpsilonVector
6
Als ich
anfing zu programmieren,
57
Es gibt eine Fülle von Untersuchungen, die bis in das frühe Steam-Zeitalter zurückreichen (Weinberg, "Psychologie der Computerprogrammierung") und zeigen, dass das Verständnis von Programmierern DRAMATISCH abnimmt, wenn die Menge an Code, die angezeigt werden muss, größer ist als möglich gleichzeitig gesehen werden (dh eine Bildschirmseite, eine Druckerseite). Dieses Phänomen spricht DRINGEND dafür, den vertikalen Raum als eine wertvolle Ressource anzusehen, die nicht unentgeltlich verschwendet werden darf, weshalb die erste Methode bevorzugt wird.
John R. Strohm
10
LOL @ "Verschwenden einer GESAMTEN Zeile". OH MEIN GOTT! Nicht das!! = P
Nick Spreitzer
6
@ Julio Auf dem College habe ich Methode 1 sehr bevorzugt und konnte es nicht ertragen, Methode 2 zu lesen. Nachdem ich bei einer Firma gearbeitet habe, die C # verwendet, wo der Standard Methode 2 ist, habe ich das auch gemocht. Ich kann jetzt entweder lesen oder verwenden; keiner stört mich. Menschen, die stark abgeneigt auf das eine oder andere reagieren, reagieren im Allgemeinen übermäßig auf etwas, mit dem sie nicht vertraut sind.
KChaloux
46

ich bevorzuge

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Über

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

weil die Zeile you.postAnswer();auf den ersten Blick viel leichter zu lesen und zu finden ist. Zweitens verschmilzt es mit der darüber liegenden Linie ( you.hasAnswer()), sodass meine Augen mehr fokussieren müssen, um es zu lesen.

JD Isaacks
quelle
7
Dies gilt solange, bis Ihr Programm die Höhe Ihres Bildschirms überschreitet. ;)
weberc2
13
@ weberc2 Ich denke, wenn dein Programm die Höhe des Bildschirms überschreitet, werden sich zwei Zeilen weniger nicht viel ändern.
Mageek
13
Vor 10 Jahren hätte ich mich auf Bildschirmgröße geeinigt. Heute benutze ich einen 1920 * 1200 Bildschirm. Es passt eine Menge Code, mehr als mein Gehirn auf einmal verarbeiten kann. Mit der ersten Methode kann ich die verschiedenen Bereiche öffnen / schließen, ohne sie lesen zu müssen.
LightStriker
3
Ich konnte nie verstehen, warum ich diese Methode bevorzugte, aber genau dafür.
Declan McKenna,
2
@Mageek Dies ist verspätet, aber es sind nicht 2 Zeilen, sondern 2 Zeilen für jeden Bereich. Das ist O (N), nicht O (1). Ich fühle mich eigentlich nicht so stark dabei; Es ist wichtiger, dass Sie einen Stil auswählen, der lange Parameterlisten lesbar macht.
weberc2
38

Ich bevorzuge die erste Methode. Zahnspangen sind keine separate Linie wert.

Die Sache ist, dass Zahnspangen nicht wichtig sind. Sie sind nur syntaktischer Müll , der absolut unnötig ist, um zu verstehen, wozu Code dient, wozu er dient und wie er implementiert wird. Sie sind nur eine Hommage an alte C-ähnliche Sprachen, bei denen eine visuelle Gruppierung der Operatoren aufgrund des geringen verfügbaren Bildschirmplatzes nicht möglich war.

Es gibt Sprachen (Python, Haskell, Ruby), die ohne geschweifte Klammern überhaupt in Ordnung sind. Dies bestätigt nur, dass es sich bei geschweiften Klammern um Papierkorb handelt und dass sie nach Möglichkeit keine Zeile verdienen sollten:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}
P Shved
quelle
7
Ich weiß nichts über Haskell oder Ruby, aber Python ist für Leerzeichen empfindlich, weshalb keine geschweiften Klammern oder andere Trennzeichen zum Bezeichnen von Blöcken erforderlich sind. Die Klammern sind nicht nur syntaktisches Rauschen; Sie dienen einem tatsächlichen Zweck.
Robert Harvey
14
@ Robert, In C müssen Sie sowohl Leerzeichen als auch geschweifte Klammern verwenden. In Python sollten Sie nur Leerzeichen verwenden. Welches ist besser?
P Shved
5
@Pavel, in C 'musst du kein Whitepace machen.
Ken Bloom
7
@ KenBloom C-Programme ohne Leerzeichen können nicht gelesen werden. Also musst du sie trotzdem machen.
P Shved
6
Unabhängig davon, ob geschweifte Klammern eine gute Idee sind oder nicht, scheint die bloße Existenz von Sprachen, die sie nicht verwenden, kein Argument für oder gegen sie zu sein. Dies deutet nur darauf hin, dass es möglich ist, eine Sprache ohne sie zu haben, nicht, dass es sich um ein gutes oder schlechtes Sprachdesign handelt.
Jason
37

Verwenden Sie Python und umgehen Sie das Argument vollständig.

Mark Ransom
quelle
17
+1SyntaxError: not a chance
Seth
6
Dies ist einfach keine Option für die große Mehrheit der Projekte. Außerdem hat das Einrücken für die Gruppierung einige Probleme.
Bryan Oakley
@ Bryan, mir ist klar, dass dies nicht sehr praktisch ist. Ich dachte nur, dass es ein Standpunkt ist, der da draußen sein muss, stärker als nur ein Kommentar. Und ich bin nie auf die Probleme gestoßen, die durch Einrückungen verursacht werden, die Sie implizieren, wahrscheinlich, weil ich Tabulatoren und Leerzeichen nicht mische.
Mark Ransom
Verwenden Sie Go und umgehen Sie das Argument vollständig (plus statische Eingabe, Geschwindigkeit und einen Compiler!) :)
weberc2
4
Drücken Sie dann die Leertaste zu oft und beobachten Sie, wie der Compiler / Interpreter Sie auslacht. Das wird in den meisten geschweiften Sprachen nicht passieren.
Pharap,
27

Die Position der geschweiften Klammern sollte sein

Metadaten

Vom Programmierer in der IDE konfigurierbar. Auf diese Weise sehen diese lästigen Klammern im gesamten Code unabhängig vom Autor gleich aus.

Jonathan
quelle
7
Stimme voll und ganz zu. Es geht um Präsentation und nicht um Daten.
Petruza
Das Problem ist, dass, wenn Sie es zulassen, dass jeder seinen eigenen Wert festlegt, die Dinge sehr schnell chaotisch werden, wenn Commits ausgeführt werden.
Andy
1
@ Andy: Genau das ist der Punkt, die IDE wird ändern, wie sie aussehen, aber nur in der IDE! Die eigentliche Quelle wird nicht berührt. Für die Versionskontrolle können Sie Hooks hinzufügen, die die Einstellung für geschweifte Klammern in eine allgemeine Situation umwandeln, sodass jeder den Code auf die gleiche Weise auscheckt.
klaar
@klaar Jede moderne IDE, die ich verwendet habe, ändert die Tabulatoren in Leerzeichen und verschiebt die geschweiften Klammern in ihre eigene Zeile oder in das Ende der "öffnenden" Zeile. Ich bin mir nicht sicher, warum Sie denken, dass die Quelle in diesen Fällen nicht angerührt wird, und das ist der Grund für meinen Kommentar. Es wird in der Regel von den IDEs abhängig von den Entwicklereinstellungen geändert. Dies bedeutet, dass während eines Commits viele Änderungen auftreten, die nur ein Rauschen sind, wenn die geschweiften Klammern in ihre eigene Zeile verschoben werden, wodurch die IST-Änderung, die jemand vorgenommen hat, ausgeblendet wird.
Andy
@Andy: Gibt es nicht die Möglichkeit, Hooks zu verwenden, die diese Diskrepanzen in Bezug auf Leerzeichen und geschweifte Klammern in ein einheitliches Standard-Uppon-Commit umwandeln, um das von Ihnen beschriebene Rauschproblem zu umgehen? So oder so, ein richtiges Versionierungssystem sollte überschreitet kleinlich Dinge wie Leerzeichen oder andere unsinnige Dinge.
klaar
19

Es hängt davon ab, ob.

Wenn ich in Javascript oder jQuery codiere, verwende ich das erste Formular:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Wenn ich jedoch in C # codiere, verwende ich die zweite Form, da dies die kanonische Methode ist, um dies in C # zu tun.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Beachten Sie, dass Ihr Beispiel geschrieben werden kann

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

in C #.

Robert Harvey
quelle
1
Es kann in vielen solchen Sprachen geschrieben werden, weil eine Block-Anweisung eine Anweisung ist. Hinzufügen! :-)
Tamara Wijsman
2
Gemäß den "Framework Design Guidelines" besteht der "kanonische Weg" darin, die öffnende Klammer in derselben Zeile (dh dem ersten Formular) zu platzieren. Sagen Sie einfach ...
Uwe Honekamp
3
@Uwe: Vielleicht. Aber Microsoft hat die „ausgerichteten Klammern“ -Ansatz für alle seine MSDN C # Beispiele, und es ist in Visual Studio gebacken, so ...
Robert Harvey
@Uwe: Das ist Cwalinas Buch und es hat einen schrecklichen Namen, da es viel mehr als das ist. Die FDG zu MSDN hat dazu nichts zu sagen. Ich frage mich auch, warum die Framework Design Guidelines etwas über die C # -Codierungspraxis aussagen .
R. Martinho Fernandes
3
Tatsächlich sollten Sie geschweifte Klammern in Javascript in dieselbe Zeile setzen. Sie können Fehler verursachen, wenn geschweifte Klammern in einer eigenen Zeile stehen. Beispiel: encosia.com/…
Joseph Hansen,
18

Ich bevorzuge die erste, weil es mir schwerer fällt, den Fehler in diesem Beispiel zu erkennen.

if (value > maximum);
{
    dosomething();
}

als es in diesem Beispiel ist

if (value > maximum); {
    dosomething();
}

Das ; {sieht für mich eher falsch aus als eine Zeile, die mit endet, ;sodass ich es eher bemerke.

bmb
quelle
11
Sie machen ein gutes Argument, aber persönlich ist mir das in meiner 5-jährigen Programmierung nur einmal passiert. Ich konnte nicht herausfinden, warum es nicht ausgeführt wurde, stellte es auf SO und jemand wies mich schnell auf das Semikolon hin. Jedes Mal, wenn es komprimiert wird, um diese eine Zeile weniger zu verwenden, fällt mir das Lesen schwerer.
JD Isaacks
6
Das "; {" sieht aus wie ein zwinkerndes, mürrisches Gesicht oder vielleicht eine Person mit einem Schnurrbart.
Glenatron
+1 Tolles Beispiel zur Beantwortung: sehr subtiler Fehler, der leicht übersehen wird. Gedanken, die auch auf dem Plan erregen, der dieses oben zeigt.
Therobyouknow
10
Natürlich kennzeichnet jede anständige IDE die leere Steueranweisung und jeder anständige Compiler gibt eine Warnung aus.
Dunk
@Dunk Der einzige Fehler in Ihrem Argument (dem ich voll und ganz zustimme) ist, dass heutzutage so viele Leute interpretierte Sprachen verwenden (JavaScript, PHP usw.), dass viele "Programmierer" einen Compiler nicht von einem Double kennen würden Latté.
Craig
15

Ich bevorzuge eine leichte Variante von 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Warum?

  • Ich denke, immer geschweifte Klammern in die eigene Zeile zu setzen, verringert die Lesbarkeit. Ich kann nur eine bestimmte Menge Quellcode auf meinem Bildschirm anzeigen. Bracket-Stil 2) macht Hove-Algorithmen mit vielen verschachtelten Schleifen und Bedingungen schmerzhaft lang.

  • Ich möchte elsejedoch auf einer neuen Linie beginnen, weil ifund zusammen elsegehören, visuell. Wenn sich eine Klammer vor der befindet else, ist es viel schwieriger zu erkennen, was zu was gehört.

  • 3) disqualifiziert sich. Wir alle wissen, was schlimme Dinge passieren können, wenn Sie die Klammern weglassen und es vergessen.

Alexander Gessler
quelle
1
Ich habe dieses hier gesehen, wo ich arbeite. Es ist interessant.
Almo
1
Ich mag diesen Stil auch besser, da ich damit elsebei Bedarf einen Kommentar über die Zeile setzen und / oder eine Leerzeile zwischen dem if-Block und dem else-Block einfügen kann, damit die Dinge weniger überfüllt aussehen. Der Bracket-Stil Nr. 2 bewirkt nichts anderes, als die Aktionen von den Bedingungen zu distanzieren. Mein Favorit ist definitiv Pythons No Bracket Style :)
sayap
4
Wenn es wichtig ist, die Anzahl der Codezeilen auf dem Bildschirm zu maximieren, müssen Sie nur die Zeilenumbrüche beseitigen. Sie werden in der Lage sein, viele Linien auf einem Bildschirm zu erhalten. Ich möchte nicht, dass ich beim Lesen innehalte und nachdenke. meine definition von lesbarer. Mit den Klammern ignoriert mein Verstand sie. Ohne die Klammern muss mein Verstand die Steuerblöcke anhalten und ausrichten. Keine lange Pause, aber trotzdem eine Pause.
Dunk
1
Ja, wenn und sonst zusammengehören, ABER so ist {und} und wie} in einer separaten Zeile, {sollte auch in einer separaten Zeile stehen. "Ich kann nur eine bestimmte Menge an Quellcode auf meinen Bildschirm bringen" Und genau deshalb ist es überhaupt keine Option, zu sagen, dass 3) "sich selbst disqualifizieren" würde. Nach einem Jahrzehnt der Arbeit mit 3) habe ich nie vergessen, Klammern beim Hinzufügen einer neuen Codezeile einzufügen, und kenne auch niemanden, der dies jemals getan hat. Wenn ich Code an Leute anpassen muss, die nicht richtig lesen können, wo endet er? Verwenden Sie bestimmte Sprachfunktionen nicht mehr, weil einige der Codeleser sie möglicherweise nicht verstehen?
Kaiserludi

10

Ich habe irgendwo gelesen, dass die Autoren eines Buches ihren Code so formatieren wollten:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Aufgrund der Platzbeschränkungen ihres Herausgebers mussten sie jedoch Folgendes verwenden:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Jetzt weiß ich nicht, ob das stimmt (da ich es nicht mehr finde), aber der letztere Stil ist in Büchern sehr verbreitet.

Aus persönlicher Sicht bevorzuge ich die Klammern in einer separaten Zeile als:

a) Sie weisen auf einen neuen Geltungsbereich hin.
b) Es ist leichter zu erkennen, wenn Sie eine Nichtübereinstimmung haben (obwohl dies in einer IDE, die Fehler für Sie hervorhebt, weniger ein Problem darstellt).


... Die zweite Option erleichtert auch beide Punkte (wobei die Einrückung allein dem Zweck der Kombination aus Klammer und Einrückung dient). :)
weberc2

10

Ah, der One True Brace Style .

Es hat alles, was für einen Heiligen Weg nötig ist - sogar einen Propheten (Richard "mein Weg oder die Autobahn" Stallman).

Der Typ hat sich in so vielen Dingen so geirrt, aber GNU ist genau richtig, wenn es um Zahnspangen geht.


[Update] Ich habe das Licht gesehen und verehre jetzt Allman


9
Ich verstehe den Sinn des GNU-Stils nicht, außer dass er Lisp-Code modelliert. Scheint viel Arbeit für wenig Nutzen.
Robert Harvey

Ich kenne niemanden, der den GNU-Stil verwendet. 1 TB den ganzen Weg.
Jé Queue

Sie können nicht schlechter als zwei Einrückungsstufen pro Block machen, außer natürlich für den Lisp-Stil, das versteht sich von selbst.
Ergosys

4
+1 für den Link zu geschweiften Klammern. Es zeigt, dass unabhängig von Ihrem Stil viele großartige Menschen nicht mit Ihnen übereinstimmen.
Florian F

@RobertHarvey Es gibt keine zusätzliche Arbeit, wenn dies der Fall ist, verwenden Sie nicht das richtige Tool, um Code zu schreiben oder ihn richtig zu konfigurieren. Der Vorteil ist viel besser lesbarer Code, Sie sehen jeden Fehler in der Klammer sehr schnell und Sie können einfach nur den Code lesen, während Sie Unterblöcke ignorieren.
12431234123412341234123

9

Zweites Beispiel, ich bin sehr gut in Bezug auf Lesbarkeit. Ich kann es nicht ertragen zu schauen, wenn Blöcke auf andere Weise = (


1
Untersuchungen zufolge ist es einfacher, kompakten Code zu lesen, wenn eine Codebasis die Höhe des Bildschirms überschreitet.
weberc2

5
@ weberc2, könnten Sie diesen Forschungsarbeiten DOIs zur Verfügung stellen?
Grzegorz Adam Kowalski

9

Einfache Antwort: Was ist leichter zu debuggen?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

In welchem ​​Fall haben Sie das Problem zuerst diagnostiziert?

Ich weiß nicht viel für den persönlichen Vorlieben (es gibt viele andere Arten, einschließlich Whitesmith und al.) Und ich kümmern sich nicht viel ... solange es nicht meine Fähigkeit nicht behindert den Code und lesen debug es.

Was das Argument "Waste Space" betrifft, kaufe ich es nicht: Ich tendiere sowieso dazu, Leerzeilen zwischen logischen Gruppen einzufügen, um das Programm klarer zu machen ...


1
Sie sind beide so einfach zu debuggen, vor allem, da es sich um einen kurzen Codeblock handelt. Die Einrückung ist konsistent und erleichtert die Visualisierung der tatsächlichen Codeblöcke.
Htbaa

@ HTBAA: in der Tat :) Also warum die Mühe machen?
Matthieu M.

@MatthieuM. Der erste Block ist für mich sinnvoller, da die Zeilenumbrüche (im zweiten Block) zwischen der Funktionssignatur, der for-Anweisung und der if-Anweisung meiner Meinung nach nicht zusammenhängen, aber eindeutig nicht. Leerzeilen dienen zum Trennen von nicht zusammenhängenden Codebits. Code, der anderen Codezeilen ähnelt, bedeutet, dass sie tatsächlich verwandt sind. Das ist natürlich alles 'imo', aber ich habe mich gefragt, was du meinst. BEARBEITEN: Auch jede richtige IDE wird feststellen, dass eine geschweifte Klammer fehlt, und Ihnen bei der Interpretation Ihres Codes ein paar Fehler unterlaufen.
klaar

7

Nicht, dass es irgendjemandem auffällt, aber aus diesem Grund gehören geschweifte Klammern in dieselbe Zeile wie die Bedingung (mit Ausnahme sehr langer Bedingungen, aber das ist ein Randfall):

In C ist dies ein gültiges Konstrukt:

while (wahr);
{
    char c;
    getchar (); // Auf Eingabe warten
}

Schnell! Was macht dieser Code? Wenn Sie mit "Endlosschleife nach Eingabe fragen" geantwortet haben, liegen Sie falsch! Es kommt nicht einmal zum Eingang. Es wird erwischt while(true). Beachten Sie das Semikolon am Ende. Dieses Muster ist tatsächlich üblicher, als es scheinen sollte; In C müssen Sie Ihre Variablen am Anfang eines Blocks deklarieren, weshalb ein neuer gestartet wurde.

Eine Codezeile ist ein Gedanke. Klammern sind ein Teil des Gedankens, der die Bedingung oder Schleife enthält. Daher gehören sie in dieselbe Linie.

Christian Mann
Dies ist bei weitem das beste Argument für den K & R-Stil, den ich je gesehen habe. Der Rest ist bei heutigen IDE-Systemen mit Code-Folding-Unterstützung lächerlich. Dies gilt nur für C-Sprachen, die ;Blockenden unterstützen. Dies ist auch der Grund, warum ich dieses Block-Ending-System verachte, das meiner Meinung nach veraltet ist und die Sprache Go beweist. Ich habe dieses Problem oft gesehen, obwohl nicht in diesem Szenario. Es passiert normalerweise dort, wo sie beabsichtigen, der Aussage etwas hinzuzufügen und es zu vergessen.
Jeremy
um so verwendet zu werden, postAnswer()und doSomething()sollte einen Wert für einen ternären Operator zurückgeben, was häufig nicht der Fall ist: Sie können sehr gut einen Wert für ungültig (kein Wert) zurückgeben. und auch (zumindest in c #) Ergebnis ?:sollte eine Variable zugewiesen werden
ASh
4
Wie Ihr Beispiel zeigt, ist Einrückung für lesbaren Code so wichtig wie geschweifte Klammern. Tatsächlich machen einige Sprachen Einrückungen zur einzigen Möglichkeit, Anweisungen zu verschachteln!
1
Ok, ich finde Sie ehrlich gesagt inkonsistentes Beispiel schwer zu lesen. Nicht WIRKLICH schwer, aber schwerer als wenn es konsequent wäre.
Almo
Ich stimme Almo zu. Es ist kein Fall von "ist es wirklich schwer". Es ist ein Fall von "es ist definitiv schwieriger", auch wenn es nicht schwer ist. Warum also die Dinge schwerer machen? In den "Spielzeug" -Beispielen, die die Leute nennen, gibt es natürlich wenig Unterschiede. Wenn ich bösen Code von jemand anderem erbe und er Methode 1 verwendet hat, ist es meiner Erfahrung nach ziemlich häufig erforderlich, ihn in Methode 2 umzuwandeln, um der Logik folgen zu können. Aufgrund der Tatsache, dass es häufig notwendig wird; Es beantwortet automatisch die Frage, welche Methode besser und verständlicher ist.
Dunk
@Dunk: Ich kann mir keinen Code vorstellen, der durch das Vertauschen so irrelevanter Details spürbar verbessert würde.
Jkerian
@ jkerian-Anscheinend haben Sie nicht viel Code von anderen geerbt, die das Projekt oder die Firma schon lange verlassen haben. Ich kann mir nicht vorstellen, dass jemand mit jahrelanger Erfahrung in diese Situation gerät. Andererseits ist die Arbeitssituation bei jedem anders. Auch wenn Sie "formale" Codeüberprüfungen durchführen müssen, macht die Formatierung einen großen Unterschied. Natürlich den Code lesen zu können, ist sehr wichtig. Sicher, ich kann innehalten und überlegen, ob ich die richtigen Klammern finden soll, aber das verlangsamt den Prozess. Eine Möglichkeit erfordert keine Pause, die anderen schon. Deshalb verstehe ich nicht, warum eine andere Wahl empfohlen werden könnte.
Dunk
Oldtimer wie ich verwenden drei Tastenanschläge, um den Block auszuwählen, egal wo die verdammten Klammern sind.
Ergosys
8
Schlimm, schlimm, ich meine schreckliches, schreckliches Beispiel. Das Problem ist nicht die Zahnspange! Es ist die verrückte Einrückung!
R. Martinho Fernandes
@Martinho Fernandes Ich dachte, dass das Platzieren von Klammern und Einrückungen zusammenpassen ...
AndrejaKo
2
Nicht unbedingt ... rücken Sie die Klammern richtig ein und wechseln Sie dann nach dem Zufallsprinzip den Stil. Sie werden feststellen, dass dies verständlich ist.
Jkerian
Tatsächlich hat das Nachdenken darüber meine eigene Antwort auf diese Frage motiviert.
Jkerian
"95% der Fehler in dem von ihm erstellten Programm stammten aus nicht übereinstimmenden Klammern" - nur in interpretierten Sprachen, nicht kompiliert.
Mawg
3
Der C-Stil hat mich immer geärgert. Seien Sie konsequent!
Christian Mann
5
+1, -1. Warum sollten Sie NICHT mit Tabulatoren einrücken, da jeder Editor die Tabulatorenlänge an Ihre beliebige Länge anpassen kann? Andernfalls führen Sie viele von uns, die echte Einrückungen bei 8 mögen, dazu, Ihren Code zu verfluchen.
Jé Queue
9
... wie die meisten Programmierer, die daran ersticken würden.
Jé Queue
4
Das scheint schrecklich. Denken Sie an den zusätzlichen Aufwand, den Sie machen müssen, wenn Sie eine Zeile oben einfügen oder die obere Zeile entfernen möchten. Sie können die Linie nicht einfach löschen und weitermachen. Denken Sie daran, die geschweifte Klammer erneut einzufügen.
Bryan Oakley
lol das ist der Hammer! :) besser als der erste Stil!
Nawfal
Anscheinend hat es sogar einen Namen. Die Horstman Syyle wird in Wikipedia erwähnt . Ich habe mit einer solchen Codebasis gearbeitet, es ist wirklich nicht schlecht zu benutzen.
AShelly
2
Noch schlimmer wäre es, wenn jemand mitkam und tat: if (you.hasAnswer ()) you.postAnswer (); else you.doSomething (); you.doSomethingElse (); - Es ist ein Rezept für subtile Fehler, die das Auge leicht
überspringen
@FinnNk: Genau!
Chankey Pathak
2
Wenn jemand eine weitere Anweisung hinzufügen möchte, kann er sie selbst in geschweifte Klammern setzen. Jeder Programmierer, der sein Geld wert ist, sollte das wirklich herausfinden können.
Robert Harvey
Ich wollte sagen, dass seine 3. Methode falsch ist.
Chankey Pathak
3
@Robert Harvey, ich habe sehr erfahrene Programmierer gesehen, die es versäumt haben, die geschweiften Klammern beim Ändern des vorhandenen Codes einzufügen. Ich denke, das Problem ist, dass Einrückungen einen viel stärkeren Hinweis auf die Bedeutung geben als geschweifte Klammern (vor allem, da es mehrere geschweifte Klammern gibt), so dass es ziemlich einfach ist, die fehlende geschweifte Klammer zu übersehen, wenn die Einrückung so aussieht, wie Sie es erwarten.
AShelly
5

Ich mag die erste Methode. Es scheint ordentlicher zu sein, und es ist kompakter, was mir gefällt.

EDIT: Ah, ein dritter. Ich mag das am besten, wenn es möglich ist, da es noch kleiner / ordentlicher ist.

Ullallulloo
quelle
5

Du könntest es schreiben:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Die Frage zu beantworten; Früher bevorzugte ich geschweifte Klammern in einer eigenen Zeile, aber um nicht über Fehler beim automatischen Einfügen von Semikolons in Browsern nachdenken zu müssen, begann ich mit der Verwendung des ägyptischen Stils für Javascript. Und als ich Java in Eclipse programmierte, hatte ich kein Interesse daran, den Standard-Klammerstil zu bekämpfen (oder zu konfigurieren), also habe ich mich auch in diesem Fall für Ägyptisch entschieden. Jetzt geht es mir gut mit beiden.

FeatureCreep
quelle
um so verwendet zu werden, postAnswer()und doSomething()sollte einen Wert für einen ternären Operator zurückgeben, was häufig nicht der Fall ist: Sie können sehr gut einen Wert für ungültig (kein Wert) zurückgeben. und auch (zumindest in c #) Ergebnis ?:sollte eine Variable zugewiesen werden
ASh
4

Fast alle Antworten hier sagen eine Variation über "Was auch immer Sie tun, bleiben Sie bei einem oder zwei".

Also habe ich einen Moment darüber nachgedacht und musste zugeben, dass ich es einfach nicht als so wichtig betrachte. Kann mir jemand ehrlich sagen, dass das Folgende schwer zu befolgen ist?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Ich bin mir über niemanden sicher ... aber ich habe absolut keine Probleme damit, mental zwischen Stilen hin und her zu wechseln. Ich brauchte ein paar Momente, um herauszufinden, was der Code tat, aber das ist das Ergebnis meiner zufälligen Eingabe von C-ähnlicher Syntax. :)

Meiner nicht ganz einfachen Meinung nach sind öffnende Klammern für die Lesbarkeit des Codes fast völlig irrelevant. Es gibt ein paar Eckfälle, in denen der eine oder andere Stil einen Unterschied macht. Zum größten Teil wird dies jedoch durch die vernünftige Verwendung von Leerzeilen behoben.

FWIW, unsere Codierungsstile bei der Arbeit verwenden eine etwas strukturiertere Form 1 und eine modifizierte Form 3. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Ich bin gespannt, ob diejenigen, die Form 2 stark bevorzugen, diese Version von Form 1 besser finden, nur weil die leere Linie eine stärkere visuelle Trennung bietet.

jkerian
quelle
4
Wie Ihr Beispiel zeigt, ist Einrückung für lesbaren Code so wichtig wie geschweifte Klammern. Tatsächlich machen einige Sprachen Einrückungen zur einzigen Möglichkeit, Anweisungen zu verschachteln!
1
Ok, ich finde Sie ehrlich gesagt inkonsistentes Beispiel schwer zu lesen. Nicht WIRKLICH schwer, aber schwerer als wenn es konsequent wäre.
Almo
Ich stimme Almo zu. Es ist kein Fall von "ist es wirklich schwer". Es ist ein Fall von "es ist definitiv schwieriger", auch wenn es nicht schwer ist. Warum also die Dinge schwerer machen? In den "Spielzeug" -Beispielen, die die Leute nennen, gibt es natürlich wenig Unterschiede. Wenn ich bösen Code von jemand anderem erbe und er Methode 1 verwendet hat, ist es meiner Erfahrung nach ziemlich häufig erforderlich, ihn in Methode 2 umzuwandeln, um der Logik folgen zu können. Aufgrund der Tatsache, dass es häufig notwendig wird; Es beantwortet automatisch die Frage, welche Methode besser und verständlicher ist.
Dunk
@Dunk: Ich kann mir keinen Code vorstellen, der durch das Vertauschen so irrelevanter Details spürbar verbessert würde.
Jkerian
@ jkerian-Anscheinend haben Sie nicht viel Code von anderen geerbt, die das Projekt oder die Firma schon lange verlassen haben. Ich kann mir nicht vorstellen, dass jemand mit jahrelanger Erfahrung in diese Situation gerät. Andererseits ist die Arbeitssituation bei jedem anders. Auch wenn Sie "formale" Codeüberprüfungen durchführen müssen, macht die Formatierung einen großen Unterschied. Natürlich den Code lesen zu können, ist sehr wichtig. Sicher, ich kann innehalten und überlegen, ob ich die richtigen Klammern finden soll, aber das verlangsamt den Prozess. Eine Möglichkeit erfordert keine Pause, die anderen schon. Deshalb verstehe ich nicht, warum eine andere Wahl empfohlen werden könnte.
Dunk
4

Ich bin überrascht, dass dies noch nicht angesprochen wurde. Ich bevorzuge den zweiten Ansatz, da Sie damit den Block einfacher auswählen können.

Wenn die geschweiften Klammern in derselben Spalte und in einer eigenen Zeile beginnen und enden, können Sie am Rand oder mit dem Cursor in Spalte 0 auswählen. Dies entspricht im Allgemeinen einem großzügigeren Bereich bei der Mausauswahl oder weniger Tastenanschlägen bei der Tastaturauswahl.

Ursprünglich arbeitete ich mit geschweiften Klammern in derselben Zeile wie die Bedingung, aber als ich wechselte, stellte ich fest, dass sie die Geschwindigkeit, mit der ich arbeitete, beschleunigte. Es ist natürlich nicht Tag und Nacht, aber es ist etwas, das Sie etwas langsamer machen wird, wenn Sie mit Zahnspangen neben Ihren Konditionen arbeiten.

Tim O'Neil
quelle
Oldtimer wie ich verwenden drei Tastenanschläge, um den Block auszuwählen, egal wo die verdammten Klammern sind.
Ergosys
2

Ich persönlich mag den zweiten Weg.

Die Art und Weise, wie ich demonstriere, ist jedoch meiner Meinung nach die beste, weil sie die größte Arbeitsplatzsicherheit bietet! Ein Kommilitone von meiner Universität bat mich um Hilfe bei seinen Hausaufgaben und so sah sein Code aus. Das gesamte Programm sah aus wie ein einziger Block. Das Interessante ist, dass 95% der Fehler in dem von ihm erstellten Programm auf nicht übereinstimmende Klammern zurückzuführen sind. Die anderen 5% waren offensichtlich, sobald die Zahnspangen übereinstimmten.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);
AndrejaKo
quelle
8
Schlimm, schlimm, ich meine schreckliches, schreckliches Beispiel. Das Problem ist nicht die Zahnspange! Es ist die verrückte Einrückung!
R. Martinho Fernandes
@Martinho Fernandes Ich dachte, dass das Platzieren von Klammern und Einrückungen zusammenpassen ...
AndrejaKo
2
Nicht unbedingt ... rücken Sie die Klammern richtig ein und wechseln Sie dann nach dem Zufallsprinzip den Stil. Sie werden feststellen, dass dies verständlich ist.
Jkerian
Tatsächlich hat das Nachdenken darüber meine eigene Antwort auf diese Frage motiviert.
Jkerian
"95% der Fehler in dem von ihm erstellten Programm stammten aus nicht übereinstimmenden Klammern" - nur in interpretierten Sprachen, nicht kompiliert.
Mawg
2

Ich persönlich bevorzuge die erste Methode, wahrscheinlich, weil ich PHP auf diese Weise zum ersten Mal gelernt habe.

Für einzeilige ifAnweisungen verwende ich

if (you.hasAnswer()) you.postAnswer();

Wenn es nicht you.postAnswer();aber etwas viel länger ist, wie you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);ich wahrscheinlich auf den ersten Typ zurückgreifen werde:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Ich werde niemals einen Zeilenumbruch verwenden, und ich werde niemals diese Methode verwenden, wenn es auch eine elseAnweisung gibt.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

ist eine theoretische Möglichkeit, aber keine, die ich jemals nutzen würde. Dies müsste in verwandelt werden

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}
TRiG
quelle
2

Sie sollten nicht; erste Methode für mich.

Wenn ich mir die zweite ansehe, fühlt es sich aufgrund der nicht verwendeten Zeilen (die nur geschweifte Klammern enthalten, außer der allerletzten schließenden Klammer) so an, als würde die Kontinuität des Codes durchbrochen. Ich kann es nicht so schnell lesen, weil ich besonders auf leere Zeilen achten muss, die normalerweise eine Trennung im Code oder so bedeuten, aber auf keinen Fall "diese Zeile gehört zu einer geschweiften Klammer" (die nur die Bedeutung wiederholt) Einrückung).

Genau wie beim Schreiben von Text ist das Hinzufügen von Einrückungen am Anfang eines Absatzes überflüssig, wenn sich davor eine Leerzeile befindet (doppeltes Zeichen für eine Änderung des Absatzes). In diesem Fall müssen keine Zeilen für geschweifte Klammern verschwendet werden richtig eingerückt.

Außerdem kann, wie bereits erwähnt, mehr Code in den Bildschirm eingefügt werden, was ansonsten etwas kontraproduktiv ist.

Joanis
quelle
2

Dies hängt von der Plattform / Sprache / Konvention ab

In Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

In c #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

In C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Ich hasse es, wenn Java-Typen ihren Stil in C # -Code verwenden und umgekehrt.

OscarRyz
quelle
3
Der C-Stil hat mich immer geärgert. Seien Sie konsequent!
Christian Mann
1

Alles was ich sagen kann ist, dass wenn Sie ein Fan von Methode 3 sind, Sie von jedem IDE-Code-Formatierer auf der Erde verfolgt werden.

Phil Cohen
quelle
1

Ich verwende die erste Methode einfach, weil sie kompakter ist und mehr Code auf dem Bildschirm zulässt. Ich selbst hatte noch nie ein Problem mit der Paarung von geschweiften Klammern (ich schreibe sie immer zusammen mit der ifAnweisung auf, bevor ich die Bedingung hinzufüge, und in den meisten Umgebungen können Sie zur entsprechenden geschweiften Klammer springen).

Wenn Sie haben Klammern visuell paaren müssen, dann würde ich die zweite Methode bevorzugen. Dies ermöglicht jedoch weniger Code auf einmal, sodass Sie mehr scrollen müssen. Und das hat zumindest für mich eine größere Auswirkung auf das Lesen von Code als auf die korrekte Ausrichtung von geschweiften Klammern. Ich hasse Scrollen. Wenn Sie jedoch über eine einzelne ifAnweisung scrollen müssen , ist diese höchstwahrscheinlich zu groß und muss überarbeitet werden.

Aber; Das Wichtigste ist die Konsistenz. Verwenden Sie das eine oder andere - niemals beides!

gablin
quelle
0

Als ich mit 12 das Programmieren zum ersten Mal lernte, setzte ich die geschweiften Klammern in die nächste Zeile, da die Microsoft-Lernprogramme für die Codierung so sind. Ich habe damals auch mit 4-stelligen Tabulatoren eingerückt.

Nach ein paar Jahren lernte ich Java und JavaScript und sah mehr geschweiften Klammern im selben Code, also änderte ich mich. Ich begann auch mit 2-Leerzeichen einzurücken.

Ming-Tang
quelle
5
+1, -1. Warum sollten Sie NICHT mit Tabulatoren einrücken, da jeder Editor die Tabulatorenlänge an Ihre beliebige Länge anpassen kann? Andernfalls führen Sie viele von uns, die echte Einrückungen bei 8 mögen, dazu, Ihren Code zu verfluchen.
Jé Queue
0

Es gibt eine vierte Option, die die Klammern ausgerichtet hält, aber keinen Platz verschwendet:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

Das einzige Problem ist, dass die meisten Autoformatierer der IDE daran ersticken.

Ahelly
quelle
9
... wie die meisten Programmierer, die daran ersticken würden.
Jé Queue
4
Das scheint schrecklich. Denken Sie an den zusätzlichen Aufwand, den Sie machen müssen, wenn Sie eine Zeile oben einfügen oder die obere Zeile entfernen möchten. Sie können die Linie nicht einfach löschen und weitermachen. Denken Sie daran, die geschweifte Klammer erneut einzufügen.
Bryan Oakley
lol das ist der Hammer! :) besser als der erste Stil!
Nawfal
Anscheinend hat es sogar einen Namen. Die Horstman Syyle wird in Wikipedia erwähnt . Ich habe mit einer solchen Codebasis gearbeitet, es ist wirklich nicht schlecht zu benutzen.
AShelly
-1

Es hängt alles von Ihnen ab, solange Sie nicht an einem Projekt arbeiten, in dem vom Projektmanager einige Codierungsbeschränkungen oder Standards festgelegt wurden, denen alle Programmierer, die an diesem Projekt arbeiten, beim Codieren folgen müssen.

Ich persönlich würde die 1. Methode vorziehen.

Ich habe auch nicht verstanden, was Sie mit der 3. Methode zeigen wollen?

Ist das nicht ein falscher Weg? Betrachten Sie zum Beispiel eine Situation als ...

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

Was ist nun, wenn jemand weitere Anweisungen im if- Block hinzufügen möchte ?

In diesem Fall löst der Compiler bei Verwendung der 3. Methode den Syntaxfehler aus.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();
Chankey Pathak
quelle
2
Noch schlimmer wäre es, wenn jemand mitkam und tat: if (you.hasAnswer ()) you.postAnswer (); else you.doSomething (); you.doSomethingElse (); - Es ist ein Rezept für subtile Fehler, die das Auge leicht
überspringen
@FinnNk: Genau!
Chankey Pathak
2
Wenn jemand eine weitere Anweisung hinzufügen möchte, kann er sie selbst in geschweifte Klammern setzen. Jeder Programmierer, der sein Geld wert ist, sollte das wirklich herausfinden können.
Robert Harvey
Ich wollte sagen, dass seine 3. Methode falsch ist.
Chankey Pathak
3
@Robert Harvey, ich habe sehr erfahrene Programmierer gesehen, die es versäumt haben, die geschweiften Klammern beim Ändern des vorhandenen Codes einzufügen. Ich denke, das Problem ist, dass Einrückungen einen viel stärkeren Hinweis auf die Bedeutung geben als geschweifte Klammern (vor allem, da es mehrere geschweifte Klammern gibt), so dass es ziemlich einfach ist, die fehlende geschweifte Klammer zu übersehen, wenn die Einrückung so aussieht, wie Sie es erwarten.
AShelly