我正在处理一个基于命令行参数执行大量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
)
{
你可以说,这有点乱。有哪些设计模式最适合清理某些设计模式?命令模式,也许?感谢您的建议和提示。
答案 0 :(得分:4)
停止嵌套。
你可以切换像(+)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 */
}
让您的方法尽可能简单并且分解时间更长,将算法混淆到不同的方法调用中,通过它们的名称,可以清楚地表明它们正在做什么。
答案 1 :(得分: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> gt;更快0&amp;&amp; args.Length&lt;它也更具可读性。
答案 2 :(得分:1)
如果您已经退回,则不需要else
。这可能会削减很多你的筑巢。您也可以尝试使用开关而不是一堆嵌套ifs。
答案 3 :(得分:1)
我很久以前就使用了the code from this Code Project article并将自己的版本用于命令行应用程序。我对它进行了自己的修改,比如让类继承自Dictionary,等等。但代码的正则表达式部分非常好,并使这些命令行开关变得简单。