Ist es in Ordnung, wenn ich in Java geschweifte Klammern weglasse? [geschlossen]

82

Ich habe danach gesucht, konnte aber keine Antwort finden und aus irgendeinem Grund schämte ich mich zu sehr, um Professor zu fragen, aufgrund des Gefühls, wenn Hunderte von Menschen Sie anstarren ...

Wie auch immer, meine Frage ist, wie wichtig es ist, Klammern zu haben. Ist es in Ordnung, wenn ich sie weglasse? Beispiel:

for (int i = 0; i < size; i++)  {
   a += b;
}

vs.

for (int i = 0; i < size; i++)
   a += b;

Ich weiß, dass beide funktionieren werden, aber wenn ich die Klammern weglasse (was ich aufgrund der Sichtbarkeit häufig mache), ändert sich dadurch überhaupt etwas? Wie gesagt, ich weiß, dass es funktioniert, ich habe es ein Dutzend Mal getestet, aber jetzt werden einige meiner Uni-Aufgaben größer, und aus irgendeinem Grund habe ich irrationale Angst, dass dies auf lange Sicht einige Probleme verursacht? Gibt es einen Grund, das zu befürchten?

Vedran
quelle
Ich verwende immer einen Code-Formatierer für die Lesbarkeit, da dies viele mögliche Ursachen für Verwirrung löst. Dies kann die Verwendung von geschweiften Klammern überflüssig machen
Peter Lawrey

Antworten:

144

Es ändert nichts außer der Wartbarkeit Ihres Codes. Ich habe Code wie diesen gesehen:

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

was bedeutet dies:

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

... aber was hätte das sein sollen:

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

Persönlich füge ich immer die Klammern hinzu, um Verwechslungsgefahr beim Lesen oder Ändern des Codes zu vermeiden.

Die Codierungskonventionen in jedem Unternehmen, für das ich gearbeitet habe, haben dies verlangt - was nicht heißt, dass einige andere Unternehmen keine anderen Konventionen haben ...

Und nur für den Fall, dass Sie denken, dass es niemals einen Unterschied machen würde: Ich musste einmal einen Fehler beheben, der dem obigen Code ziemlich gleichwertig war. Es war bemerkenswert schwer zu erkennen ... (zugegebenermaßen war dies Jahre her, bevor ich mit Unit-Tests begonnen hatte, was die Diagnose zweifellos einfacher gemacht hätte).

Jon Skeet
quelle
12
@vedran: Sie sind sich des Problems bewusst, gehen aber nur davon aus, dass es Sie niemals beißen wird? Und dass jeder, der Ihren Code liest, weiß, was ihn erwartet? Ich sage nur - es gibt einen Grund, warum sie in den Codierungskonventionen, mit denen ich gearbeitet habe, erforderlich sind :)
Jon Skeet
12
Ich fühlte mich wie ein Privatmann, mit dem ein Sarge überredet wurde. Ja, obwohl es für mich bequemer ist, finde ich es aus meiner Gruppe ärgerlich und problematisch. Ich werde von nun an überall Klammern verwenden.
Vedran
13
@vedran schöne Metapher, außer Jon Skeet ist kein Sarge, er ist der Oberbefehlshaber :-)
Stivlo
5
@stivlo Oh, ich bin sicher, dass seine Gnade geringfügigen Ungehorsam verzeihen wird;) Persönlich setze ich Klammern nach Aussagen, weil es Teil jeder Codierungsanleitung ist, die ich jemals gesehen habe, aber ich denke, dass es heute ein ziemlich schwaches Argument ist. Bei automatischer Code-Formatierung sollten Sie den Code sowieso nie in seiner ersten Form sehen, und wenn die Einrückung korrekt ist, geben die Klammern keine zusätzlichen Informationen an.
Voo
4
Weitere Argumente, um IMMER die Klammern zu verwenden: imperialviolet.org/2014/02/22/applebug.html
MrTJ
32

Durch die Verwendung von geschweiften Klammern wird der Code wartbarer und verständlicher. Sie sollten sie daher standardmäßig berücksichtigen .

