تنظيف تدفق التحكم عند التعامل مع وسيطات سطر أوامر WTIH [C#

StackOverflow https://stackoverflow.com/questions/2282428

سؤال

أنا أتعامل مع برنامج يقوم بالكثير من ... المتفرعة الأخرى بناءً على وسيطات سطر الأوامر. هذا في 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
                        )
                    {

كما يمكنك أن تقول ، إنها نوع من الفوضى. هل هناك نمط تصميم أو اثنتين من شأنه أن يكون أكثر قابلية للتطبيق على تنظيف الأشياء؟ نمط القيادة ، ربما؟ شكرا على النصيحة والنصائح.

هل كانت مفيدة؟

المحلول

أنا جزء من استخدام عبارات التبديل على صفيف الوسائط وإعداد خصائص في فئة التكوين من نوع ما لكل وسيطة متوقعة. يبدو أنك تتوقع سلسلة وسيطة منسقة تمامًا بدلاً من السماح بقيم تعيين ، يمكنك المحاولة:

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 المتداخلة.

أخذت الرمز من مقالة مشروع الرمز هذا منذ وقت طويل وجعلت نسختي الخاصة منه لاستخدامها في تطبيقات سطر الأوامر. لقد قمت بإجراء تعديلات خاصة بي ، مثل جعل الفصل يرث من القاموس ، وما إلى ذلك. لكن جزء regex من الكود جيد جدًا ، ويجعل هذا النوع من مفاتيح سطر الأوامر سهلاً مثل الفطيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top