Vererbung If-Else ersetzen durch was?

lam_tr

Top Contributor
Hallo zusammen,

ich hab mal gehört dass man If-Else vermeiden soll und stattdessen Vererbungen benutzt.

Ich weiss aber nicht genau wie ich es für meinen Fall anwenden kann.
Vielleicht könnt ihr mir da weiterhelfen.

Ich habe eine Methode sie vergleicht sozusagen 2 Datum mit verschiedene if-else Statements.

z.B.

if(betweenDays(date1, date2)>0){
// mache was mit date1
}else if(notLastDayOfMonth(date1)){
// mache was mit date1
}else if(notLastDayOfMonth(date1)){
// mache was mit date1
}

Wie kann man das ganze etwas schöner gestalten?

Viele Grüße
lam
 

VfL_Freak

Top Contributor
Moin,

ich hab mal gehört dass man If-Else vermeiden soll und stattdessen Vererbungen benutzt.
Diese Aussage verstehe ich nicht !
"if-else" ist eine Fallunterscheidung und hat nichts mit "Vererbung" zu tun !!

Java:
if(betweenDays(date1, date2)>0)
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1)) // DU HAST HIER DIE GLEICHE BEDINGUNG --> dürfte einen Compilerfehler geben !!
{
    // mache was mit date1
}
Manchmal ist ein "switch" optisch schöner, aber funktional ist es eh' egal, somit könntest Du das so lassen - bis auf meine Bemerkung im Code!!

Gruß
Klaus
 

lam_tr

Top Contributor
Hallo klaus, danke für deine Antwort.

Ich finde bei IF/Else Anweisung ist es so dass, wenn ich aktuell 3 Anweisungen habe und will später noch um 10 weitere unterscheiden, dann muss ich überall mitziehen. Deshalb ist es nicht so toll.

Nach ein bissle Googlen habe ich das hier gefunden http://stackoverflow.com/questions/22953136/alternative-of-if-else-and-switch-Statements

Alle Unterscheidungen in eine Map zu initialisieren. Macht das mehr Sinn?

Falls ja, wenn ich in der Klasse A, B , C die Map benutze, wo initialisere ich sie am Besten, und wie reiche ich sie weiter?

Gruß
lam
 

lam_tr

Top Contributor
Ich habe zwei weitere Alternativen gefunden, bin mir aber nicht sicher ob es so sinnvoll ist.

Polymorphismus:
Code:
interface SomethingDoer {
    public void doSomething();
}

class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }

public class Main {
     public static void main (String[] args) {
          SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
          doer.doSomething();
     }
}

Oder in Liste anstatt Map:
Code:
List<Rule> rules = .... ; // your 3 rules initialized here somehow
for(Rule r : rules) {
  if(r.condition()) {
    r.action();
  }
}

An sich sind das 3 schöne Vorgehensweise, aber wie geht man wirklich vor in meinem Fall?
 

Dompteur

Top Contributor
ich hab mal gehört dass man If-Else vermeiden soll und stattdessen Vererbungen benutzt.
Das bezieht sich auf dieses Pattern: http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
Statt einer Vererbung kann man da auch das Strategy-Pattern verwenden.
Allerdings bin ich mir nicht sicher, ob das auf deinen Anwendungsfall passt. Hier geht es vor allem darum, dass eine Eigenschaft eines Objekts immer wieder eine Fallunterscheidung benötigt.
 

lam_tr

Top Contributor
Hallo Dompteur,

das Polymorphismus Pattern sieht meiner Meinung sehr gut aus, aber mir fehlt noch der Gedanke wie ich die Fallunterscheidung in das Object verpacke?

Soll ich etwa wieder Bedingungen abfragen und das passende Bird zurückgeben lassen?

z.B:
Bird bird = null;
if(type== Type.EUROPEAN){
bird = new EuropeanBird();
}else if(type == Type.AFRICAN){
bird = AfricanBird();
}else if(type== Type.NORWEGEAN){
bird = new NorwegeanBird();
}

println(bird.getSpeed());


Ich finde, da komme ich dann trotzdem nicht drumrum die if/else zu benutzen.
 

stg

Top Contributor
Gerade in dem von dir genannten Fall würde sich eher etwas anbieten, wie
Java:
Bird bird = type.createBird()

Auch in enums kannst du Methoden usw definieren...
 
Zuletzt bearbeitet:

stg