Manchmal überspringe ich die Verwendung von geschweiften Klammern an Schutzklauseln , um den Code kompakter zu gestalten. Meine Voraussetzung dafür ist, dass es sich um ifAnweisungen handelt, auf die eine Sprunganweisung folgt , wie returnoder throw. Außerdem halte ich sie in derselben Zeile, um die Aufmerksamkeit auf die Redewendung zu lenken, z.

if (!isActive()) return;

Sie gelten auch für Code in Schleifen:

for (...) {
  if (shouldSkip()) continue;
  ...
}

Und zu anderen Sprungbedingungen von Methoden, die nicht unbedingt oben im Methodenkörper stehen.

Einige Sprachen (wie Perl oder Ruby) haben eine Art bedingte Anweisung , bei der geschweifte Klammern nicht zutreffen:

return if (!isActive());
// or, more interestingly
return unless (isActive());

Ich halte es für äquivalent zu dem, was ich gerade beschrieben habe, aber ausdrücklich von der Sprache unterstützt.

Jordão
quelle
7
+1 Schutzklauseln in Schleifen sind normalerweise ohne die geschweiften Klammern klarer.
Viccari
2
Einverstanden über die Wachklauseln. Macht den Code meiner Meinung nach lesbarer und erhöht tatsächlich die Wartbarkeit. Die Punkte, die die akzeptierte Antwort macht, sind jedoch sehr gültig, daher würde ich das Weglassen von Klammern auf Schutzklauseln beschränken.
ChrisK
11

Es gibt keinen Unterschied. Das Hauptproblem bei der zweiten Version ist, dass Sie möglicherweise Folgendes schreiben:

for (...) 
  do_something();
  do_something_else();

Wenn Sie diese Methode aktualisieren, denken Sie, dass do_something_else()sie innerhalb der Schleife aufgerufen wird. (Und das führt zu Head-Scratching-Debug-Sitzungen.)

Es gibt ein zweites Problem, das die Zahnspangenversion nicht hat und das möglicherweise noch schwerer zu erkennen ist:

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

Behalten Sie also die Zahnspange, es sei denn, Sie haben einen guten Grund, es sind nur ein paar Tastenanschläge mehr.

Matte
quelle
3
Der erste Punkt ist gut, aber der zweite Punkt ist falsch. Die Zahnspangenversion kann dieses Problem weiterhin haben. für (int i = 0; i <3; i ++); {System.out.println ("Warum wird nur einmal gedruckt?"); }. Ich weiß es, weil ich immer geschweifte Klammern verwende, aber manchmal fälschlicherweise zusätzliche Semikolons hinzufüge.
Emory
3
Die Zahnspangenversion kann es haben, aber es ist besser sichtbar, wenn sich die Zahnspange in derselben Linie befindet. Mit der Klammer in der nächsten Zeile ist es in der Tat ziemlich böse.
Mat
Die zweite Version ist für mich genauso wichtig wie die erste, denn wenn man sich die zweite Version ansieht, ist es fast unmöglich zu erkennen, was falsch ist, bis man sie tatsächlich ausführt, um zu sehen, was in der Welt los ist. Entwickler verbringen viel Zeit damit, Code wie diesen zu debuggen, der leicht zu erkennen wäre, wenn diese schnörkellose Klammer eingeführt worden wäre. Für mich ist das Weglassen dieser wellenförmigen Klammern nicht nur eine Frage des Stils, sondern auch ein guter Indikator für wahrscheinlichen Buggy-Code.
TheyCallMeJun
5

Ich denke, dass es gut ist, geschweifte Klammern zu verlieren, wenn Sie auch das automatische Format verwenden, da Ihre Einrückung immer korrekt ist, sodass Fehler auf diese Weise leicht erkannt werden können.

Zu sagen, dass es schlecht, seltsam oder unlesbar ist, die geschweiften Klammern wegzulassen, ist einfach falsch, da die ganze Sprache auf dieser Idee basiert und ziemlich beliebt ist (Python).

Aber ich muss sagen, dass es ohne Verwendung eines Formatierers gefährlich sein kann.

