it-swarm-eu.dev

Sollten geschweifte Klammern in einer eigenen Linie erscheinen?

Sollten geschweifte Klammern auf ihrer 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 sei konstruktiv! Erklären Sie, warum, tauschen Sie Erfahrungen aus und belegen Sie sie mit Fakten und Referenzen.

284
Tamara Wijsman

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

Beim Codieren großer Anwendungen ist es jedoch erschwinglich, einige Zeilen mit nur geschweiften Klammern zuzulassen, wenn man das Gefühl der Gruppierung berücksichtigt.

Welchen Stil Sie auch wählen, seien Sie konsistent, damit es für Ihr eigenes Gehirn nicht zu einem Aufwand wird, mehrere Stile in verwandte Codeteile 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 einer hohen Ebene zu wechseln.

90
dbza

Sie sollten niemals die 3. Methode anwenden.

Wenn Sie beim ersten Mal auf Zahnspangen verzichten, sparen Sie möglicherweise beim ersten Mal ein paar Tastenanschläge, aber der nächste Codierer, der mitkommt, fügt Ihrer else-Klausel etwas hinzu, ohne zu bemerken, dass beim Block Zahnspangen fehlen.

Schreiben Sie Ihren Code für andere Personen.

251
rhettg

Lange Zeit habe ich argumentiert, dass sie gleichwertig sind, oder so sehr nahe am gleichen Wert , dass der mögliche Gewinn durch die richtige Wahl weit, weit ist , unter den Kosten, um darüber zu streiten.

Es ist jedoch wichtig, konsistent zu sein . Also sagte ich, lass uns eine Münze werfen und Code schreiben.

Ich habe schon früher gesehen, wie Programmierer solchen Veränderungen widerstanden haben. Komm darüber hinweg! Ich habe in meiner Karriere viele Male gewechselt. Ich verwende in meinem C # sogar andere Stile als in meiner PowerShell.

Vor einigen Jahren arbeitete ich in einem Team (~ 20 Entwickler), das sich entschied, um Eingabe zu bitten, dann 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 Augenrollen. Viele "Ich mag meinen Weg, weil es besser ist", aber keine Substanz.

Während wir die Feinheiten der Frage untersuchten, fragte jemand, wie man mit diesem Problem im Klammer-auf-der-Linie-Stil umgeht:

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

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

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

Wir haben etwas darüber gelesen, wie Menschen auf der ganzen Welt mit diesem Problem umgegangen sind, und das Muster gefunden, nach der offenen Klammer eine leere Zeile hinzuzufügen:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

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

Bearbeiten : Zwei Alternativen zur Lösung für zusätzliche Leerzeilen bei Verwendung von K & R:

1/Die Funktionsargumente anders als der Funktionskörper einrücken

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
}

/Edit

Ich behaupte immer noch, dass Konsistenz wichtiger ist als andere Überlegungen, aber wenn wir keinen Präzedenzfall haben, dann ist Brace-on-Next-Line der Weg, den man gehen sollte.

206
Jay Bazuzi

Die Grundregeln sind:

  1. Befolgen Sie den bestehenden Codierungsstandard des Projekts.
  2. Wenn es keinen Codierungsstandard gibt und Sie eine vorhandene Codebasis bearbeiten, die jemand anderem gehört, müssen 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 Green-Field-Projekt arbeiten, diskutieren Sie mit anderen Teammitgliedern und kommen Sie zu einem Konsens über einen formellen oder informellen Kodierungsstandard.
  4. Wenn Sie als einziger Entwickler an einem Green-Field-Projekt arbeiten, entscheiden Sie sich selbst und seien Sie dann rücksichtslos konsequent.

Selbst 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 spielen, besteht eine gute Chance, dass Sie ihn in ein paar Jahren bereuen werden.

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

103
Stephen C

Der Vorteil der ersten Methode besteht darin, dass sie vertikal kompakter ist, sodass Sie mehr Code auf Ihren Bildschirm einfügen 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 einer schließenden zu koppeln Klammer Sie können eine schließende Klammer mit dem Ausdruck "Blockanfang" (falls sonst für, während) auf derselben Einrückungsstufe koppeln, sodass Sie genauso einfach feststellen können, wo sich der Blockanfang befindet.

Ich sehe keinen Grund, eine ganze Zeile nur für eine Klammer zu verschwenden, wenn das vorhergehende Konstrukt für/while/if bereits visuell den Beginn eines Blocks 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 sichtbar anzuzeigen.

72
EpsilonVector

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 einfacher zu lesen und zu finden ist. Auf die zweite Weise wird es mit der darüber liegenden Linie (you.hasAnswer()) verschmolzen, sodass meine Augen sich mehr konzentrieren müssen, um es zu lesen.

