4

コマンドライン引数に基づいて if...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
                        )
                    {

ご覧のとおり、それは一種の混乱です。クリーンアップに最も適した設計パターンが 1 つか 2 つあるでしょうか。おそらくコマンドパターン?アドバイスとヒントをありがとう。

4

4 に答える 4

4

ネスティングを停止します。

(+1) Joel が言ったように切り替えることも、ロジックを明確なメソッド呼び出しに分割することもできます。

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 */
}

メソッドをできるだけ単純に保ち、長くて混乱を招くアルゴリズムを個別のメソッド呼び出しに分割します。これらの名前によって、何をしているかが明確に示されます。

于 2010-02-17T16:51:30.997 に答える
3

私は、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よりも高速です。また、もう少し読みやすくなっています。

于 2010-02-17T16:38:57.857 に答える
1

elseすでに帰国している場合は必要ありません。それはあなたの巣の多くを切り取るかもしれません. ネストされた一連の if の代わりに、スイッチを使用することもできます。

于 2010-02-17T16:37:14.507 に答える