我在我的Java android 21点游戏的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;
}
}发布于 2016-11-21 01:21:38
在编程中,编写更长的方法非常难以理解、测试和支持,这不是一种好的做法。
您可以将每个案例的复杂逻辑拆分成单独的方法(使用有意义的名称),如下所示,这使其更具可读性和可维护性:
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**.**这样的框架,确保所有这些不同的方法都包含在适当的单元测试场景中
发布于 2016-11-21 01:32:46
首先,使用IDE的自动格式化程序对代码进行格式化。
然后确保相同的东西在整个代码中具有相同的名称。并且碰巧重复的连续指令具有相同的顺序。
将变量的可见性降低到尽可能小的块。这意味着如果您在开关的不同分支中使用相同的变量,请分别在那里声明它(并且只在使用它的if、else或for块中声明它)。
然后选择不包含其他块但超过1行的任何块的内容。在IDE中找到“提取方法”重构并启动它。它应该会弹出一个对话框,让你输入新方法的名称,还会告诉你除了当前选择的语句之外,有多少次相同的语句被替换。如果该值大于0,则继续。
如果你完成了所有查看新方法的“叶块”,并考虑是否可以将它们放到一个新类中(或者更多)。
也许这个视频会对https://www.youtube.com/watch?v=aWiwDdx_rdo有所帮助(虽然它是关于c#的)
发布于 2016-11-21 01:21:29
您可以格式化的
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因为你有一些if仍然是以第一种方式形成的,另一些是以第二种方式形成的。这可以大大提高可读性。此外,您还应该将逻辑从开关中移开,就像brick评论的那样。
我会评论这一点,但我还没有必要的代表。
https://stackoverflow.com/questions/40706929
复制相似问题