重构java switch语句(blackjack)

时间:2016-11-20 17:15:19

标签: java android

我在我的Java android二十一点游戏的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;
    }
}

3 个答案:

答案 0 :(得分: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等框架,确保所有这些不同的方法都已通过适当的单元测试方案进行了涵盖。

答案 1 :(得分:0)

首先使用IDE的自动格式化程序格式化代码。

然后确保相同的东西在代码中具有相同的名称。并且任何机会重复连续的指令都有相同的顺序。

将变量的可见性降低到可能的最小块。这意味着如果您在交换机的不同分支中使用相同的变量,则将其单独声明(并且仅在使用它的ifelsefor块内部。

然后选择任何不包含其他块但具有更多1行的块的内容。在IDE中找到“提取方法”重构并启动它。它应该会打开一个对话框,允许您输入新方法的名称,它还会告诉您除了当前选择的那些语句之外还要替换多少个语句。如果超过0则继续。

如果你完成了查看新方法的所有“叶块”,并想想你是否可以将它们放入一个新类(更多)。

也许这个视频有帮助(虽然它是关于c#)https://www.youtube.com/watch?v=aWiwDdx_rdo

答案 2 :(得分:-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

因为你有一些如果仍然以第一种方式形成,而其他人则以第二种方式形成。这可以提高可读性。此外,您应该将逻辑移离开关,如砖块评论。

我会评论这个,但我还没有得到所需的代表。