1

login、などのコマンドを記述できるコンソールに基づいて、単純な対話型シェルを作成したいと考えていますhelp

私は最初に列挙型を使用することを考えましたが、その後、if-else ステートメントを大量に使用せずに列挙型を適切に実装する方法がわからなかったため、配列アプローチを採用することにし、これを思いつきました。

public class Parser {
    private static String[] opts = new String[] {"opt0", "opt1", "opt2", "opt3" ... }

    public void parse(String text) {
        for(int i = 0; i < opts.length; i++) {
            if(text.matches(opts[i]) {
                switch(i) {
                    case 0:
                        // Do something

                    case 1:
                        // Do something-something

                    case 2:
                        // Do something else
                }

             return;
            }
        }
    }
}

しかし、これはおそらくこのようなことを行うための最も初歩的な方法であり、オプションの順序を変更したい場合に問題が発生することがわかりました。より単純なパーサーを作成するにはどうすればよいですか? このように機能しますが、問題もありました。プログラムの使用は純粋に教育的なものであり、深刻なことを意図したものではありません。

4

2 に答える 2

1

簡単な方法はHashMap、キーをコマンド テキストと等しくし、値をこのコマンドを処理するクラスのインスタンスにすることです。コマンド ハンドラ クラスが引数を取らないと仮定すると (ただし、これは簡単に拡張できます)、単にRunnableインスタンスを使用できます。

コード例:

Runnable helpHandler = new Runnable() {
    public void run(){
       // handle the command
    } 
}

// Define all your command handlers

HashMap<String, Runnable> commandsMap = new HashMap<>(); // Java 7 syntax

commandsMap.put("help",helpHandler);
// Add all your command handlers instances

String cmd; // read the user input
Runnable handler;
if((handler = commandsMap.get(cmd)) != null) {
  handler.run();
}

独自のインターフェイスを実装してサブクラス化することで、このアプローチを簡単に拡張して引数を受け入れることができます。variable argumentsデータ型がわかっている場合に使用すると便利です。void execute(String ... args)

于 2013-03-01T23:44:33.943 に答える
0

頭に浮かぶ解決策の 1 つは、実際にデザイン パターンを使用することです。Factory クラスの識別子として、ユーザーからの入力を使用できます。

このファクトリ クラスは、入力に基づいて「execute」メソッドでオブジェクトを生成します。これをCommand オブジェクトと呼びます。

次に、ファクトリから返されたオブジェクトのメソッドを呼び出すだけです。

switch ステートメントは必要ありません。オブジェクトが null の場合、ユーザーが無効なオプションを入力したことがわかり、入力パーサーから決定ロジックが抽象化されます。

うまくいけば、これは役に立ちます:)

于 2013-03-01T23:09:13.843 に答える