Ich denke, es ist natürlich, aber es gibt Zeiten, in denen es unerwartet nicht geschützt ist. Nehmen wir als Beispiel die Behandlung von Booleschen Werten bei der bedingten Verzweigung.
~~ Ich habe "in Java" im Titel geschrieben, aber es ist wahrscheinlich in jeder Sprache gleich. ~~ Brechen Sie es ab, da es nicht für andere Sprachen wie JavaScript [^ js] gilt.
Es gibt Fälle, in denen dies vom Codierungsstandard [^ 1] eindeutig abgelehnt wird, aber in Java sollte der folgende Code ** nicht geschrieben werden **.
if (isAdmin == true) {
//Wenn isAdmin wahr ist
}
if (isAdmin == false) {
//Wenn isAdmin falsch ist
}
Ich werde drei Gründe schreiben.
Der obige Code kann wie folgt geschrieben werden: Das ist einfacher.
if (isAdmin) {
//Wenn isAdmin wahr ist
}
if (!isAdmin) {
//Wenn isAdmin falsch ist
}
Im Fall von "if ~ else ~" kann es einfach sein, mit einem ternären Operator zu schreiben. Der Missbrauch des ternären Operators kann jedoch die Lesbarkeit beeinträchtigen. Weitere Informationen finden Sie im folgenden Artikel.
String userType;
if (isAdmin) {
userType = "Administrator";
} else {
userType = "Allgemeines";
}
//Es ist einfacher, mit dem ternären Operator wie folgt zu schreiben
String userType = isAdmin ? "Administrator" : "Allgemeines";
Wenn es wahr ist, gibt es kein Problem, aber wenn es falsch ist, gibt es Fälle, in denen !
Unauffällig ist.
if (!obj.getFoo().isBar()) {
//wird bearbeitet
}
In solchen Fällen empfiehlt es sich, erklärende Variablen hinzuzufügen.
boolean bar = obj.getFoo().isBar();
if (!bar) {
//wird bearbeitet
}
In Java wird entschieden, dass die if-Anweisung als boolescher Typ geschrieben werden soll. Daher führt das Schreiben einer Zuweisung in die if-Anweisung normalerweise zu einem Kompilierungsfehler. Im Fall des booleschen Typs wird die Kompilierung jedoch ohne Warnung übergeben, selbst wenn Sie Folgendes schreiben.
if (isAdmin = true) {
//Wenn isAdmin wahr ist ... sollte immer ausgeführt werden
}
if (isAdmin = false) {
//Wenn isAdmin false ist, sollte es nicht immer ausgeführt werden
}
//Dies führt zu einem Kompilierungsfehler
if (isAdmin = 1) {
}
Das Schreiben in Yoda-Notation [^ yoda] wie unten gezeigt ist jedoch ein Umkippen.
if (true == isAdmin) {
//Wenn isAdmin wahr ist
}
if (false == isAdmin) {
//Wenn isAdmin falsch ist
}
Tatsächlich werden Sie in IDE und FindBugs / SpotBugs [^ 3] gewarnt, sodass Sie es nicht bemerken sollten. Wenn Sie jedoch nicht von Anfang an "if (isAdmin == true)" schreiben, gibt es kein Problem.
Der folgende Inhalt ist nur bei "b == true" und hat keine Auswirkung bei Verwendung von "b == false" oder "! B". Siehe Kommentare für Details.
Dies ist fast eine Seite, aber theoretisch wäre es nutzlos [^ 4]. Kompilieren Sie beispielsweise den folgenden Code und setzen Sie ihn in umgekehrter Reihenfolge mit "javap -c" zusammen.
public class Main {
public int foo(boolean b) {
if (b == true) {
return 1;
} else {
return 0;
}
}
public int bar(boolean b) {
if (b) {
return 1;
} else {
return 0;
}
}
}
Dann erhalten Sie die folgende Ausgabe (ohne irrelevante Ausgabe):
public int foo(boolean);
Code:
0: iload_1
1: iconst_1
2: if_icmpne 7
5: iconst_1
6: ireturn
7: iconst_0
8: ireturn
public int bar(boolean);
Code:
0: iload_1
1: ifeq 6
4: iconst_1
5: ireturn
6: iconst_0
7: ireturn
Wenn Sie dies lesen, wird es wie folgt sein [^ 5]. Ich habe es schon lange geschrieben, aber der Punkt ist, dass eine Anweisung verschwendet wird.
Denn "wenn (b)" bedeutet "wenn b wahr ist", während "wenn (b == wahr)" ein Kreisverkehrsausdruck ist, der sagt "wenn b wahr ist im Vergleich zu wahr". Weil es geworden ist.
b
) auf den Stapel7:
, wenn nicht0
) auf den Stapelb
) auf den Stapel0
) auf den StapelEinige Leute mögen sagen: "Das interessiert mich nicht", aber die Anhäufung dieser kleinen Dinge wird in Zukunft einen großen Unterschied machen. Ich möchte, dass Sie nach und nach gute Gewohnheiten entwickeln.
Es scheint, dass es eine Antwort gab, also werde ich sie nach und nach ergänzen.
flag
ist schlecht → Das stimmt, also habe ich eine Beschreibung hinzugefügt.[^ 1]: [Java-Codierungsstandards - Future Enterprise Coding Standards - Future Architect](https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3% 83% BC% E3% 83% 87% E3% 82% A3% E3% 83% B3% E3% 82% B0% E8% A6% 8F% E7% B4% 84.html) [^ 3]: QBA: Methode zum Zuweisen eines booleschen Literalwerts im logischen Ausdruck (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT) -boolesche Zuweisung) [^ 4]: Ich habe es gemessen, aber ich konnte den Unterschied nicht bestätigen. Also "theoretisch". [^ 5]: Abgeleitet aus The Java® Virtual Machine Specification. [^ yoda]: [Yoda-Notation-Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6 % B3% 95) usw. [^ js]: Für JavaScript: Logical Operators-JavaScript | MDN
Recommended Posts