2016-11-20 57 views
0

我在我的Java android二十一點遊戲的switch語句中有這麼大的代碼塊,我一直試圖重構它,但不確定最好的方式來清理它!目前它幾乎是不可讀的,並且存在一些錯誤,即當莊家贏得實際贏家時,玩家贏得了一手牌。任何正確的方向或幫助提示將是驚人的。重構java開關語句(二十一點)

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

我想通過把每個開關盒的內容到一個單獨的方法來啓動。即使它們沒有成爲你的最終答案,這將有助於清理這段代碼並使其更易於閱讀。 – 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的自動格式化程序將所有代碼格式化。

然後確保同樣的東西在代碼上有相同的名字。並且通過任何重複的連續指令具有相同的順序。

將變量的可見性降至最小的可能塊。這意味着如果您在交換機的不同分支中使用相同的變量,請單獨聲明它(並且在ifelseforfor塊中的唯一使用位置)。

然後選擇任何不包含其他塊但有更多1行的塊的內容。在您的IDE中找到「提取方法」重構並啓動它。它應該彈出一個對話框,讓你爲新方法輸入一個名字,它也告訴除了當前選定的語句之外,還有多少條同樣的語句被替換。如果超過0,則繼續。

如果你完成了所有關於新方法的「葉塊」,並認爲你是否可以把它們放到一個新的類(更多)。

也許這個視頻幫助(雖然它是關於C#)https://www.youtube.com/watch?v=aWiwDdx_rdo