if vs. if else

lano

Aktives Mitglied
Moin.

Mal eine Frage:
Wenn ich die inneren If durch if else ersetzen würde hätte das keinerlei vorteile oder?
Hier der Code:
Javascript:
        if (p.indexOf('Hallo') === 0) {
            if (p === 'Hallo Welt') {
                return {
                    id: '1',
                    src: images.welt
                };
            }
            if (p === 'Hallo foo' || p === 'Hallo bar') {
                return {
                    id: '2',
                    src: images.foobar
                };
            }
            return {
                id: '0',
                src: images.hallo
            };
        } else if ...

Ich geh davon aus das es nix ändern würde weil ja nach erfolreichem Vergleich ja auch returned wird. Also die Liste an Ifs nicht immer komplett abgearbeitet wird.
 
Völlig richtig. Gilt so auch wahlweise für jede andere Sprache. Sobald du das Scope verlässt, also wie in deinem Beispiel die Funktion durch return, oder auch eine Schleife durch ein break, bringt ein else if kein Benefit.
 
Ein paar Vorteile kann (je nach IDE) sowas schon haben, wenn man da else if anstelle von if schreibt.

Ich persönlich finde dann die Einrückung (zumindest in Java Standard) angenehmer zu lesen - aber das ist Geschmackssache.

Interessanter ist, das je nach IDE dann logische Fehler eher erkannt werden

Java:
if (a == 1) {
  return foo;
} else if (a == 1 && b == 2) {
  return bar;
}
// vs
if (a == 1) {
  return foo;
} 
if (a == 1 && b == 2) {
  return bar;
}

Je nach IDE und verwendeten Tools (in Java z.b. Spotbugs/Checkstyle) wird der erste Block angemeckert, dass der else if Zweig nie greifen kann. Im zweiten Block wird es eher nicht angemeckert.
 
Ein paar Vorteile kann (je nach IDE) sowas schon haben, wenn man da else if anstelle von if schreibt.
Ähm, dein Beispiel spricht gegen else if, oder hab ich das jetzt falsch verstanden? Ich denke aber die IDE meckert nur, wenn du a die 1 als Literal zugewiesen hast. Wenn a erst zur Laufzeit ermittelt wird, wäre es äußerst merkwürdig, wenn du eine Warnung bekommst.
 
Ähm, dein Beispiel spricht gegen else if, oder hab ich das jetzt falsch verstanden? Ich denke aber die IDE meckert nur, wenn du a die 1 als Literal zugewiesen hast. Wenn a erst zur Laufzeit ermittelt wird, wäre es äußerst merkwürdig, wenn du eine Warnung bekommst.
Die IDE kann bei else if besser erkennen, wenn die Bedingung im else if Block nie true werden kann, weil sie in einem vorherigen Block dann auch als true ausgewertet wird.

Der zweite Teil (a == 1 && b==1) kann nie durchlaufen werden, weil wenn a den Wert 1 hat, dann wird der erste if block durchlaufen und rennt nie in den else if Zweig rein - der ist toter Code.
 
Letztendlich ist es Geschmackssache. Bei If-Abfragen mit return oder break zur Folge bevorzuge ich aber auf jeden Fall mehere einzelne Abfragen hintereinander. Diese "Early Returns" verbessern meiner Meinung nach die Lesbarkeit und die Line of Sight.

Java:
private static boolean f() {
    if (!user.hasAccess()) {
        return false;
    }
    if (!server.isRunning()) {
        return false;
    }
    return true;
}

Ich denke aber die IDE meckert nur, wenn du a die 1 als Literal zugewiesen hast. Wenn a erst zur Laufzeit ermittelt wird, wäre es äußerst merkwürdig, wenn du eine Warnung bekommst.

Es wird auch bei einem zur Laufzeit ermittelten a eine Warnung ausgespuckt, weil die zweite Bedingung nie zutreffen kann:
  • a == 1: Erster If-Block wird ausgeführt, der zweite wird ignoriert
  • a != 1: Erster If-Block wird ignoriert, der zweite wegen der &&-Verknüpfung ebenfalls

1592131132304.png


@LimDul79: Glücklicherweise erkennt zumindest IntelliJ diesen Umstand auch bei einer einzelnen, nachgelagerten If-Abfrage.
 
Zuletzt bearbeitet:
Zurück
Oben Unten