首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构java switch语句(21点)

重构java switch语句(21点)
EN

Stack Overflow用户
提问于 2016-11-21 01:15:19
回答 3查看 270关注 0票数 0

我在我的Java android 21点游戏的switch语句中有这个巨大的代码块,我一直在尝试重构它,但不确定最好的方法来清理它!目前,它几乎是不可读的,并且有错误,说玩家赢得了一手牌,而经销商实际上已经赢了。任何正确方向的提示或帮助都会令人惊叹。

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2016-11-21 01:21:38

在编程中,编写更长的方法非常难以理解、测试和支持,这不是一种好的做法。

您可以将每个案例的复杂逻辑拆分成单独的方法(使用有意义的名称),如下所示,这使其更具可读性和可维护性:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-21 01:32:46

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

然后确保相同的东西在整个代码中具有相同的名称。并且碰巧重复的连续指令具有相同的顺序。

将变量的可见性降低到尽可能小的块。这意味着如果您在开关的不同分支中使用相同的变量,请分别在那里声明它(并且只在使用它的ifelsefor块中声明它)。

然后选择不包含其他块但超过1行的任何块的内容。在IDE中找到“提取方法”重构并启动它。它应该会弹出一个对话框,让你输入新方法的名称,还会告诉你除了当前选择的语句之外,有多少次相同的语句被替换。如果该值大于0,则继续。

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-11-21 01:21:29

您可以格式化的

代码语言:javascript
复制
if (boolean)
{
    System.out.println("Something"); //Any oneline statement
}
else if (boolean)
{
    System.out.println("Something"); //Any oneline statement
}

作为

代码语言:javascript
复制
if (boolean)
    System.out.println("Something"); //Any oneline statement
else if (boolean)
    System.out.println("Something"); //Any oneline statement

因为你有一些if仍然是以第一种方式形成的,另一些是以第二种方式形成的。这可以大大提高可读性。此外,您还应该将逻辑从开关中移开,就像brick评论的那样。

我会评论这一点,但我还没有必要的代表。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40706929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档