在这种情况下有什么办法可以避免条件结构吗?
Is there any way to avoid a conditional structure in this case?
我开始设计一个 Android 应用程序,我需要在其中持续侦听新命令并根据收到的命令执行不同的操作。
那么让我们看一个我希望尽可能避免的例子:
Public void onCommandReceived(String command)
{
Switch (command)
{
Case A:
DoActionA();
break;
...
Case Z:
DoActionZ();
break;
}
}
编辑:
我会收到一个很长的字符串,我必须解析该字符串才能获取命令。
这个问题有更好的实现吗?
非常感谢
可能这就是您要找的东西
case 1:
case 2:
case 3:
doSomthing();
break;
case 4:
doAnother();
break;
这会起作用,因为案例 1 和案例 2 没有 break 语句,将落入案例三。
在某些时候,您需要有一个类似于您的 switch (command)
示例的结构,至少为了将用户输入或程序事件转换为命令,而不起眼的 switch 语句是这种逻辑的不错选择。有替代方案,但 switch 语句很清楚,每个人都立即知道它的含义。
这里有一些备选方案,根据您的设计细节可能会有用:
决定table
您可以 pre-populate 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
界面以及实现每个操作的各个 classes。
虚拟调度
如果像上面那样为每个操作创建一个单独的 class 适合您的设计,那么不要将 "dumb" 命令传递给您的函数,而是传递一个接口实例。这与上面的决定 table 完全一样,除了 Command
是带有接口和 subclass 的那个——你不需要做转换,因为 command/action subclass 已经为您提供了该逻辑,例如:
interface Command {
void action();
}
class CommandA {
@Override
void action() {
// do something
}
}
...
Public void onCommandReceived(Command command)
{
command.action();
}
如果您需要在代码中的多个点根据哪个命令做出不同的决定,您甚至可能想要像双重分派这样花哨的东西,我不会去进入这里。
切换
但是,如果这是您的代码中唯一根据命令类型做出决定的步骤,那么 switch
语句既不聪明也不棘手,这恰恰是你想在 6 个月后查看的代码 - 你和其他人都会完全理解它,并且不应低估它的价值。
我开始设计一个 Android 应用程序,我需要在其中持续侦听新命令并根据收到的命令执行不同的操作。
那么让我们看一个我希望尽可能避免的例子:
Public void onCommandReceived(String command)
{
Switch (command)
{
Case A:
DoActionA();
break;
...
Case Z:
DoActionZ();
break;
}
}
编辑:
我会收到一个很长的字符串,我必须解析该字符串才能获取命令。
这个问题有更好的实现吗?
非常感谢
可能这就是您要找的东西
case 1:
case 2:
case 3:
doSomthing();
break;
case 4:
doAnother();
break;
这会起作用,因为案例 1 和案例 2 没有 break 语句,将落入案例三。
在某些时候,您需要有一个类似于您的 switch (command)
示例的结构,至少为了将用户输入或程序事件转换为命令,而不起眼的 switch 语句是这种逻辑的不错选择。有替代方案,但 switch 语句很清楚,每个人都立即知道它的含义。
这里有一些备选方案,根据您的设计细节可能会有用:
决定table
您可以 pre-populate 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
界面以及实现每个操作的各个 classes。
虚拟调度
如果像上面那样为每个操作创建一个单独的 class 适合您的设计,那么不要将 "dumb" 命令传递给您的函数,而是传递一个接口实例。这与上面的决定 table 完全一样,除了 Command
是带有接口和 subclass 的那个——你不需要做转换,因为 command/action subclass 已经为您提供了该逻辑,例如:
interface Command {
void action();
}
class CommandA {
@Override
void action() {
// do something
}
}
...
Public void onCommandReceived(Command command)
{
command.action();
}
如果您需要在代码中的多个点根据哪个命令做出不同的决定,您甚至可能想要像双重分派这样花哨的东西,我不会去进入这里。
切换
但是,如果这是您的代码中唯一根据命令类型做出决定的步骤,那么 switch
语句既不聪明也不棘手,这恰恰是你想在 6 个月后查看的代码 - 你和其他人都会完全理解它,并且不应低估它的价值。