コマンドと処理を処理するアプリケーションがある場合、現在使用している switch case ステートメントが長いため、適切な設計パターンを使用する必要がありますか?
switch(command)
{
case ACK : // process(); break;
case NAK : // process(); break;
case POLL: // process(); break;
...
}
コマンドと処理を処理するアプリケーションがある場合、現在使用している switch case ステートメントが長いため、適切な設計パターンを使用する必要がありますか?
switch(command)
{
case ACK : // process(); break;
case NAK : // process(); break;
case POLL: // process(); break;
...
}
あなたは間違いなくここでいくつかのことをすることができます. コマンドを値に結び付けるのと同じくらい簡単な場合は、単純なを使用してDictionary
、コマンドが実行するデリゲートにコマンド名を結び付けることができます。
private static IDictionary<string, Action> _actionsByCommand;
static MyClass() {
_actionsByCommand[ACK] = Acknowledge;
_actionsByCommand[POLL] = Poll;
}
private static void Acknowledge() { }
private static void Poll() { }
static void Main() {
string command = ...;
_actionsByCommand[command]();
}
または、デリゲートの代わりに、共有の基本クラスまたはインターフェイスを使用して各コマンドのクラスを定義し、Go
実行する何らかのメソッドを持つことができます。これにより、後で必要になった場合に、各コマンドに追加のプロパティまたは値を関連付けることができるという利点があります。
同じシグネチャを持つ 3 つのメソッドがあるとします。
public Func<string, int> Ack = (i) => return 1;
public Func<string, int> Nack= (i) => return 1;
public Func<string, int> Poll = (i) => return 1;
caseステートメントなしでそれらを呼び出したいとします。
public int Call(string commandName)
{
//Find method
var method = this.GetType().GetFields().First(x=>x.Name == commandName);
if (method == null) return null;
//Convert it to Func
var m = (Func<string, int>) method.GetValue(this);
return m.Invoke("");
}
のように使います。
new MethodRunner().Call("Ack");