我在我的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;
}
}
答案 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的自动格式化程序格式化代码。
然后确保相同的东西在代码中具有相同的名称。并且任何机会重复连续的指令都有相同的顺序。
将变量的可见性降低到可能的最小块。这意味着如果您在交换机的不同分支中使用相同的变量,则将其单独声明(并且仅在使用它的if
,else
或for
块内部。/ p>
然后选择任何不包含其他块但具有更多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
因为你有一些如果仍然以第一种方式形成,而其他人则以第二种方式形成。这可以提高可读性。此外,您应该将逻辑移离开关,如砖块评论。
我会评论这个,但我还没有得到所需的代表。