2009-06-21 11 views
2

私はサードパーティのアプリケーションにコマンドラインコマンドを送るアプリケーションを書いています。OOPで文字列の集合を整理するにはどうすればよいですか?

だから私は次のようにコマンドのリストを持っている:私は最高のOOPスタイルでそれらを整理する方法がわからない

"process images" 
"apply effect blur" 
"save as png" 
... 

今私が持っている:

switch (e.KeyCode) 
{ 
    case Keys.A: 
     SendCommand ("process images"); 
     break; 
    case Keys.B: 
     SendCommand ("apply effect blur"); 
     break; 
    case Keys.C: 
     SendCommand ("save as png"); 
     break; 
     ... 
} 

は私がきれいな方法でこれを行うことができるようにしたいです。たぶんのような:

SendCommand (Commands.ApplyBlur)など

しかし、私は最適な方法を知りません。私はこれらをコレクションに保存することを考えましたが、それがはっきりしないか、または合理的ではないと考えました。

答えて

3

を書くことができます。最も簡単な解決策は、キーとコマンドテキストの間に直接マッピングすることです。列挙型の値を入力キーから、コマンドテキストに列挙値から -

Dictionary<ConsoleKey, String> map = new Dictionary<ConsoleKey, String>() 
{ 
    { ConsoleKey.A, "process image" }, 
    { ConsoleKey.B, "apply blur effect" }, 
    { ConsoleKey.C, "save as png" } 
}; 

ConsoleKey key = Console.ReadKey().Key; 

String command; 
if (map.TryGetValue(key, out command)) 
{ 
    SendCommand(command); 
} 
else 
{ 
    HandleInvalidInput(); 
} 

は、実際のニーズに応じて、2段階のマッピングを実行するためのクリーナー解決策かもしれません。また、コマンドクラスの作成とコマンド用の静的インスタンスの提供について考える必要があります。

public class Command 
{ 
    public Command(String commandText) 
    { 
     this.CommandText = commandText; 
    } 

    public String CommandText { get; private set; } 

    public void Send() 
    { 
     // Dummy implementation. 
     Console.WriteLine(this.CommandText); 
    } 

    // Static command instances. 
    public static readonly Command ProcessImage = new Command("process image"); 
    public static readonly Command BlurImage = new Command("apply blur effect"); 
    public static readonly Command SaveImagePng = new Command("save as png"); 
} 

このクラスでは、コマンドを送信するコードは次のようになります。

Dictionary<ConsoleKey, Command> map = new Dictionary<ConsoleKey, Command>() 
{ 
    { ConsoleKey.A, Command.ProcessImage }, 
    { ConsoleKey.B, Command.BlurImage}, 
    { ConsoleKey.C, Command.SaveImagePng } 
}; 

ConsoleKey key = Console.ReadKey().Key; 

Command command; 
if (map.TryGetValue(key, out command)) 
{ 
    command.Send(); 
} 
else 
{ 
    HandleInvalidInput(); 
} 
+0

非常に良い答えです。 –

2

私はちょうどデザインパターンを理解し始めていますが、これはCommand Patternには完璧なようです。

1

Command patternを使用すると、各コマンドを独自のクラスに入れることができます。これにより、プログラム内の複数の場所からコマンドにアクセスできるようになり、何かをするたびにコードを書き換えたり、コピーして貼り付けたりする必要がなくなります。

+0

ありがとうございますが、コマンドは単なる文字列ですが、それぞれ別々のクラスを作成するのは意味がありますか? –

+0

同じファイルに入れることができます。コマンドパターンは実際にはより複雑なコマンド用に設計されていますが、あなたのニーズに最も適しているようです。 – mnuzzo

2

私の前提ですが、サードパーティ製のアプリケーションは有限で静的なコマンドスイッチを持っていますので、それらをアプリに委ねるだけでスイッチのセットを邪魔することはありません。

私はこれらの仮定が正しいとすれば、コマンドパターンは過剰です、私はちょうど静的なプロパティまたは定数として文字列を公開し、静的な送信を含む静的なコマンドクラスを作成する傾向があると思うコマンドメソッド。

あなたが示唆したように、あなたは単に私が入力とコマンドの間にマッピングするために辞書を使用することをお勧め...

Command.SendCommand(Command.ProcessImages); 
+0

あなたの前提は正しいです。 –

0

あなたがあなたのコマンドクラスを使用しますので、他のプログラマが送信するための正確なテキストコマンドを知っている必要はありません列挙型にコマンド名入れすることが有益であり得る、彼らはちょうど使用してセットからそれを選択することができますVisual Studioでオートコンプリート

public enum CommandType 
{   
    ApplyBlur, 
    ProcessImage, 
    Save 
} 
関連する問題