Anlässlich des 40. Jahrestages der Veröffentlichung von Episode V der Star-Saga ist allen Fans von Star Wars und Java / JavaRush ein kurzer Beitrag gewidmet! Manchmal findet man im Internet viele interessante Dinge, und neulich bin ich auf eine auf den ersten Blick ziemlich lustige Programmierpraxis namens Yoda-Bedingungen gestoßen . Kurz gesagt handelt es sich bei Yoda-Bedingungen (auch Yoda-Notation) um einen Programmierstil, bei dem die beiden Teile des bekannten Vergleichsausdrucks in bedingten Anweisungen umgekehrt werden:
neun sechs Teile der Saga schlaflos hinsetzten, um Code für unser Lieblingsprojekt zu schreiben, und Folgendes schrieben:
if (5 == a) {
// do something
}
Dieser Stil kann in Sprachen mit C-ähnlicher Syntax verwendet werden, am häufigsten in Ausdrücken mit if
und while
.
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
Warum den konstanten Ausdruck auf die linke Seite des Vergleichsoperators verschieben? Nehmen wir eine hypothetische Situation an, in der wir uns nach einer Marathon-Ansicht aller void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
In diesem Fall erhalten Sie jedes Mal, wenn Sie das Programm ausführen, die Zeichenfolge Number is 13"
, unabhängig vom а
an die Methode übergebenen Argument checkNumber(int a)
. Das ist nicht das, was wir erwartet haben! Logische Fehler können bei unerfahrenen Programmierern recht häufig auftreten (glauben Sie mir, ich weiß es). Aber in der Kompilierungsphase erzeugt Code wie 13 = a einen Fehler, den wir sicherlich nicht übersehen werden, da der ganzzahlige Wert eine Konstante ist und sich dementsprechend nicht ändern (in „a“ verwandeln) kann.
Die Verwendung der Yoda-Bedingungen hat sowohl Vor- als auch Nachteile.
Helle Seite:
-
Verhindern der Zuweisung zu einer Variablen, wenn unser Ziel der Vergleich ist.
-
Lösung des Problems des unsicheren „Null-Verhaltens“ (
NullPointerException
) // Beispiele aus Wikipedia
Ohne Yoda:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
Mit Yoda:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
Dunkle Seite:
- Die Lesbarkeit des Codes für Personen, die Ihren Code betrachten, wird komplexer, was die Wahrnehmung des Codes stärker belastet.
- Enger Geltungsbereich, es wird nur ein Vergleich auf Gleichheit oder ein Vergleich mit einer Konstante verwendet, wobei auf Null geprüft wird.
- Viele Compiler „sehen“ Fehler dieser Art bereits und warnen vor dem Vorliegen eines möglichen Fehlers.
GO TO FULL VERSION