49
JD Isaacks

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

Die Sache ist, dass Zahnspangen nicht wichtig sind. Sie sind nur syntaktischer Papierkorb, was absolut unnötig ist, um zu verstehen, wofür Code ist, welchen Zweck er hat und wie er implementiert wird. Sie sind nur eine Hommage an C-ähnliche Sprachen im alten Stil, in denen eine visuelle Gruppierung von Operatoren aufgrund des geringen verfügbaren Bildschirmplatzes nicht möglich war.

Es gibt Sprachen (Python, Haskell, Ruby), die ohne geschweifte Klammern in Ordnung sind. Dies bestätigt nur, dass Zahnspangen Müll sind und nach Möglichkeit keine Zeile für sie verdienen sollten:

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

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

37
Mark Ransom

Die Position der geschweiften Klammern sollte sein

Metadaten

konfigurierbar in der IDE vom Programmierer. Auf diese Weise sehen diese lästigen Klammern in allen Codes, unabhängig vom Autor, gleich aus.

28
Jonathan

Ich bevorzuge die erste, weil es für mich schwieriger ist, den Fehler in diesem Beispiel zu erkennen.

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

als es in diesem Beispiel ist

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

Der ; { Sieht für mich einfach falscher aus als eine Zeile, die mit ; Endet, sodass ich es eher bemerke.

19
bmb

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 der kanonische Weg ist, 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 #.

19
Robert Harvey

Ich bevorzuge eine leichte Variante von 1)

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

Warum?

  • Ich denke immer Das Setzen von Klammern in die eigene Zeile verringert die Lesbarkeit. Ich kann nur eine bestimmte Menge Quellcode auf meinen Bildschirm passen. Bracket-Stil 2) macht Heave-Algorithmen mit vielen verschachtelten Schleifen und Bedingungen schmerzhaft lang.

  • Ich möchte jedoch, dass else in einer neuen Zeile beginnt, da if und else visuell zusammengehören. Wenn sich vor dem else eine Klammer befindet, ist es viel schwieriger zu erkennen, was zu was gehört.

  • 3) disqualifiziert sich. Wir alle wissen, was schlimmes passieren kann, wenn Sie die Klammern weglassen und es vergessen.

15

Ich habe irgendwo gelesen, dass die Autoren eines Buches wollten, dass ihr Code so formatiert wird:

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.

Auf persönlicher Ebene bevorzuge ich die Klammern in einer separaten Zeile als:

a) Sie geben einen neuen Geltungsbereich an
B) Es ist einfacher zu erkennen, wenn Sie eine Nichtübereinstimmung haben (obwohl dies in einer IDE, die Fehler für Sie hervorhebt) weniger problematisch ist.

10
ChrisF

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

Einfache Antwort: Was ist einfacher 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 interessiere mich nicht sehr für persönliche Vorlieben (es gibt viele andere Stile, einschließlich Weißschmied und al.) Und es interessiert mich nicht viel ... solange es meine Fähigkeit, den Code zu lesen, nicht behindert und Debug es.

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

9
Matthieu M.

Zweites Beispiel, ich bin sehr groß in der Lesbarkeit. Ich kann es nicht ertragen zu schauen, ob Blöcke auf andere Weise blockiert = (

9

Nicht dass es jemand bemerken würde, aber aus diesem Grund gehören geschweifte Klammern in die gleiche Zeile wie die Bedingung (mit Ausnahme sehr langer Bedingungen, aber das ist ein Edge-Fall):

In C ist dies ein gültiges Konstrukt:

 while (true); 
 {
 char c; 
 Getchar (); // Warte auf Eingabe 
} 

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 bei while(true) abgefangen. Beachten Sie das Semikolon am Ende. Dieses Muster ist tatsächlich häufiger als es scheint; In C müssen Sie Ihre Variablen am Anfang eines Blocks deklarieren, weshalb eine neue gestartet wurde.

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

8
Christian Mann

Ich mag die erste Methode. Es scheint ordentlicher IMO, und es ist kompakter, was ich mag.

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

5
Ullallulloo

Du könntest es schreiben:

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

Um die Frage zu beantworten; Früher bevorzugte ich geschweifte Klammern in der eigenen Zeile, aber um nicht über Fehler beim automatischen Einfügen von Semikolons in Browsern nachdenken zu müssen, begann ich, den ägyptischen Stil für Javascript zu verwenden. Und beim Codieren von Java in Eclipse) 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 bin ich mit beiden in Ordnung.

5
FeatureCreep

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