Top Contributor
@VfL_Freak Nur so am Rande, das ginge schon, ist unter Umständen sogar gewollt. Jedoch würde ich jeden verjagen, der mir solchen Code präsentiert :)
Java:
public class Crap {  
    static boolean check = true;
     public static void main(String ... args) {
        if(check()) {
           System.out.println("1");
       }
       else if(check()) {
          System.out.println("2");
      }
     }
  
     static boolean check() {
       check = !check;
       return check;
    }
}
 

lam_tr

Top Contributor
Hallo stg,

Code:
Bird bird = type.createBird()

Ich glaube ich bin etwas zu blöd dafür. Wo ist da die Unterscheidung um das richtige Vogel zu holen in dem Enum?

Und in meinem Fall passt es doch gar nicht oder? Wenn ich den Abstand zweier Daten, Ob Datum letzter Tag vom Monat oder Datum erster Tag vom Monat ist.

Wie kann man das am Besten verpacken?

Solche Fallunterscheidungen tendieren dazu, dass sie an mehreren Stellen vorkommen.
Der Sinn des Patterns ist es, dass du sie auf einer Stelle zusammenfasst.

Genau Dompteur, mein Ziel ist es zu zentralisieren, so dass ich nur noch an einer Stelle das verwalten muss. Aber ich komm einfach noch nicht auf die Idee.
 

stg

Top Contributor
Code:
Bird bird = type.createBird()

Ich glaube ich bin etwas zu blöd dafür. Wo ist da die Unterscheidung um das richtige Vogel zu holen in dem Enum?

Im enum!

Java:
enum Birds {
   EUROPEAN {
        public Bird createBird() { return new EuropeanBird(); }
   }
   // ...
  public abstract Bird createBird();
}
 

Dompteur

Top Contributor
@lam_tr
Du könntest das Strategy Pattern verwenden und ein Interface definieren IHandleDate mit der Methode doIt.
Dann erstellst du für jeden Fall eine Klasse, die dein jeweiliges "mache was mit date1" in der Methode doIt implementiert.
Deine HandleDateFactory implementiert nun eine createHandleDate Methode, die die Fallunterscheidungen macht und die richtige Klasse erzeugt.

Dann sieht deine Verwendung so aus:
Java:
IHandleDate executor = HandleDateFactory.createHandleDate (date1, date2);
executor.doIt(date1);

Bei deinem konkreten Beispiel bringt das Pattern aber nur dann etwas, wenn du die gleiche if/else Sequenz an verschiedenen Stellen immer wieder verwenden musst.
Und auch nur dann, wenn du nicht schon den ganzen Block als Methode herausziehen kannst. ;-)
 

lam_tr

Top Contributor
Oh man, ich glaube das StrategyPattern war wirklich das was ich gebraucht habe.
Ich werde mir dieses Pattern mal genauer angucken.

Vielen Dank euch beiden. Habe auf jeden Fall sehr viel dazu gelernt.
 

lam_tr

Top Contributor
Hi Dompteur,

mir ist noch was aufgefallen du meintest Fallunterscheidung soll noch in der "createHandleDate Methode" gemacht werden, d.h. dort werden trotzdem if/else geben oder?

Gruss lam
 

VfL_Freak

Top Contributor
@VfL_Freak Nur so am Rande, das ginge schon, ist unter Umständen sogar gewollt. Jedoch würde ich jeden verjagen, der mir solchen Code präsentiert :)
Java:
public class Crap { 
    static boolean check = true;
     public static void main(String ... args) {
        if(check()) {
           System.out.println("1");
       }
       else if(check()) {
          System.out.println("2");
      }
     }
 
     static boolean check() {
       check = !check;
       return check;
    }
}
ok, Du hast in soweit recht, das es sich wirklich compilieren und auch ausführen läßt!
Allerdings hat dieses Beispiel nur wenig mit Deinen Ursprungspost gemein!
Java:
if(betweenDays(date1, date2)>0)
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
    // mache was mit date1
}
Ich wollte darauf hinweisen, das hier die dritte Bedingung obsolet ist, da sie nie durchlaufen werden kann!
Ich hätte aber zwar jetzt genau deswegen einen Compiler-Fehler oder zumindest eine Warning erwartet, aber vlt. haben wir die auch beide ausgeschaltet!

Gruß Klaus
 

lam_tr

