Frage

Ich bin neugierig zu sehen, keine alternative(N) zu den regelmäßig, wenn Aussagen wie

if(x)
     do a;
if(y)
     do b;
if(z)
    do c;

Sie sehen also alle if-Anweisungen sind seperate und keine else-Bedingung.Bitte beachten Sie, dass X-Y-Z sind völlig getrennte Bedingungen, so wechseln Sie würden nicht passen.

War es hilfreich?

Lösung

Ein „wirklich objektorientiert“ Antwort wäre eine Schnittstelle für die „Regel“ zu definieren (mit Bedingung () und Aktion () Methoden), erstellen 3-Implementierungen, um sie in eine Sammlung stopfen, und dann durchläuft gerade durch sie allgemein als in:

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

Das macht viel mehr Sinn, wenn Sie 300 Regeln / Bedingungen haben, anstatt nur 3.

In Java8, Sie können dies stattdessen tun, wenn die Regeln CPU-intensiv sind:

rules.parallelStream().filter(Rule::condition).forEach(Rule::action);

Andere Tipps

Die kurze Antwort ist ja.

Es gibt ein paar Mal, wenn für die bedingte evluation mit vermeiden und alles zusammen Verzweigung. Und sie haben Momente der Angemessenheit.

  1. Polymorphismus, wenn das Verhalten ist abhängig von den Ausgangswerten
  2. Referrenced Zuordnung, wenn Sie die möglichen Anfangswerte kennen und sie haben 1 bis 1 Korrelation mit den Rückgabewerten. Listen sind besser als Arrays für diese, aber ...
       

    // Example:  
    if (a==1) { b=2;  }  
    if (a==2) { b=17; }  
    
    // Becomes  
    int fx(2);  // our array of answers  
    fx[0] = 2;   
    fx[1] = 17;  
    b = fx[ a - 1 ];
    
  3. Referrenced Branching, wenn Sie wissen, die möglichen Anfangswerte, und sie haben 1 bis 1 Korrelation mit der Funktion / Zweig zu verwenden. (Beispiel nicht Java)

    // Example:
    if (a==1) { doSomething1();  }  
    if (a==2) { doSomething2(); }  
    
    // Becomes
    function * fx(2);  // our array or better still, list of functions  
    fx[0] = &doSomething1;   
    fx[1] = &doSomething2;  
    `fx[ a - 1 ](); `
    
  4. Direkt boolean Zuordnung.

    Wir hassen:

    if (thisCondition == true) {  
      b = true;  
    } else {  
      b = false;  
    }
    

    Sollte sein:

      

    b = dieser Zustand;

Die Alternativen in Java zu if-else sind die switch-Anweisung und die bedingter ternärer (: ) Operator, genau von denen keiner tun, was Sie fragen (Griff gerade einen if ohne else). Der Code, den Sie geschrieben ist der beste Weg, es zu tun, meiner Meinung nach.

Mit Polymorphismus.

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();
     }
}

Das ist, wenn nicht vollständig beseitigt, aber es bewegt zu SomethingDoerFactory. Diese Lösung ist nicht in allen Fällen anwendbar, aber in einige von ihnen ist es eine sehr gute Alternative zu mehreren ifs.

Hier ist ein schönes darüber reden:
http://misko.hevery.com / 2008/12/08 / Clean-Code-Gespräche-Erbe-Polymorphismus-Test /

Dies ist die einfachste, lesbar, aber effektive Lösung. Ich würde überrascht sein, hier wirksame Alternativen zu sehen.

EDIT

Sie können versuchen, Extrakt Methode mehrmals anwenden:

doAIfX();
doBIfY();
doCifZ();

Dabei Methoden sind definiert durch:

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}

es hängt wirklich davon ab, was x, y, z und a, b, c sind. Manchmal, wenn Aussagen sind besser geeignet. Manchmal Polymorphismus ist besser geeignet.

Sie müssen irgendwo diese, wenn Aussagen haben.

Sie können in andere Methoden Refactoring werden, um das vorliegende Verfahren sauber zu halten, wie andere vorgeschlagen haben. Wenn Sie wieder zu verwenden, das gleiche gesetzt if-Anweisungen in einer Reihe von Orten, es Macht möglich sein, die Verwendung der Decorator-Muster .

Es klingt wie ein perfekter Fall für die Verwendung von Schließung . Aber dafür müssen Sie groovy oder etwas ähnliches.

Wie wäre...myAnimator(was, pos, speed | computeSpeed());

wenn die Geschwindigkeit === undefined es wird dann computeSpeed...Denke ich.

Es hängt wirklich von dem Zusammenhang ... aber ja if-else ist nur eine von Kontrollfluss Anweisung in Java: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top