it-swarm.com.de

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

Ich habe danach gesucht, aber keine Antwort gefunden, und aus irgendeinem Grund war ich zu schämen, Professor zu fragen, aufgrund dieses 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 oft mache), ändert sich dann etwas, irgendetwas? Wie gesagt, ich weiß, dass es funktioniert, ich habe es Dutzende Male 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 verursachen kann. Gibt es einen Grund, das zu fürchten?

70
vedran

Es ändert sich nichts abgesehen von 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 das:

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

... aber welche sollte war dies:

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

Persönlich ich immer füge die Klammern ein, um die Gefahr von Verwechslungen beim Lesen oder Ändern des Codes zu reduzieren.

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

Und für den Fall, dass Sie denken, dass es nie einen Unterschied machen würde: Ich musste einmal einen Fehler beheben, der dem obigen Code ziemlich entsprach. Es war bemerkenswert schwer zu erkennen ... (Zugegeben, das war vor Jahren, bevor ich mit den Unit-Tests begonnen hatte, was die Diagnose zweifelsohne erleichtert hätte).

119
Jon Skeet

Die Verwendung von geschweiften Klammern macht den Code leichter zu pflegen und verständlicher. Sie sollten sie standardmäßig betrachten.

Ich überspringe manchmal die Verwendung von geschweiften Klammern in guard-Klauseln , um den Code kompakter zu gestalten. Meine Voraussetzung dafür ist, dass es sich um if-Anweisungen handelt, denen eine jump -Anweisung folgt, wie return oder throw. Ich halte sie auch in der gleichen Zeile, um auf die Redewendung aufmerksam zu machen, z.

if (!isActive()) return;

Sie gelten auch für Code innerhalb von Schleifen:

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

Und zu anderen Sprungbedingungen von Methoden, die nicht unbedingt an der Spitze des Methodenkörpers stehen.

Einige Sprachen (wie Perl oder Ruby) haben eine Art conditional-Anweisung, bei der keine geschweiften Klammern gelten:

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.

30
Jordão

Es gibt keinen Unterschied. Das Hauptproblem bei der zweiten Version ist, dass Sie am Ende Folgendes schreiben:

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

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

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

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

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

10
Mat

In den meisten Fällen sind die bisher genannten Antworten richtig. Es gibt jedoch einige Nachteile aus der Sicherheitsperspektive. Die Sicherheit in einem Zahlungsteam 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 )

Nehmen wir an, Sie haben diesen Code aufgrund eines internen Problems nicht ausgeführt. 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 der Prüfer und Sie glauben, dass dies kein Problem verursachen wird, da er nicht unter der Bedingung "Prod" liegt). Auf magische Weise drucken Ihre Produktionsprotokolle jetzt die Kreditkarteninformationen von Kunden, die für alle Mitarbeiter sichtbar sind, die die Protokolle sehen können. Gott verbietet, wenn einer von ihnen (mit böswilliger Absicht) diese Daten erhält.

Wenn Sie keine Klammer geben und ein wenig nachlässig codieren, kann dies häufig zu einem Verstoß gegen sichere Informationen führen. Es ist auch eine Schwachstelle in Java von CERT - Software Engineering Institute, CMU .

4
kung_fu_coder

Wenn Sie eine einzelne Anweisung haben, können Sie die Klammern weglassen. Für mehr als eine Anweisung sind Klammern erforderlich, um einen Codeblock zu deklarieren.

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, z. B.: 

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

es ist besser lesbar mit Klammern geschrieben, auch wenn dies nicht notwendig ist: 

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

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

4
Sergey Gazaryan

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

Zu behaupten, die geschweiften Klammern wegzulassen, ist schlecht, seltsam oder unlesbar, es ist einfach falsch, da die gesamte Sprache auf dieser Idee basiert und sehr beliebt ist (Python).

Ich muss jedoch sagen, dass es ohne Verwendung eines Formatierers gefährlich sein kann.

4
Máté Magyar

Durch die Verwendung der Klammern wird der Code gegen spätere Änderungen auf zukünftige Weise geprüft. Ich habe Fälle gesehen, in denen Klammern weggelassen wurden und jemand später etwas Code hinzugefügt und die Klammern zu dieser Zeit nicht eingefügt hat. Das Ergebnis war, dass der von ihnen hinzugefügte Code nicht in den von ihnen geglaubten Abschnitt einging. Ich denke, die Antwort ist, dass seine bewährte Vorgehensweise angesichts zukünftiger Änderungen des Codes gilt. Ich habe gesehen, dass Softwaregruppen dies als Standard verwenden, d. H. Aus diesem Grund auch bei einzeiligen Blöcken immer Klammern erfordern.

3
Nerdtron

Mehr Unterstützung für die Gruppe "Immer Hosenträger" von mir. Wenn Sie die geschweiften Klammern für Schleifen/Zweige mit einer Anweisung auslassen, setzen Sie die Anweisung in die gleiche Zeile wie die Steueranweisung.

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

auf diese Weise ist es schwieriger zu vergessen, Klammern einzusetzen, wenn der Körper erweitert ist. Verwenden Sie trotzdem Curlies.

2
Daniel Fischer

Wenn Sie nur eine Anweisung in der Schleife haben, ist sie gleich.

Zum Beispiel sehen Sie 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.

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

1
Shiva N

Wenn Sie geschweifte Klammern entfernen, wird nur die erste Befehlszeile 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.

1
Ashish Patel

Ergebnis weise ist es das Gleiche.

Nur zwei Dinge zu beachten.

- Wartbarkeit des Codes
- Locker gekoppelter Code. (kann .__ etwas anderes ausführen, da Sie den Gültigkeitsbereich für die Schleife nicht angegeben haben.)

Hinweis: In meiner Beobachtung, wenn es Schleife in einer Schleife ist. Die innere Schleife ohne Zahnspangen ist ebenfalls sicher. Ergebnis wird nicht variieren.

1

Heutzutage ist es sehr einfach, Codes erneut einzurücken, um herauszufinden, welcher Codeblock sich in if oder for/while befindet. Wenn Sie darauf bestehen, dass das erneute Einrücken schwer zu bewerkstelligen ist, können Sie durch falsche Einrückungen gleichermaßen verwirrt werden.

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 müssen Sie den Beginn und das Ende von Codeblöcken visuell ermitteln.

Wenn die Einrückung wichtig ist, sollten Sie Ihren Code bereits in der richtigen Einrückung schreiben, damit andere Personen Ihre Codes nicht erneut einrücken müssen, um richtig gelesen zu werden.

Wenn Sie behaupten möchten, dass das vorige Beispiel zu unecht/vorsätzlich ist und die Klammern dazu dienen, unbesonnene 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 das vorige Beispiel, aber Sie können durch solche Einrückungen immer noch verwirrt werden.

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

0
Jai

Es ist wahrscheinlich am besten, die geschweiften Klammern überall zu verwenden, da das Debuggen dies extrem belästigen würde. Ansonsten braucht eine Zeile Code nicht notwendigerweise die Klammer. Hoffe das hilft!

0
Ash_s94

die Verwendung redundanter Klammern, um zu behaupten, dass Code leichter zu pflegen ist, wirft die folgende Frage auf: Wenn die Jungs, die schreiben, sich fragen und den Code weiter pflegen, Probleme wie die zuvor beschriebenen haben (Einrückung oder Lesbarkeit), sollten sie vielleicht überhaupt nicht programmieren. .

0
user962247

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

0
user962247