Top Contributor
Danke Klaus, es war nur ein falsche Paste-Fehler.
Es sollte so heißen

Code:
if(betweenDays(date1, date2)>0)
{
     // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
     // mache was mit date1
}
else if(notFirstDayOfMonth(date1))
{
     // mache was mit date1
}

Deswegen soll Copy/Paste wirklich vermieden werden :)
 

VfL_Freak

Top Contributor
Moin,
Deswegen soll Copy/Paste wirklich vermieden werden :)
Genau !! Tippfehler sind viel schöner :D

Aber wenn Du eine simple Fallunterscheidung hast, ist grundlegend ein if-else oder ein switch das Mittel der Wahl!
Ob sich der o. g. Aufwand mit den Pattern wirklich lohnt, muss man wohl im Einzelfall entscheiden ...

Gruß Klaus
 

InfectedBytes

Top Contributor
ok, Du hast in soweit recht, das es sich wirklich compilieren und auch ausführen läßt!
Allerdings hat dieses Beispiel nur wenig mit Deinen Ursprungspost gemein!
Java:
if(betweenDays(date1, date2)>0)
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
    // mache was mit date1
}
else if(notLastDayOfMonth(date1))
{
    // mache was mit date1
}
Ich wollte darauf hinweisen, das hier die dritte Bedingung obsolet ist, da sie nie durchlaufen werden kann!
Ich hätte aber zwar jetzt genau deswegen einen Compiler-Fehler oder zumindest eine Warning erwartet, aber vlt. haben wir die auch beide ausgeschaltet!

Gruß Klaus
Der Compiler liefert keine Warnung, da es sich um einen Methodenaufruf handelt. Und hier kann man natürlich trotz des gleichen Parameters auch verschiedene Ergebnisse bekommen.

@lam_tr
In dem Fall brauchst du dennoch eine Fall Unterscheidung, aber eben nur einmal und nicht an mehreren verschiedenen Stellen.
 

lam_tr

Top Contributor
@InfectedBytes
Ahhh, jetzt blickt bei mir erst recht ein Lämpchen.
in der Factory-Klasse wird spezifiert und in allen anderen arbeite ich entweder mit Oberklasse oder Interface.

Sehr gut, danke schön!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Mehrfache if-else-Abfrage zusammenfassen Allgemeine Java-Themen 51
ReinerCoder Case statt if else Abfragen?! Allgemeine Java-Themen 8
M Variablen If - Else Wiederholungsfehler Allgemeine Java-Themen 3
O Darstellung von else if anweisung im struktogramm? Allgemeine Java-Themen 1
R Wie schaffe ich es, dass java zB 100 zählt ohne ständig "else if" hinschreiben zu müssen? Allgemeine Java-Themen 7
J if else Anweisung macht nicht was es soll. Wieso? Allgemeine Java-Themen 10
K Eclipse Alternativkonstrukte (Verzweigungen: if, switch,else..) Allgemeine Java-Themen 4
D if - else Baum vereinfachen Allgemeine Java-Themen 4
S Else-Anweisung Problem Allgemeine Java-Themen 17
B Berechnung von Punkten/ If-else Strategie?! Allgemeine Java-Themen 51
M if - else Abfrage beenden Allgemeine Java-Themen 4
M if, else, etc. als Membervariablen? Allgemeine Java-Themen 14
P if(a) else if (b) else if (c) . Frage Allgemeine Java-Themen 2
G die mittlere von 5 Zahlen nur mit if und else finden Allgemeine Java-Themen 48
U Kompilieren einer großen Datei if-else = StackOverflowError Allgemeine Java-Themen 4
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
G switch case VS. if.else if Allgemeine Java-Themen 2
H if - else if-else bessere Lösung gesucht Allgemeine Java-Themen 4
H If anweisungen zu verschachtelt? else without if Allgemeine Java-Themen 8
D Performancefrage zu "else if" und "||" Allgemeine Java-Themen 10
G if . else ? Allgemeine Java-Themen 36
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
I Apache POI Bild in Word ersetzen Allgemeine Java-Themen 15
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
I Buchstabe durch seinen Nachfolger ersetzen Allgemeine Java-Themen 29
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
I Text suchen und ersetzen im Word Dokument Allgemeine Java-Themen 3
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
M Alles außer Muster in String ersetzen Allgemeine Java-Themen 1
S Kann man mit einem GeneralPath.curveTo ein GeneralPath.quadTo ersetzen..? Allgemeine Java-Themen 2
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
C Variablen $-Zeichen in String ersetzen Allgemeine Java-Themen 3
D Ersetzen in Open Office Dokument Allgemeine Java-Themen 2
F Slash durch Systembezogenen Fileseparator ersetzen Allgemeine Java-Themen 18
F System.out.println mit log4j ersetzen Allgemeine Java-Themen 10
X Klassen innerhalb einer jar ersetzen Allgemeine Java-Themen 2
D Fehler beim ersetzen in String Allgemeine Java-Themen 2
2 String matchen und ersetzen Allgemeine Java-Themen 3
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
J HTML-Sonderzeichen ersetzen Allgemeine Java-Themen 2
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
thE_29 $ in String ersetzen fürs nochmalige ersetzen.. (JavaBug?) Allgemeine Java-Themen 7
nrg JS als ScriptEngine - alle Punkte ersetzen Allgemeine Java-Themen 4
S String in Datei finden und ersetzen Allgemeine Java-Themen 11
O Zeichenkette aus Zeichenkette ersetzen mit Hashtable Allgemeine Java-Themen 8
Guybrush Threepwood Effizientes Ersetzen von Umlauten Allgemeine Java-Themen 3
W dateiinhalte ersetzen Allgemeine Java-Themen 2
M Klasse zur Laufzeit ersetzen Allgemeine Java-Themen 10
S teile einer datei mit Regexp ersetzen Allgemeine Java-Themen 5
M String ersetzen Allgemeine Java-Themen 10
M Ersetzen von &#xD; Allgemeine Java-Themen 2
M Suchen und Ersetzen? Allgemeine Java-Themen 4
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
Daniel_L RegEx - variable Vorkommen ersetzen? Allgemeine Java-Themen 5
E *.class ändern/ersetzen/überschreiben. Allgemeine Java-Themen 9
J Teile eines Strings ersetzen Allgemeine Java-Themen 2
R Farbe im Bild ersetzen Allgemeine Java-Themen 11
J Zweidimensionales Array durch ZwischenArray ersetzen Allgemeine Java-Themen 3
J Chars in einem String durch "nichts" ersetzen Allgemeine Java-Themen 3
F [ und mit replaceAll() ersetzen Allgemeine Java-Themen 2
A Fehler beim Ersetzen eines Strings Allgemeine Java-Themen 3
G Suchen und Ersetzen bei JTextAray Allgemeine Java-Themen 3
M RegEx: Muster ersetzen Allgemeine Java-Themen 6
V Lib für Strings suchen und ersetzen (erweitert) Allgemeine Java-Themen 3
M Variablen in einer .doc Vorlage ersetzen Allgemeine Java-Themen 4
M Worte aus Textdatei mit Java ersetzen Allgemeine Java-Themen 4
R Datum in *.txt suchen und ersetzen Allgemeine Java-Themen 2
E Regex Frage (+ ersetzen) Allgemeine Java-Themen 18
T Bestimmte bytes in einer Datei ersetzen? Allgemeine Java-Themen 4
P replaceAll und "\" durch "/" ersetzen Allgemeine Java-Themen 15
J Vector - Wert ersetzen Allgemeine Java-Themen 14
G Ersetzen von " durch " Allgemeine Java-Themen 4
T Slashes in String durch Punkte ersetzen Allgemeine Java-Themen 2
L ein char in einem string ersetzen? Allgemeine Java-Themen 5
R String.replaceAll $lt; ersetzen Allgemeine Java-Themen 3
Maximum '.' in String ersetzen macht Schwierigkeiten Allgemeine Java-Themen 2
T Systemunabhängig File Separator ersetzen Allgemeine Java-Themen 13
M RS232 Schnittstelle ansteuern (Floppy durch Laptop ersetzen) Allgemeine Java-Themen 2
S Wörter ersetzen mit regex Allgemeine Java-Themen 11
C "<" durch "/<" ersetzen Allgemeine Java-Themen 14
G Suchwörter in einen Text ersetzen Allgemeine Java-Themen 6
C Collection Element ersetzen Allgemeine Java-Themen 5
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
H Dienst durch ssh forwarding absichern? Allgemeine Java-Themen 15
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
Y Wie bekomme ich durch getImage an das Image heran? Allgemeine Java-Themen 1
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
C OpenCl Setup und durch JavaCode ansteuern Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben