2016-11-20 49 views
0

私は、このJavaのアンドロイドブラックジャックゲームのswitch文でこの巨大なブロックを持っており、リファクタリングしようとしていますが、これをクリーンアップする最善の方法は不明です!現在、ほとんど読めなくなっており、ディーラーが実際に勝ったときにプレーヤーが勝利したというバグがあります。適切な方向へのヒントや助けは素晴らしいでしょう。リファクタリングjava switch文(ブラックジャック)

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

(これは、C#についてですが)

多分このビデオは役立ちます。たとえ彼らがあなたの最終的な答えになっていなくても、このコードを整理して読みやすくするのに役立ちます。 – Brick

+0

ありがとうブリック!それらを今分けて、まだコードを整理することに取り組んでいますが、それらを分割することは良い考えです。 – kaygee

答えて

-1

まだ第二の方法では第一の方法などでフォーマットされます場合は、いくつか持っているとして、あなたは

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

として

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

をフォーマットすることができます。それはかなりの読みやすさを向上させることができます。また、ブリックのようなスイッチからロジックを離してコメントアウトする必要があります。

私はこれをコメントしましたが、まだ必要な担当者はいません。

+0

すごく助かりました。ありがとう! – kaygee

1

プログラミングでは、理解し、テストしてサポートすることが非常に難しいより長いメソッドを書くのは良い習慣ではありません。

以下に示すようにあなたがそれをより読みやすく、保守なりれ、(意味のある名前を持つ)別の方法に各ケースの複雑なロジックを分割することができ:

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

また、すべてのこれらの異なる方法いることを確認JUnitのようなフレームワークを使用して、適切な単体テストシナリオが適用されています。

+0

javaguyありがとう!私はこれらを分割しますが、handlePlayingとhandleResovleに入る複雑なロジックは、私がjavaを初めて使っているときにはまだまだ整理が必要です。 – kaygee

+0

はい、handleBust()などのようにさらに分割することができます。 – developer

0

まず、IDEの自動フォーマッタを使用してコードをフォーマットします。

次に、同じものがすべて同じ名前であることを保証します。何度も繰り返し命令が繰り返されると同じ順序になります。

変数の可視性を可能な限り小さくします。つまり、スイッチの異なる支店で同じ変数を使用する場合は、別々に宣言します(そして、使用されるブロックはifelseまたはforブロック内のみです)。

他のブロックを含まないが1行以上のブロックの内容を選択します。 IDEで "抽出メソッド"リファクタリングを見つけて開始します。新しいメソッドの名前を入力できるダイアログが表示され、現在選択されているものに加えて置き換えられる同じ文章が何回出現するかが示されます。これが0より大きい場合は、処理を続行します。

新しい方法を見て、新しいクラスに入れることができるかどうかを考える "リーフブロック"をすべて終えたら(もっと詳しく)。私は別の方法に、各スイッチケースの内容を置くことによって開始したいhttps://www.youtube.com/watch?v=aWiwDdx_rdo