簡體   English   中英

處理命令行參數時清理控制流[C#]

[英]Cleaning up control flow when dealing wtih command line arguments [C#]

我正在處理一個程序,該程序根據命令行參數執行大量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)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 */
}

保持您的方法盡可能簡單並分解更長時間,將算法混淆到不同的方法調用中,通過它們的名稱,可以清楚地表明它們正在做什么。

我傾向於在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更快。它也更具可讀性。

如果你已經回來了,你不需要else 這可能會削減很多你的築巢。 您也可以嘗試使用開關而不是一堆嵌套ifs。

我很久以前從這個Code Project文章中獲取代碼,並將自己的版本用於命令行應用程序。 我對它進行了自己的修改,比如讓類繼承自Dictionary等。但是代碼的正則表達式部分非常好,並使這些命令行開關變得簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM