Wie kann man in Java zwei unabhängige if else blöocke untereinander kombinieren oder muss man styletechnisch auf nichts achten?

2 Antworten

Kannst Du machen, ist aber extrem schlechter Stil und wird von vielen als "dreckig" betrachtet.

Ideal wäre, wenn Du auf else komplett verzichtest, von "else if" will ich gar nicht reden.

Aber schreiben kannst Du sowas natürlich.

Mein Vorschlag wäre, wenn die Abstraktion am Anfang zu schwierig ist:
Schreib eine Lösung mit else if, dann schreibst Du UnitTests. Sind die Tests grün machst Du dich an das Refctoring und wirst die else los.

Gruß


MrAmazing2  21.12.2021, 20:27

Hab all meinen Jahren des Programmierens noch nie gehört, dass elseif "extrem schlechter Stil" sei.

Klar, wenn man ein Switch oder Early-Return machen kann sollte man das tun, aber das geht nicht immer.

0
AldoradoXYZ  21.12.2021, 20:29
@MrAmazing2

Mir ist klar, dass viele Leute noch 20 Jahre in der Vergangenheit stecken. Aber auch diese Industrie entwickelt sich weiter und das sehr schnell.

Riesige switch case sind auch nicht besser.

Gruß

0
MrAmazing2  21.12.2021, 20:29
@AldoradoXYZ

Welche Alternative schlägst du denn vor?

Alles in Funktionen packen, in denen man dann mit Early-Return undso arbeitet?

Klingt nach viel unnötigem Code

0
AldoradoXYZ  21.12.2021, 20:30
@MrAmazing2

Abstraktion über Rules zum Bespiel, oder jegliche andere Abstraktion.
Ich vermute, dass fast alles besser ist als if else Ketten.

Gruß

0
MrAmazing2  21.12.2021, 20:31
@AldoradoXYZ

Was sind bitte Rules? Und hast du vlt. ein Beispiel für eine solche Abstraktion?

0
AldoradoXYZ  21.12.2021, 20:32
@MrAmazing2

Du kannst die Klasse nennen wie Du willst.

Du ziehst die Bedingungen raus.

Gruß

0
MrAmazing2  21.12.2021, 20:36
@AldoradoXYZ

What? Ich versteh nur Bahnhof, sorry.

Kannst du vlt. ein Beispiel geben?

Wie würdest du hier das else-if ersetzen? Wie könnte man das "rausziehen" / "abstrahieren"?:

public static String fizzBuzz(int number) {
        if (number % 15 == 0) {
            return "fizzbuzz";
        } else if (number % 5 == 0) {
            return "buzz";
        } else if (number % 3 == 0) {
            return "fizz";
        }
        return String.valueOf(number);
 }
0
MrAmazing2  21.12.2021, 20:40
@AldoradoXYZ

Natürlich kriegt man die FizzBuzz-Frage nur als kompletter Anfänger, das is schon klar :D

Aber wie würdest du bei dem Else-If jetzt die Bedingungen rausziehen oder es abstrahieren, das versteh ich noch nicht ganz?

0
AldoradoXYZ  21.12.2021, 20:47
@MrAmazing2

Das Problem mit if else Ketten ist, dass die ziemlich kompliziert unübersichtlich und schlecht zu warten sind.

Und wir haben doch alle schon diese if else Ketten mit 10-20 Stufen gesehen, oder? Und der nächste Entwickler ergänzt einfach das nächste else if, oder fummelt noch eine andere Struktur mit rein um das nächste Ticket zu erledigen. Und schon verrottet der Code schneller als man gucken kann.

Klar, für ein FizzBuzz ist eine Rule Klasse vielleicht etwas over the top, aber wir schreiben im Job nun mal nicht für FizzBuzz, sondern für echte Anforderungen. Und bei echten Anforderungen bleibt es selten bei 2-3 Stufen.

Gruß

0
MrAmazing2  21.12.2021, 20:57
@AldoradoXYZ

Also ich kenne viele Fälle, bei denen es nur 2-3 Stufen gibt. Und da finde ich ist ein klassisches if-(elseif-)else auf alle Fälle der best way to go.

Aber ja, bei größeren ifs kann ich deine Kritik nachvollziehen.

Aber so an sich würde ich if-else jetzt nicht als schlecht bezeichnen. Solange es lesbar und kurz und knackig ist.

Aber was du mit Rule-Klasse und rausziehen meinst weiß ich immernoch nicht, hast du vlt. einen Link für mich, oder irgendeinen Fachbegriff, damit ich mich darüber n bisschen informieren kann?

Meinst du vlt. enums ?

public enum SomeCondition{
   CONDITION_ONE{

       public void someMethod(MyClass myClass){
              //...
       }
   },

   CONDITION_TWO{

       public void someMethod(MyClass myClass){
       }

   }

   public abstract void someMethod(MyClass myClass);

}

public class MyClass{
//...
    public void decide(SomeCondition someCondition){
        someCondition.someMethod(this);
    }

}
0
AldoradoXYZ  21.12.2021, 21:13
@MrAmazing2

Command Pattern geht bei größeren else..if oder eben um switch case aufzulösen.

Ansonsten nimmt man bei "kleineren Fällen" early return.

Gruß

1
MrAmazing2  21.12.2021, 21:15
@AldoradoXYZ
oder eben um switch case aufzulösen.

Wobei ich die "neuen" Lambda Switches äußerst schön und leserlich finde :D

Aber Command Pattern ist (zumindest dort wo es dann verwendet wird) deutlich kürzer, also "bei größeren else..if " auf alle Fälle, da hast du recht.

0
AldoradoXYZ  21.12.2021, 21:22
@MrAmazing2

Haha, da sehe ich, dass "neuen" in Anführungsstrichen steht. Ja, Java 14 ist auch schon wieder "alt" :D

Und ja, die sehen wirklich einigermaßen übersichtlich aus.

Aber, sie lösen dass Grundproblem der Wartbarkeit nicht.

Angenommen Du willst alle möglichen Http Status Codes und Aktionen darauf implementieren.
Willst Du dann eine Klasse mit 500 Zeilen gehen und dort eine Switch um einen weiteren Case erweitern? Dann eine weitere Methode ergänzen, welche Du in dem Case verwendest?
Oder doch lieber eine komplett neue Klasse welche einfach Command implementiert.

Bedenke auch, bei der 500 Zeilenklasse darfst Du dann schön auch die entsprechenden Tests dazu anpassen.
Für dein neues Command schreibst Du auch nur genau für die neue Klasse deinen Test. Der CommandExecutor selbst ist schon komplett mit Tests abgedeckt und durch dein neues Command ändert sich für und vorallem im CommandExecutor gar nichts.

Switches haben sicherlich ihren Anwendungsfall, aber man sollte genau überlegen ob man den wirklich vor sich hat. Wenn ich alle drei Tickets an den selben Code muss um diesen zu modifizieren habe ich evtl. einen Entwurfsfehler gemacht - oder die Anforderungen ändern sich ständig (und wenn ich das weiß, implementiere ich entsprechend noch flexibler).

Gruß

1

Das kannst du problemlos machen.

if (bedingung1) {
  ...
} else if (bedingung2) {
  ...
}

if (bedingung3) {
  ...
} else if (bedingung4) {
  ...
}
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf