コマンドライン引数[C#]を扱う際の制御フローのクリーンアップ
-
21-09-2019 - |
質問
私は、コマンドライン引数に基づいた場合の多くを行うプログラム... ELSE分岐を扱っています。
:これは、C#であるが、私は確信してそれのJavaに適用される、C ++などだここで一般的なアウトラインですif (args.Length == 0)
{
//do something
}
if (args.Length > 0 && args.Length < 2)
{
Console.WriteLine("Only one argument specified. Need two arguments");
return 0;
}
else if (args.Length > 0 && args.Length >= 2)
{
//Process file - Argument 1
if(args[0].Trim() == PROCESS_OPTION_ONE
|| args[0].Trim() == PROCESS_OPTION_TWO)
{
//Process file - Argument 2
if(args[1].Trim() == PROCESS_CUSTOMER
|| args[1].Trim() == PROCESS_ADMIN
|| args[1].Trim() == PROCESS_MEMBER
|| args[1].Trim() == PROCESS_GUEST
|| args[1].Trim() == PROCESS_USER
)
{
あなたは、混乱のそれのようなものを伝えることができるように。いくつかのアップ物事を掃除に向けた最も適用可能でデザインパターンや2はありますか? Commandパターン、おそらく?アドバイスやヒントをお寄せいただきありがとうございます。
解決
私はarguments配列にswitch文を使用して、各予想される引数のためにいくつかの種類の構成クラスのプロパティを設定する部分です。それはあなたが設定値を許可するのではなく、非常に具体的にフォーマットされた引数文字列を期待している表示され、あなたが試みることができる:
if(args[0].Trim() == PROCESS_OPTION_ONE || args[0].Trim() == PROCESS_OPTION_TWO)
{
//Process file - Argument 2
switch(args[1].Trim()
{
case PROCESS_CUSTOMER, PROCESS_ADMIN, PROCESS_MEMBER, PROCESS_GUEST, PROCESS_USER:
// Do stuff
break;
default:
// Do other stuff
break;
}
}
私の好ましい方法は、
のようなものになるだろうforeach(string arg in args)
{
switch(arg)
{
case PROCESS_CUSTOMER:
// Set property
break;
...
default:
// Exception?
break;
}
}
注:args.Length == 1が速くargs.Length> 0 && args.Length <。2.また、もう少し読みやすいです。
より他のヒント
停止ネスティング。
あなたは(1)ジョエルが言ったように切り替えることができ、またはあなただけの明確なメソッド呼び出しにあなたのロジックを破ることができます。
if(args.Length <= 1)
{
Console.WriteLine("Need 2 args kthx");
return;
}
if(args.Length > 2)
{
Console.WriteLine("More than 2 args don't know what do");
return;
}
var arg1 = args[0].Trim();
var arg2 = args[1].Trim();
switch(arg1)
{
case PROCESS_OPTION_ONE:
ProcessOptionOne(arg2);
break;
case PROCESS_OPTION_TWO:
ProcessOptionTwo(arg2);
break;
default:
Console.WriteLine("First arg unknown I give up");
return;
}
そして、あなたのプロセスの方法で...
private static void ProcessOptionTwo(string argumentTwo)
{
if(argumentTwo == PROCESS_CUSTOMER ||
argumentTwo == PROCESS_ADMIN ||
/* etc blah blah */
}
、彼らの名によって、彼らが何をしているかの明確な指示を与える明確なメソッド呼び出しにアルゴリズムを混乱させ、できるだけ簡単にあなたの方法を保ち、長く別れるます。
あなたはelse
は必要ありません。それはあなたのネスティングの多くを切り取ることがあります。また、スイッチの代わりに、ネストされたIFSの束を使用して試みることができます。
私が取ったこのコードプロジェクトの記事からのコードは長い時間前にをコマンドラインアプリケーションに使用することの私の自身のバージョンを作りました。私はなど、辞書からクラスを継承を作るように、それを自分自身の修正をした。しかし、コードの正規表現の部分は非常に良いですが、コマンドラインのこれらの並べ替えがパイとして簡単に切り替わります。