Frage

Ich bin mit einem Programm zu tun, die viel tut, wenn ... sonst auf Befehlszeilenargumente basierend Verzweigung. Dies ist in C #, aber ich bin sicher, es ist für Java, C ++ usw. Hier ist die allgemeine Übersicht:

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
                        )
                    {

So wie Sie sagen können, es ist irgendwie ein Chaos. Gibt es ein Entwurfsmuster oder zwei, die am besten anwendbar zu reinigen Dinge einige sein würde? Befehlsmuster, vielleicht? Danke für die Hinweise und Tipps.

War es hilfreich?

Lösung

Ich bin Teil-switch-Anweisungen auf den Argumenten Array zu verwenden und für jedes erwartetes Argument Eigenschaften in einer Konfigurationsklasse irgendeine Art einstellen. Es scheint, dass Sie einen sehr speziell formatierte Argument Zeichenfolge erwar anstatt eingestellten Werte erlaubt, könnten Sie versuchen:

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;
    }
}

Meine bevorzugte Methode wäre so etwas wie

foreach(string arg in args)
{
    switch(arg)
    {
        case PROCESS_CUSTOMER:
            // Set property
            break;
        ...
        default:
            // Exception?
            break;
    }
}

Hinweis: args.length == 1 ist schneller als args.length> 0 && args.length <2. Es ist auch ein wenig mehr lesbar

Andere Tipps

Stop Verschachtelung.

Sie können wie Schalter (+1) Joel sagte, oder Sie können einfach Ihre Logik in klare Methodenaufrufe brechen.

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;
}

dann in Ihrem Prozess Methode ...

private static void ProcessOptionTwo(string argumentTwo)
{
  if(argumentTwo == PROCESS_CUSTOMER ||
     argumentTwo  == PROCESS_ADMIN ||
     /* etc blah blah */
}

Halten Sie Ihre Methoden so einfach wie möglich und brechen länger, verwirrende Algorithmen in verschiedene Methodenaufrufe, die durch ihren Namen, einen klaren Hinweis darauf geben, was sie tun.

Sie brauchen nicht auf die else, wenn Sie bereits zurückgegeben haben. Das könnte eine Menge Ihrer Verschachtelung ausgeschnitten. Sie könnten auch versuchen, einen Schalter anstelle einer Reihe von verschachtelten ifs verwenden.

Ich habe den Code aus diesem Code Project Artikel eine lange Zeit vor und machte meine eigene Version davon Gebrauch für Kommandozeilen-Applikationen. Ich habe meine eigenen Modifikationen, um es, wie die Klasse vererben Wörterbuch machen usw. Aber der regex Teil des Codes ist sehr gut, und macht diese Art von Befehlszeilenoptionen leicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top