2

ユーザーが次のようなものを入力できるプログラムを書いています

add 5 2

また

define foo

今のところ、この入力を処理する唯一の方法は、一連の if/else if ステートメントです。

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

これを行うためのより良い方法はありますか、またはこれらのタイプの入力の標準であるある種のデータ構造/アルゴリズムはありますか? 特にJavaを使用していますが、可能であれば言語にとらわれない回答を希望します。ありがとう!

4

4 に答える 4

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 に答える
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 以降でのみ動作します。

また、一部の言語Dictionaryでは変数に s と関数が含まれているため、たとえば Ruby では次のようにすることができます。

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

入力の複雑さに応じて、コマンドインタープリターパターンを使用した手作りのソリューションを使用するか、無料の XTextフレームワークを使用できます。

インタープリターのデザイン パターンは、文法がそれほど複雑でなくても、プログラムの入力が DSL (ドメイン固有言語) に準拠している場合に非常に役立ちますあなたの場合、入力add 5 2define fooはより大きな文法の一部のように見えます。その場合は、 Interpreterを使用してください。ただし、文法が複雑な場合は、 XTextなどの DSL-generation-library を利用するのが最善の方法です。

コマンドライン引数を解析したい場合は、Apache Commons CLI ライブラリを試してみてください。

ただし、Java に関して言えば、チェックする価値のあるライブラリがもう 1 つあります。 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 に答える