我处理的程序,做大量的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
                        )
                    {

所以你可以说,这是怎样的一个烂摊子。有没有这将是最适用的清洁朝事了一些设计模式还是两个? Command模式,也许?谢谢你的建议和提示。

有帮助吗?

解决方案

我偏爱使用的参数阵列上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的。

我把从这个代码项目文章的代码的很久以前搞得我自己的版本,为命令行应用程序。我做了我自己修改它,就像制作类从字典等继承,但代码的正则表达式部分非常好,使得这些类型的命令行开关易如反掌。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top