合并多个if语句

时间:2019-09-29 07:39:51

标签: java android if-statement switch-statement logic

我有以下代码依赖于多个不同的if语句。我正在制作Android的Cribbage分数计数应用程序。显示的代码仅适用于蓝色团队,但是我最终为蓝色团队使用的代码也将用于红色和绿色团队。我现在所拥有的有效,但是体积很大。我是Java的新手,并希望获得一些有关将代码合并为更易于阅读和维护的最佳实践的指导。

    if(blueTeamScore >= ENDGAMESCORE) {
        String baseVictoryText = "Blue Team has won!";
        TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);

        if(hasThreePlayer == false) {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk == true) {
                if (redTeamScore <= 90) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
            }
        }
        if(hasThreePlayer == true) {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk == true) {
                if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red and Green Teams got Skunked");
                }
                if ((redTeamScore <= 90) && (greenTeamScore >= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
                if ((redTeamScore >= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Green Team got Skunked");
                }
            }
        }
    }

我知道布尔变量不能在switch语句中使用(太糟糕了),但是还有其他类似的东西可以帮助我集中代码吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用三元运算符?:。上面代码中的示例我只是简化了一部分。您可以在其他地方尝试类似的操作

        if(!hasThreePlayer) {
            winningTeamTextView.setText(hasSkunk&&redTeamScore<=90 ? baseVictoryText + "\nAnd Red Team got Skunked" : baseVictoryText);
        }
        else {
            winningTeamTextView.setText(baseVictoryText);
            if (hasSkunk) {
                if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red and Green Teams got Skunked");
                }
                if ((redTeamScore <= 90) && (greenTeamScore >= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Red Team got Skunked");
                }
                if ((redTeamScore >= 90) && (greenTeamScore <= 90)) {
                    winningTeamTextView.setText(baseVictoryText + "\nAnd Green Team got Skunked");
                }
            }
        }

答案 1 :(得分:1)

我仍然认为自己还很新,但这就是我会写的。我编辑了几次。

if (hasSkunk) {
    if (!hasThreePlayer) {
        if (redTeamScore<=90) {
            baseVictoryText += "\nAnd Red Team got Skunked";
        }
    } else {
        if ((redTeamScore <= 90) && (greenTeamScore <= 90)) {
            baseVictoryText += "\nAnd Red and Green Teams got Skunked";
        } else if (redTeamScore <= 90) {
            baseVictoryText += "\nAnd Red Team got Skunked";
        } else if (greenTeamScore <= 90) {
            baseVictoryText += "\nAnd Green Team got Skunked";
        }
    }
}
winningTeamTextView.setText(baseVictoryText);

假设您不介意更改baseVictoryText(不是常量)。否则,将其分配给其他东西并使用

不假设“ hasSkunk”意味着至少其中一个团队的得分小于90,否则如果最后一个则变为其他...

在这里,“ Else if”在理论上由于性能而更好-仅对ifs进行评估,直到一个为真为止。这不是问题,但是如果其中一个条件是使用繁重方法的结果...

像这样的一堆其他的Ifs就像断点开关一样。

答案 2 :(得分:0)

稍微干净一点,因为只需要将textField设置在一个位置,就不需要==布尔值,如果应该分支,因为如果一个成功,另一个将失败。初始响应略有变化。

if(blueTeamScore >= ENDGAMESCORE) {
    String victoryText = "Blue Team has won!";

    if(!hasThreePlayer && hasSkunk && redTeamScore <= 90) {
        victoryText += "\nAnd Red Team got Skunked");

    }else if(hasThreePlayer && hasSkunk) {
       if (redTeamScore <= 90 && greenTeamScore <= 90) {
          victoryText +=  "\nAnd Red and Green Teams got Skunked";
       }else if (redTeamScore <= 90) {
          victoryText +=  "\nAnd Red Team got Skunked";
       }else if (greenTeamScore <= 90) {
          victoryText += "\nAnd Green Team got Skunked";
       }
    }

    TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);
    //maybe check for null textfield here?
    winningTeamTextView.setText(victoryText);
}

但是我会分解为一个函数

 if(blueTeamScore >= ENDGAMESCORE) {
    String victoryText = "Blue Team has won!";
    if(hasSkunk){
        victoryText += getSkunkText(hasThreePlayer, redTeamScore, greenTeamScore)
    }

    TextView winningTeamTextView = (TextView) findViewById(R.id.winningTeam);
    //maybe check for null textfield here?
    winningTeamTextView.setText(victoryText);
}

功能:

private String getSkunkText(boolean hasThreePlayer, int redTeamScore, int greenTeamScore){
    String skunkText  = ""
    if(!hasThreePlayer) {
        skunkText = redTeamScore <= 90 ? "\nAnd Red Team got Skunked") : skunkText;
    }else if (redTeamScore <= 90 && greenTeamScore <= 90) {
        skunkText =  "\nAnd Red and Green Teams got Skunked";
    }else if ( redTeamScore <= 90) {
        skunkText =  "\nAnd Red Team got Skunked";
    }else if (greenTeamScore <= 90) {
        skunkText = "\nAnd Green Team got Skunked";
    }
    return skunkText; 
}