如何缩短这段代码?我知道有一种方法可以缩短这类代码,但我还不知道自己是如何做到的。有谁能帮帮我呢?
//CHOOSE LEVEL: FROZEN
case 1213:
sendOption5("Level 1 " + (c.achievedFloor <= 1 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 2 " + (c.achievedFloor <= 2 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 3 " + (c.achievedFloor <= 3 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 4 " + (c.achievedFloor <= 4 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"More");
c.dialogueAction = 1213;
break;
case 1214:
sendOption5("Level 5 " + (c.achievedFloor <= 5 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 6 " + (c.achievedFloor <= 6 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 7 " + (c.achievedFloor <= 7 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 8 " + (c.achievedFloor <= 8 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"More");
c.dialogueAction = 1214;
break;
case 1215:
sendOption5("Level 9 " + (c.achievedFloor <= 9 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 10 " + (c.achievedFloor <= 10 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"Level 11 " + (c.achievedFloor <= 11 ? "@gre@(Achieved)" : "@red@(Not achieved)") + "",
"",
"Choose Floor");
c.dialogueAction = 1215;
break;发布于 2014-03-08 10:51:53
在第一步中,我将提取一个生成字符串的方法。
修改后的代码:
//CHOOSE LEVEL: FROZEN
case 1213:
sendOption5(
levelString( 1, c),
levelString( 2, c),
levelString( 3, c),
levelString( 4, c),
"More");
c.dialogueAction = 1213;
break;
case 1214:
sendOption5(
levelString( 5, c),
levelString( 6, c),
levelString( 7, c),
levelString( 8, c),
"More");
c.dialogueAction = 1214;
break;
case 1215:
sendOption5(
levelString( 9, c),
levelString(10, c),
levelString(11, c),
"",
"Choose Floor");
c.dialogueAction = 1215;
break;提取方法:
private static String levelString(int i, TypeOfC c){
return "Level " + i + (c.achievedFloor <= i ? " @gre@(Achieved)" : " @red@(Not achieved)");
}您还应该考虑更改sendOption5的参数,以只获得c和两个定义值整数的整数from to。
您可以将c.dialogueAction = xxxx;行移到switch后面,并分配用于switch的值。
发布于 2014-03-08 11:54:38
这里有两组重复代码。干燥的标准解决方案(不要重复自己)是函数提取。
考虑两项职能:
private static String levelAchievedOption(int level, int achieved) {
return String.format("Level %d @%s", level,
achieved >= level ? "gre@(Achieved)" : "red@(Not Achieved)");
}然后,设置选项的第二个函数:
private static void setLevelOptions(int levela, int levelb, int levelc, int leveld, String postfix, int levelAchieved) {
sendOption5(
levela >= 0 ? levelAchievedOption(levela, levelAchieved) : "",
levelb >= 0 ? levelAchievedOption(levelb, levelAchieved) : "",
levelc >= 0 ? levelAchievedOption(levelc, levelAchieved) : "",
leveld >= 0 ? levelAchievedOption(leveld, levelAchieved) : "",
postfix);
}然后,您的case语句可以变成:
case 1213:
setLevelOptions(1, 2, 3, 4, "More", c.achievedFloor);
c.dialogueAction = 1213;
break;
case 1214:
setLevelOptions(5, 6, 7, 8, "More", c.achievedFloor);
c.dialogueAction = 1214;
break;
case 1215:
setLevelOptions(9, 10, 11, -1, "Choose Floor", c.achievedFloor);
c.dialogueAction = 1215;
break;发布于 2014-03-08 10:29:25
谷歌的一名员工(https://www.youtube.com/watch?v=4F72VULWFvc)对此有很好的讨论。事实上,使用继承可以避免这种情况。您可以为一个抽象类创建3个不同的实现,它们都有一个方法sendOption5(),您可以使用一个案例来选择其中的一个。更好的方法是创建一个抽象类(或接口),如
interface Option
{
public void sendOptions();
public boolean haveToBeCalled(Integer number);
}如果某个值为haveToBeCalled,则返回true,否则为false。因此,如果您有一个“选项”列表,您可以将其用作
for (Option o : options)
{
if (o.haveToBeCalled(number))
{
o.sendOptions();
}
}无论如何,这取决于您的代码的其余部分。通常可以通过重构代码的一部分来改进您的方案。
https://codereview.stackexchange.com/questions/43783
复制相似问题