2

I'm writing a program where a user can input something like

add 5 2

or

define foo

Right now the only way I know to handle this input is a bunch of if/else if statements, ie

if(args[0] == "add") add();
else if (args[0] == "define") define();
else print("Command not found.");

Is there a better way to do this, or maybe some sort of data structure/algorithm that's standard for these types of inputs? I'm using Java specifically, but I'd prefer a language-agnostic answer if possible. Thanks!

4

4 回答 4

3

您可以使用以下switch语句:

switch (args[0]) {
    case "add":
        // do your adding stuff
        break;
    case "define":
        // do your defining stuff
        break;
    default:
        // command not found
}

switch是大多数语言的共同特征(某些语言使用不同的语法,例如 Ruby 使用case/when代替switch/case)。它只适用于String从 Java 1.7 开始的 s。

此外,某些语言Dictionary在变量中有 s 和函数,因此例如在 Ruby 中,您可以这样做:

myDictionary = { "add" => someFunctionToAddStuff,
                 "define" => anotherFunction }
myDictionary["define"] # returns anotherFunction
于 2013-05-12T20:47:15.160 回答
3

设计模式命令可用于此目标。例如:

abstract class Command {
    abstract public String getCommandName();
    abstract public String doAction();
}

要定义您自己的函数,只需实现Command类:

class AddCommand extends Command {
    @Override
    public String getCommandName() {
        return "add";
    }

    @Override
    public String doAction() {
        // do your action
    }
}

那么你的主类应该是这样的:

public class Main {

    private static Map<String, Command> commands = new HashMap<String, Command>();

    private static void init() {
        Command addCommand = new AddCommand();
        commands.put(addCommand.getCommandName(), addCommand);
    }

    public static void main (String[] args) {
        init();
        if (args[0] != null) {
            Command command = commands.get(args[0]);
            if (command != null) {
                System.out.println(command.doAction());
            } else {
                System.out.println("Command not found");
            }
        }
    }
于 2013-05-12T20:59:55.747 回答
2

我在这里做了一个(错误的)假设,即您根据您使用的方式询问命令行参数args。但我可能错了。让我知道:

有一种更好的方法可以做到这一点,但您可能必须更改输入的写入方式。事实上,有很多图书馆可以做到这一点。这里提到了一些:How to parse command line arguments in Java? 以下是一些选项,为方便起见内联:

于 2013-05-12T20:47:24.877 回答
1

根据您输入的复杂程度,您可以使用使用命令和/或解释器模式的手工解决方案,也可以使用免费的XText框架。

如果您的语法不太复杂,但程序输入符合 DSL(域特定语言),解释器设计模式非常有用在您的情况下,输入add 5 2define foo看起来像是更大语法的一部分。如果是这样,请使用Interpreter。但是,如果语法很复杂,那么最好的方法是像XText这样的 DSL 生成库

如果您想解析命令行参数,您应该尝试Apache Commons CLI library

然而,当谈到 Java 时,还有一个值得检查的库 - Cliche。它的主要优点是极其简单注释驱动的模型。请在下面找到一个示例:

// Cliche usage example
public class Calculator {
    @Command
    public void define(String variable) { ... }

    @Command
    public int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) throws IOException {
        ShellFactory
          .createConsoleShell("my-prompt", "", new Calculator())
          .commandLoop();
    }
}
于 2013-10-13T07:45:45.357 回答