首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缩短此代码或使其更有效?

如何缩短此代码或使其更有效?
EN

Code Review用户
提问于 2014-03-08 10:18:55
回答 4查看 3K关注 0票数 4

如何缩短这段代码?我知道有一种方法可以缩短这类代码,但我还不知道自己是如何做到的。有谁能帮帮我呢?

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

回答 4

Code Review用户

发布于 2014-03-08 10:51:53

在第一步中,我将提取一个生成字符串的方法。

修改后的代码:

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

提取方法:

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

票数 8
EN

Code Review用户

发布于 2014-03-08 11:54:38

这里有两组重复代码。干燥的标准解决方案(不要重复自己)是函数提取。

考虑两项职能:

代码语言:javascript
复制
private static String levelAchievedOption(int level, int achieved) {
    return String.format("Level %d @%s", level,
         achieved >= level ? "gre@(Achieved)" : "red@(Not Achieved)");
}

然后,设置选项的第二个函数:

代码语言:javascript
复制
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语句可以变成:

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

Code Review用户

发布于 2014-03-08 10:29:25

谷歌的一名员工(https://www.youtube.com/watch?v=4F72VULWFvc)对此有很好的讨论。事实上,使用继承可以避免这种情况。您可以为一个抽象类创建3个不同的实现,它们都有一个方法sendOption5(),您可以使用一个案例来选择其中的一个。更好的方法是创建一个抽象类(或接口),如

代码语言:javascript
复制
interface Option
{
  public void sendOptions();
  public boolean haveToBeCalled(Integer number);
}

如果某个值为haveToBeCalled,则返回true,否则为false。因此,如果您有一个“选项”列表,您可以将其用作

代码语言:javascript
复制
for (Option o : options)
{
  if (o.haveToBeCalled(number))
  {
    o.sendOptions();
  }
}

无论如何,这取决于您的代码的其余部分。通常可以通过重构代码的一部分来改进您的方案。

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

https://codereview.stackexchange.com/questions/43783

复制
相关文章

相似问题

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