2016-11-20 18 views
0

Ich habe diesen riesigen Code-Block in einer switch-Anweisung für mein Java-android-Blackjack-Spiel und ich habe versucht, es zu refactor, aber unsicher über die beste Möglichkeit, dies zu bereinigen! Derzeit ist es fast unlesbar und hat Fehler, die sagen, dass der Spieler eine Hand gewonnen hat, wenn der Dealer tatsächlich gewonnen hat. Irgendwelche Tipps in die richtige Richtung oder Hilfe wären toll.Refactoring Java Switch-Anweisung (Blackjack)

public void checkTable() { 
    switch (tableState) { 
     case NEW_GAME: 
      setUpNewGame(); 
      break; 

     case PLAYING: { 

      Player currentPlayer = this.players.get(currentPlayerIndex); 
      Player.State currentState = currentPlayer.getState(); 

      if (currentState != Player.State.STAND || 
        currentState != Player.State.BUST) { 
       if (currentPlayer.askAction() == Player.Action.HIT) { 
        currentPlayer.hit(deck.dealCard()); 
        if (currentPlayer.getHandValue() > 21) { 
         currentPlayer.setState(Player.State.BUST); 
        } else if (currentPlayer.getHandValue() == 21) { 
         currentPlayer.setState(Player.State.STAND); 
        } 
       } 

       if (currentPlayer.askAction() == Player.Action.STAND) { 
        currentPlayer.setState(Player.State.STAND); 
        currentPlayer.setAction(Player.Action.WAIT); 
        currentPlayerIndex++; 
       } 
       else if (currentState != Player.State.BUST) { 
        currentPlayer.setAction(Player.Action.WAIT); 
        currentPlayerIndex++; 
       } 
      } 
      if (currentPlayerIndex > players.size() - 1) 
       tableState = RESOLVE; 
      else 
       break; 
     } 
     case RESOLVE: 

      while (this.dealer.getHandValue() < 17) 
       this.dealer.hit(deck.dealCard()); 

      if(this.dealer.getHandValue() > 21) 
       this.dealer.setState(Player.State.BUST); 

      if (this.dealer.getState() == Player.State.BUST) { 

       for (int i = 0; i < this.players.size(); i++) { 
        if (this.players.get(i).getState() != Player.State.BUST) { 
         this.players.get(i).setState(Player.State.WON); 
        } 
       } 
      } 
      else 
      { 
       for (int i = 0; i < this.players.size(); i++) { 
        if (this.players.get(i).getState() != Player.State.BUST) { 
         if (this.players.get(i).getHandValue() < dealer.getHandValue()) 
          players.get(i).setState(Player.State.LOST); 
         if (players.get(i).getHandValue() < dealer.getHandValue()) 
          players.get(i).setState(Player.State.WON); 
         if (players.get(i).getHandValue() == dealer.getHandValue()) 
          players.get(i).setState(Player.State.PUSH); 
        } 
       } 
      } 

     default: 
      break; 
    } 
} 
+1

ich, indem sie den Inhalt der einzelnen Schaltergehäuses in einem separaten Verfahren beginnen würde. Selbst wenn sie es nicht in Ihre endgültige Antwort bringen, wird dies helfen, diesen Code zu bereinigen und ihn leichter lesbar zu machen. – Brick

+0

Danke Ziegel!Ich werde sie jetzt trennen, arbeite immer noch daran, den Code aufzuräumen, aber sie aufzuteilen, ist eine gute Idee. – kaygee

Antwort

-1

können Sie forma

if (boolean) 
{ 
    System.out.println("Something"); //Any oneline statement 
} 
else if (boolean) 
{ 
    System.out.println("Something"); //Any oneline statement 
} 

als

if (boolean) 
    System.out.println("Something"); //Any oneline statement 
else if (boolean) 
    System.out.println("Something"); //Any oneline statement 

Wie Sie einige, wenn noch in der ersten Art und Weise und andere in der zweiten Art und Weise formatiert ist. Das könnte die Lesbarkeit ein wenig verbessern. Außerdem sollten Sie die Logik vom Schalter weg bewegen, wie Ziegelstein kommentiert.

Ich hätte dies kommentiert, aber ich habe noch nicht die erforderliche rep.

+0

Großartig, das ist unglaublich hilfreich, ich werde das jetzt tun. Vielen Dank! – kaygee

1

In der Programmierung ist es keine gute Praxis, längere Methoden zu schreiben, die sehr schwer zu verstehen, zu testen und zu unterstützen sind.

Sie können die komplexe Logik für jeden Fall in getrennte Verfahren aufgeteilt (mit aussagekräftigen Namen), wie unten gezeigt, die es besser lesbar und wartbar macht: alle

public void checkTable() { 
    switch (tableState) { 
     case NEW_GAME: 
      setUpNewGame(); 
      break; 

     case PLAYING: 
      handlePlaying();//Move the PLAYING logic to handlePlaying() 
      break; 

     case RESOLVE: 
      handleResolve();//Move the RESOLVE logic to handleResolve() 
      break; 

     default: 
      break; 
    } 
} 

außerdem sicher, dass diese verschiedenen Methoden wurden unter Verwendung der Frameworks wie JUnit mit geeigneten Unit-Testing-Szenarien behandelt.

+0

Danke Javaguy! Ich werde das jetzt aufteilen, aber die komplexe Logik, die in das handlePlaying und handleResovle geht, wird noch etwas aufgeräumt werden müssen, da ich nur neu in Java bin und denke, dass ich es ausbreiten lasse! – kaygee

+0

Ja, Sie können weiter aufteilen wie GriffBust(), etc ... – developer

0

Zuerst formatieren Sie Ihren Code mit dem Auto-Formatierer Ihrer IDE.

Dann stellen Sie sicher, dass die gleichen Dinge den gleichen Namen über den Code haben. und zufällige aufeinanderfolgende Anweisungen haben zufällig die gleiche Reihenfolge.

reduzieren Sie die Sichtbarkeit von Variablen auf den kleinstmöglichen Block. Das heißt, wenn Sie die gleiche Variable in verschiedenen Zweigen Ihres Switches verwenden, deklarieren Sie sie dort separat (und die einzige innerhalb der if, else oder for Block, wo es verwendet wird).

Wählen Sie dann den Inhalt eines Blocks aus, der keine anderen Blöcke enthält, aber mehr als eine Zeile enthält. in Ihrer IDE finden Sie die "Extrakt Methode" Refactoring und starten Sie es. Es sollte einen Dialog auftauchen, in dem Sie einen Namen für die neue Methode eingeben können, in dem auch angegeben wird, wie viele Vorkommen desselben Satzes von Anweisungen zusätzlich zur aktuell ausgewählten ersetzt werden. Wenn dies in mehr als 0 ist, dann fahre fort.

Wenn Sie mit allen "Blattblöcken" fertig sind, die die neuen Methoden betrachten und überlegen, ob Sie sie in eine neue Klasse (oder mehr) bringen könnten.

vielleicht dieses Video hilft (auch wenn es sich um C# ist) https://www.youtube.com/watch?v=aWiwDdx_rdo