Best Practice Gestaffelte if oder Vorabfrage?

JeromeC

Aktives Mitglied
Hallo Freunde,

ich habe eine Frage die wohl recht trivial ist, ich möchte sie dennoch stellen, weil ich immer wieder darüber nachdenke beim Schreiben von Java-Code.

Nehmt an ihr habt eine boolean-Methode geschrieben mit Übergabeparameter, die nicht Null oder irgend ein anderer Wert sein dürfen. Ist ja ein recht gängiger Fall.
Fragt ihr die Werte gleich ab oder lasst ihr alles am Ende auf return false laufen? Hier mal die 2 Möglichkeiten, damit man es besser versteht, als Beispielcode:

Option A:
Java:
boolean vorabfrage(int wert1, int wert2) {
 if(wert1 != null && wert2 != null) {
  return false;
 }
 if(wert1 > 10 && wert2 <= 500) {
  return false;
 }
 //Irgendwelche Sachen, die ihr halt machen wollt
 int result = Math.max(wert1, wert2);
 if(result > 10 && result < 200) {
  return true;
 } else {
  return false;
 }
}

Option B:
Java:
boolean allesInEinem(int wert1, int wert2) {
 if(wert1 != null && wert2 != null) {
  if(wert1 > 10 && wert2 <= 500) {
   int result = Math.max(wert1, wert2);
   if(result > 10 && result < 200) {
    return true;
   }
  }
 }
 return false;
}

Bei meiner Überlegung frage ich mich auch hinsichtlich der Performance und der besseren Lesbarkeit, welche Art geeigneter ist. Option B sieht in diesem Beispiel vielleicht besser aus, aber stellt euch mal vor ihr hättet noch 150 Zeilen Code und 7-8 Werte, die ihr prüfen müsstet, da wären die 150 Zeilen weit nach rechts eingerückt, was bei Option A nicht der Fall wäre.
Würde mich freuen eure Meinung dazu zu hören,

liebe Grüße Jérôme.
 
Zuletzt bearbeitet:

Maggot

Bekanntes Mitglied
Hallo.

Ich mache sowas wie:

Java:
 boolean vorabfrage(Integer wert1, Integer wert2) {
        if (wert1 != null && wert2 != null) {
            throw new IllegalArgumentException();
        }
        if (wert1 > 10 && wert2 <= 500) {
            throw new IllegalArgumentException();
        }
        // Irgendwelche Sachen, die ihr halt machen wollt
        int result = Math.max(wert1, wert2);
        if (result > 10 && result < 200) {
            return true;
        }
        return false;
    }
 
Zuletzt bearbeitet:

MWin123

Bekanntes Mitglied
Objects.requireNonNull wäre eine weitere Möglichkeit.

Also
Java:
boolean allesInEinem(int wert1, int wert2) {
    Objects.requireNonNull(wert1, "wert1 darf nicht null sein");
    Objects.requireNonNull(wert2, "wert2 darf nicht null sein");
    ...
}
Implementiert ist Objects.requireNonNull so:
Java:
public static <t> T requireNonNull(T obj) {    
    if (obj == null)
    throw new NullPointerException();
    return obj;
}
</t>
 
Zuletzt bearbeitet:

InfectedBytes

Top Contributor
Aus Performancesicht gibt es bei deinen beiden Optionen keinen Unterschied, da so oder so immer nur eine einfache Abfrage kommt und danach direkt ein return. Ob dieses Return nun innerhalb der if ist oder im else zweig oder nach der if macht in solchen Fällen wie du sie beschreibst keinen Unterschied.
Die Lesbarkeit ist wie so oft auch eine Geschmackssache. Von deinen beiden Optionen finde ich die erste Variante schöner, aber andere sehen das sicherlich anders.

Noch schöner finde ich allerdings solche Ansätze wie MWin123 genannt hat, auch wenn dieser Ansatz zugegebenermaßen weniger Performant ist als eine direkte if-Abfrage.
Allerdings bezweifel ich auch, dass du diese Performance Einbuße überhaupt bemerken wirst.
 

Flown

Administrator
Mitarbeiter
Noch schöner finde ich allerdings solche Ansätze wie MWin123 genannt hat, auch wenn dieser Ansatz zugegebenermaßen weniger Performant ist als eine direkte if-Abfrage.
Allerdings bezweifel ich auch, dass du diese Performance Einbuße überhaupt bemerken wirst.

Wieso sollte dieser Ansatz weniger performant sein? JVM inlined den Code und schon hast du das Gleiche.

Auf jedenfall ist es ratsam API Methoden zu verwenden, denn sie sind getestet und beinahe unfehlbar.
 

InfectedBytes

Top Contributor
Potentiell könnte die JVM den Code inlinen, aber es ist eben nicht sichergestellt das dies auch passiert.
Aber wie ich bereits geschrieben hab, dürfte diese "Einbuße" in den seltensten Fällen ins Gewicht fallen^^
 

Neue Themen


Oben