Also dachte ich einen Moment darüber nach und musste zugeben, dass ich es einfach nicht so wichtig sehe. 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 bei niemand anderem sicher ... aber ich habe absolut keine Probleme, mental zwischen den Stilen hin und her zu wechseln. Ich habe einige Momente gebraucht, um herauszufinden, was der Code bewirkt hat, aber das ist das Ergebnis davon, dass ich nur zufällig eine C-ähnliche Syntax eingegeben habe. :) :)

Meiner nicht ganz so bescheidenen Meinung nach sind das Öffnen von Klammern für die Lesbarkeit des Codes fast völlig irrelevant. Es gibt einige oben aufgeführte Eckfälle, in denen der eine oder andere Stil einen Unterschied macht, aber zum größten Teil bereinigt die vernünftige Verwendung von Leerzeilen dies.

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 würden, nur weil die leere Linie eine stärkere visuelle Trennung ergibt.

4
jkerian

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 ihrer 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 mit Mausauswahl oder weniger Tastenanschlägen mit Tastaturauswahl.

Ich habe ursprünglich mit Zahnspangen auf derselben Linie wie die Bedingung gearbeitet, aber als ich wechselte, stellte ich fest, dass dies die Geschwindigkeit beschleunigte, mit der ich arbeitete. Es ist natürlich nicht Tag und Nacht, aber es ist etwas, das Sie etwas verlangsamt, wenn Sie mit Zahnspangen neben Ihren Bedingungen arbeiten.

4
Tim O'Neil

Meine persönliche Präferenz ist die erste Methode, wahrscheinlich weil ich auf diese Weise PHP gelernt habe.

Für einzeilige if -Anweisungen verwende ich

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

Wenn es nicht you.postAnswer(); ist, sondern etwas viel längeres, wie you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);, werde ich wahrscheinlich zum ersten Typ zurückkehren:

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

Ich werde niemals einen Zeilenumbruch verwenden, und ich werde diese Methode niemals verwenden, wenn es auch eine else -Anweisung 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();
}
2
TRiG

Ich persönlich mag den zweiten Weg.

Die Art und Weise, wie ich demonstrieren werde, ist meiner Meinung nach die beste, weil sie zu größter Arbeitsplatzsicherheit führt! Ein Kommilitone von meiner Universität bat mich um Hilfe bei seinen Hausaufgaben und so sah sein Code aus. Das ganze Programm sah aus wie ein einziger Block. Das Interessante ist, dass 95% der Fehler in dem Programm, das er gemacht hat, von nicht übereinstimmenden Zahnspangen stammten. 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);
2
AndrejaKo

Sie sollten nicht; erste Methode für mich.

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

Wie beim Schreiben von Text ist das Hinzufügen eines Einzugs am Anfang eines Absatzes überflüssig, wenn davor eine Leerzeile steht (doppeltes Vorzeichen der Absatzänderung). In diesem Fall müssen keine Zeilen für geschweifte Klammern verschwendet werden richtig einrücken.

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

2
Joanis

Dies hängt von der Plattform/Sprache/Konventionen 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 Jungs ihren Stil in C # -Code verwenden und umgekehrt.

2
OscarRyz

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

Wenn Sie haben Klammern visuell koppeln müssen, würde ich die zweite Methode bevorzugen. Dies ermöglicht jedoch weniger Code gleichzeitig, sodass Sie mehr scrollen müssen. Und das hat zumindest für mich einen größeren Einfluss auf das Lesen von Code als ordentlich ausgerichtete Klammern. Ich hasse es zu scrollen. Wenn Sie jedoch über eine einzelne if -Anweisung scrollen müssen, ist diese höchstwahrscheinlich zu groß und muss überarbeitet werden.

Aber; Das Wichtigste ist die Konsistenz. Verwenden Sie den einen oder anderen - niemals beide!

1
gablin

Ich kann nur sagen, dass Sie, wenn Sie ein Fan von Methode 3 sind, von jedem IDE Code-Formatierer auf der Erde) verfolgt werden.

1
Phil Cohen

Es gibt eine vierte Option, die die Zahnspangen 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.

0
AShelly

Als ich mit 12 das erste Mal Programmieren lernte, setzte ich die geschweiften Klammern in die nächste Zeile, weil die Microsoft-Codierungs-Tutorials so sind. Ich habe damals auch mit 4-Leerzeichen-TABS eingerückt.

Nach ein paar Jahren lernte ich Java und JavaScript) und sah mehr Klammern in derselben Zeile, also änderte ich mich. Ich begann auch, mit Leerzeichen mit zwei Leerzeichen einzurücken.

0
Ming-Tang