在这种情况下,有没有办法避免条件结构?

时间:2018-03-15 22:28:17

标签: android conditional

我开始设计一个Android应用程序,我需要不断监听新命令,并根据收到的命令执行不同的操作。

所以让我们看一个我想尽可能避免的例子:

Public void onCommandReceived(String command)
{
     Switch (command)
     {
        Case A:
            DoActionA();
            break;

        ...

        Case Z:
            DoActionZ();
            break;
     }
}

编辑:

我将收到一个长字符串,我将不得不解析字符串以获取命令。

这个问题有没有更好的实现?

非常感谢

2 个答案:

答案 0 :(得分:0)

在某些时候,你需要有一个类似switch (command)示例的结构,至少为了将用户输入或程序事件转换为命令,而简单的switch语句是这个逻辑的一个很好的选择。还有其他选择,但是switch语句很清楚,每个人都知道它的含义。

以下是一些替代方案,根据您的设计细节可能会有用:

决策表

您可以预先填充Map<>或类似的命令映射到操作,如下所示:

Map<Command, Action> decisionTable = new HashMap<>();
decisionTable.put(A, new DoActionA());
decisionTable.put(B, new DoActionB());

这将在某处初始化,然后像这样调用:

Public void onCommandReceived(String command)
{
    decisionTable.get(command).action();
}

我遗漏了详细信息,例如当操作不存在时的错误处理,Action接口以及实现每个操作的各个类。

虚拟派遣

如果为每个动作创建一个单独的类,如上所述,适合您的设计,那么不要将“哑”命令传递给您的函数,而是传递一个接口实例。这与上面的决策表完全一样,除了Command是带有接口和子类的那个 - 你不需要进行切换,因为命令/动作子类已经为你提供了这个逻辑,例如:

interface Command {
    void action();
}

class CommandA {
    @Override
    void action() {
        // do something
    }
}

...

Public void onCommandReceived(Command command)
{
    command.action();
}

如果您需要根据代码中多个点的命令做出不同的决定,您甚至可能想要像双重调度那样花哨的东西,我不会在这里讨论。

切换

但是,如果这是您的代码中唯一根据命令类型做出决定的速度,那么switch语句并不聪明或棘手,这使得它恰好就是您的代码类型想要在6个月之后看一下 - 你和其他人都会完全理解它,不应低估它的价值。

答案 1 :(得分:-1)

可能这就是你要找的东西

case 1:
case 2:
case 3:
    doSomthing();
    break;
case 4:
    doAnother();
    break;

这样可行,因为案例1和案例2没有中断陈述,将落入案例三。