3

実行するコマンドを含むファイルを読み込む Java プログラムを作成しました (自分で作成した言語で)。コマンドは文字列として読み込まれ、配列に入れられます。これで、「ディスパッチャー」メソッドが配列をループして、コマンドを解釈し、それらに作用するそれぞれのメソッドを呼び出します。

もちろん、これはネストされた if ステートメントの大きなブロックにつながります。

if commandReadIn == this, do that... 
if commandReadIn is of type x, get next element,treat next element as argument... 
etc. 

今はほんの一握りのコマンドしかありませんが、何百ものコマンドを追加したい場合はどうすればよいでしょうか? コードは保守できなくなります。

今、条件付きロジックを完全に取り除くことができるかどうか疑問に思っています。とにかくある時点で文字列を解釈する必要があるため、コマンドパターンはここではあまり役に立たないようです..これは、ネストされた「if」がたくさんあることを意味します。それが不可能な場合、コマンドの追加、編集、または削除を容易にする方法でコマンドとその文法を再構築する最善の方法は何でしょうか?

4

4 に答える 4

10

コマンドにはコマンド パターンを使用します。実装を大幅に簡素化できます。

1)メソッドでCommandインターフェースを作成しますexecute
2) 各コマンドの実装を作成します。
3) プログラムを起動したら、コマンド文字列 -> コマンド実装のマップを作成します。
4) 文字列を読み込んだら、適切な実装を検索して呼び出します。
5) オプションで、executeメソッドはカスタムContextオブジェクトを引数として取り、コマンド引数を一般化された方法で渡すことができます。コンテキスト オブジェクトを理解し、そこから引数を取得するのは実装次第です。

このアプローチでは、コマンド実装のキャッシュから何かを取得できなかったかどうかを確認するためのチェックを除いて、if ステートメントはありません。

于 2012-07-25T16:19:18.907 に答える
2

アクション名をそのコマンド エグゼキュータ クラス名にマップする静的マップを作成します。アクションが指定されたコマンド エグゼキュータ インスタンスを返すファクトリ クラスを作成します。

于 2012-07-25T16:21:31.103 に答える
1

言語に一連のキーワードだけでなく、いくつかの引数/演算子などが含まれている場合も、インタープリターパターンを確認してください。

于 2012-07-25T16:21:32.400 に答える
1

Interpreter パターンを使用するのはどうですか? 次に、コマンドを解析ツリーに変更するパーサーをコーディングする必要があります。ビジターは、構文チェックやコマンドの実行などのタスクのために解析ツリーをトラバースするために使用できます。

于 2012-07-25T16:22:05.677 に答える