2016-06-10 29 views
1

Ich möchte anstelle von if-sonst Schalter verwenden, wie ich habe, dass es besser ist, wenn es viele Wenn-sonst gibt. Das Problem ist, dass ich mehrere Argumente habe, also weiß ich nicht, wie ich damit umgehen soll.Wie verwende ich switch() mit mehreren Argumenten?

Hier sind meine if-anderes:

if(frame.height()/2 + margin < pt.y){ 
      System.out.println("down"); 
      drone.getCommandManager().down(20).doFor(100); 
      drone.getCommandManager().hover(); 
     } 
     else if(frame.height()/2 - margin > pt.y){ 
      System.out.println("up"); 
      drone.getCommandManager().up(20).doFor(100); 
      drone.getCommandManager().hover(); 
     } 
     else if(frame.width()/2+margin < pt.x){ 
      drone.getCommandManager().spinRight(30).doFor(33); 
      drone.getCommandManager().hover(); 
      System.out.println("RIGHT"); 

     } 
     else if(frame.width()/2-margin > pt.x){ 
      drone.getCommandManager().spinLeft(30).doFor(33); 
      drone.getCommandManager().hover(); 
      System.out.println("LEFT"); 
     } 

     else if(frame.width()/2+margin > pt.x && frame.width()/2-margin<pt.x){ 
      System.out.println("GO"); 
      drone.getCommandManager().forward(30).doFor(time+2000); 
      drone.getCommandManager().hover(); 
     } 

     else{ 
      drone.getCommandManager().hover(); 
     } 
+0

Sie nur switch-Anweisung verwenden können, wenn Sie haben eine einzelne Variable, um den Fluss zu steuern. Im obigen Beispiel haben Sie viele Bedingungen zu überprüfen, hier in diesem speziellen Fall wird SWITCH Anweisung nicht empfohlen. – sauumum

Antwort

3

Sie können nicht.

Die Labels in einer switch müssen Kompilierzeit auswertbare konstante Ausdrücke sein, und müssen genau mit der Sache zu sein, die eingeschaltet ist.

3

Sie könnten für eine Sekunde zurücktreten und über das TDA Prinzip lesen.

Was Sie hier im Wesentlichen tun, ist: Fragen Sie den Zustand von etwas, und treffen Sie dann Entscheidungen darüber, wie etwas anderes darauf reagieren sollte. Ding ist - das ist wirklich kein objektorientiertes Denken.

Direction newDirection = someDetector.getNewDirection(...) 
CommandManagerUpdater updater = theFactory.generateUpdaterFor(newDirection); 
updater.updateOnNewDirection(commandManager); 

Lange Rede kurzer Sinn:

interface CommandManagerUpdater { 
    void updateOnNewDirection(CommandManager); 
} 

enum Direction { UP, DOWN, ... }; 

class DirectionDetector { 
    Direction getNewDirection(Frame, x, yz, whatever you need) 

class CommandManagerUpdaterFactory { 
    CommandManagerUpdater generateUpdaterFor(Direction newDirection) { 

Wenn Sie die oben genannten Mittel an Ort und Stelle haben, können Sie das Ganze als aufzuschreiben:

Sie stattdessen gehen könnte in der OO-Programmierung, Sie sollten diese Art von if/else/switch-Anweisungen vermeiden. Stattdessen: Sie erstellen korrekte OO-Abstraktionen. und nutzen Sie Fabriken und Polymorphie. Und lassen Sie mich sehr klar darüber sein: Schalter Aussagen sind nicht die Antwort auf Ihre Probleme. Sie sind nur eine syntaktisch marginal verbesserte Version von if/else-Bäumen.

Natürlich müssen Sie am Ende auf "Richtung" schalten. Aber: Sie verstecken diesen Schalter in der Fabrik. Es sollte so wenig wie möglich darum gehen, alle die möglichen Richtungen zu kennen.

Endlich: behalten Sie die Code-Duplizierung im Auge. Schau dir an, wie oft du diesen "Hoover()" -Aufruf in deinem Code hast - die meisten könnten weggehen! Weißt du, wenn du die ganze Zeit "staubst", für jede deiner Richtungen; dann rufst du diesen Ruf auf einmal unbedingt notieren, anstatt es n mal in jeder deiner Filialen zu wiederholen!

0

Ich stimme dem zu, was Jägermeister gesagt hat. Ich denke, sollten Sie richtige OO-Prinzipien verwenden, um Ihren Code zu verbessern, aber wenn Sie wirklich einen Schalter wollten ...

Sie sollten die Ausdrücke, die Sie haben, in einzelne Werte konvertieren. Sie könnten eine Enumeration wie verwenden:

public enum Result { 
    A, B, C, D, E, F 
} 

Natürlich sollten Sie geben es aussagekräftige Namen!

Dann können Sie eine Methode, die die Expression in Folge wandelt:

public Result calculateResult() { 
    if (frame.height()/2 + margin < pt.y) { 
     return A; 
    } else if (frame.height()/2 - margin > pt.y) { 
     return B; 
    } else if (frame.width()/2 + margin < pt.x) { 
     return C; 
    } else if (frame.width()/2 - margin > pt.x) { 
     return D; 
    } else if (frame.width()/2 + margin > pt.x && frame.width()/2 - margin < pt.x) { 
     return E; 
    } else { 
     return F; 
    } 
} 

Welche am Ende wird man in dem Schalter verwenden:

switch (calculateResult()) { 
    case A: 
     System.out.println("down"); 
     drone.getCommandManager().down(20).doFor(100); 
     drone.getCommandManager().hover(); 
     break; 
    case B: 
     System.out.println("up"); 
     drone.getCommandManager().up(20).doFor(100); 
     drone.getCommandManager().hover(); 
     break; 
    case C: 
     drone.getCommandManager().spinRight(30).doFor(33); 
     drone.getCommandManager().hover(); 
     System.out.println("RIGHT"); 
     break; 
    case D: 
     drone.getCommandManager().spinLeft(30).doFor(33); 
     drone.getCommandManager().hover(); 
     System.out.println("LEFT"); 
     break; 
    case E: 
     System.out.println("GO"); 
     drone.getCommandManager().forward(30).doFor(time + 2000); 
     drone.getCommandManager().hover(); 
     break; 
    case F: 
     drone.getCommandManager().hover(); 
     break; 
} 
+0

Sei vorsichtig hier: Du nimmst genau die Route ... sollte man vermeiden; Ich nenne das die ** enum ** Falle. Sie sehen ... was passiert, wenn Sie Ihrem Enum eine weitere Instanz hinzufügen? Sie müssen zurückgehen und jede Ihrer Switch-Anweisungen überarbeiten. – GhostCat

+0

Genau, ich stimme Ihnen vollkommen zu. –

Verwandte Themen