Máté Magyar
quelle
Einrückung ist in Python wichtig. In Java, C, C ++ oder anderen Sprachen im C-Stil ist dies nicht der Fall.
Christopher Schneider
1
@ChristopherSchneider Das ist der Pont.
Máté Magyar
5

In den meisten Fällen sind die bisher genannten Antworten korrekt. Aus sicherheitstechnischer Sicht gibt es jedoch einige Nachteile. Sicherheit, die in einem Zahlungsteam gearbeitet hat, ist ein viel stärkerer Faktor, der solche Entscheidungen motiviert. Nehmen wir an, Sie haben den folgenden Code:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

Angenommen, Sie haben diesen Code, der aufgrund eines internen Problems nicht funktioniert. Sie möchten die Eingabe überprüfen. Sie nehmen also folgende Änderung vor:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

Angenommen, Sie beheben das Problem und stellen diesen Code bereit (und möglicherweise den Prüfer, und Sie glauben, dass dies kein Problem verursacht, da es sich nicht im Zustand "Prod" befindet). Auf magische Weise drucken Ihre Produktionsprotokolle jetzt Kundenkreditkarteninformationen, die für alle Mitarbeiter sichtbar sind, die die Protokolle sehen können. Gott bewahre, wenn einer von ihnen (mit böswilliger Absicht) diese Daten erhält.

Das Fehlen einer Klammer und ein wenig nachlässiges Codieren kann daher häufig zu einem Verstoß gegen sichere Informationen führen. Es wird auch von CERT - Software Engineering Institure, CMU als Sicherheitslücke in JAVA eingestuft .

kung_fu_coder
quelle
Ich würde behaupten, dass dies in erster Linie ein ziemlich schreckliches Design ist, aber der Punkt ist gültig.
Christopher Schneider
4

Wenn Sie eine einzelne Anweisung haben, können Sie die Klammern weglassen. Für die Deklaration eines Codeblocks ist mehr als eine Anweisung erforderlich.

Wenn Sie Klammern verwenden, deklarieren Sie einen Codeblock:

{

//Block of code
}

Die Klammern sollten auch mit nur einer Anweisung verwendet werden, wenn Sie sich in einer Situation verschachtelter Anweisungen befinden, um die Lesbarkeit zu verbessern. Beispiel:

for( ; ; )
  if(a == b) 
    doSomething()

es ist besser lesbar in Klammern geschrieben, auch wenn es nicht nötig ist:

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}
Aleroot
quelle
4

Wenn Sie Klammern verwenden, ist Ihr Code besser lesbar. Wenn Sie einen Operator im selben Block hinzufügen müssen, können Sie mögliche Fehler vermeiden

Sergey Gazaryan
quelle
3

Durch die Verwendung der Klammern schützt der Code die Zukunft vor späteren Änderungen. Ich habe Fälle gesehen, in denen Klammern weggelassen wurden und jemand später Code hinzufügte und die Klammern zu diesem Zeitpunkt nicht einfügte. Das Ergebnis war, dass der hinzugefügte Code nicht in den Abschnitt ging, von dem sie dachten, dass er es tat. Ich denke, die Antwort ist, dass es angesichts zukünftiger Änderungen des Codes eine gute Praxis ist. Ich habe gesehen, dass Softwaregruppen dies als Standard übernehmen, dh aus diesem Grund auch bei einzeiligen Blöcken immer Klammern benötigen.

Nerdtron
quelle
Ich stimme dem zu. Die Klammern sind nichts für dich. Sie sind für die Person, die hinter dir kommt. Mehrmals hatte ich Code, von dem ich behauptete, er sei nicht vertraut, er verwendete keine Klammern und hatte schlechte Einrückungen. In diesem Stadium behebe ich wahrscheinlich einen Fehler, daher ist es gut zu wissen, was passieren soll. Das Weglassen von geschweiften Klammern macht es weniger offensichtlich, und ich muss den Code durchgehen und Zeit verschwenden.
Christopher Schneider
2

Mehr Unterstützung für die Gruppe "Immer Klammern" von mir. Wenn Sie geschweifte Klammern für Schleifen / Zweige mit einer Anweisung weglassen, setzen Sie die Anweisung in dieselbe Zeile wie die Steueranweisung.

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;

Auf diese Weise ist es schwieriger, das Einsetzen von Zahnspangen zu vergessen, wenn der Körper erweitert wird. Verwenden Sie trotzdem Locken.

Daniel Fischer
quelle
2

Die Verwendung redundanter Klammern, um zu behaupten, dass Code besser zu warten ist, wirft die folgende Frage auf: Wenn die Leute, die den Code schreiben, sich darüber wundern und ihn weiter pflegen, Probleme wie die zuvor beschriebenen haben (Einrückung oder Lesbarkeit), sollten sie vielleicht überhaupt nicht programmieren. .


quelle
1

Ergebnis weise ist es das gleiche.

Nur zwei Dinge zu beachten.

- Code-Wartbarkeit
- Locker gekoppelter Code. (Möglicherweise wird etwas anderes ausgeführt, da Sie den Bereich für die Schleife nicht angegeben haben.)

Hinweis: In meiner Beobachtung, wenn es sich um eine Schleife in einer Schleife handelt. Inner Loop ohne Klammern ist ebenfalls sicher. Ergebnis wird nicht variieren.

Sireesh Yarlagadda
quelle
1

Wenn Sie nur eine Anweisung in der Schleife haben, ist diese dieselbe.

Siehe zum Beispiel den folgenden Code:

for(int i=0;i<4;i++)
            System.out.println("shiva");

Wir haben nur eine Aussage im obigen Code. also kein problem

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

Hier haben wir zwei Anweisungen, aber nur die erste Anweisung kommt in die Schleife, nicht aber die zweite Anweisung.

Wenn Sie mehrere Anweisungen in einer einzigen Schleife haben, müssen Sie geschweifte Klammern verwenden.

NShiva
quelle
1

Wenn Sie geschweifte Klammern entfernen, wird nur die erste Anweisungszeile gelesen. Zusätzliche Zeilen werden nicht gelesen. Wenn Sie mehr als eine Befehlszeile ausführen müssen, verwenden Sie bitte eine geschweifte Klammer - andernfalls wird eine Ausnahme ausgelöst.

Ashish Patel
quelle
1

Heutzutage ist es sehr einfach, Codes erneut einzurücken, um herauszufinden, welcher Codeblock sich in welchem ifoder for/ befindet while. Wenn Sie darauf bestehen, dass ein erneutes Einrücken schwierig ist, können Klammern mit falschem Einzug Sie ebenso verwirren.

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

Wenn Sie dies überall tun, wird Ihr Gehirn in kürzester Zeit zusammenbrechen. Selbst bei Klammern sind Sie auf Einrückungen angewiesen, um den Anfang und das Ende von Codeblöcken visuell zu finden.

Wenn das Einrücken wichtig ist, sollten Sie Ihren Code bereits in korrektem Einzug schreiben, damit andere Personen Ihre Codes nicht erneut einrücken müssen, um richtig zu lesen.

Wenn Sie argumentieren möchten, dass das vorherige Beispiel zu falsch / absichtlich ist und dass die Klammern dazu dienen, unachtsame Einrückungsprobleme zu erfassen (insbesondere beim Kopieren / Einfügen von Codes), sollten Sie Folgendes berücksichtigen:

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

Ja, es sieht weniger ernst aus als im vorherigen Beispiel, aber Sie können durch solche Einrückungen immer noch verwirrt werden.

IMHO liegt es in der Verantwortung der Person, die den Code schreibt, den Code zu überprüfen und sicherzustellen, dass die Dinge korrekt eingerückt sind, bevor sie andere Dinge tun.

Jai
quelle
0

Es sollte ein Reflex sein, auch den Code neu zu formatieren ... das ist natürlich für professionelle Programmierer in professionellen Teams


quelle
0

Es ist wahrscheinlich am besten, die geschweiften Klammern überall zu verwenden, weil das Debuggen ein extremes Ärgernis wäre. Andernfalls benötigt eine Codezeile nicht unbedingt die Klammer. Hoffe das hilft!

Ash_s94
quelle