سؤال

فمثلا...

if ( /* Condition */ ) {

    if ( /* Condition */ ) {

        if ( /* Condition */ ) {

          // Superb!

        } else {

          // Error 3

        }

    } else {

      // Error 2

    }

} else {

  // Error 1

}

هل تعرف كيف تتجنب هذا؟ شكرًا لك!

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

المحلول

إذا كانت هذه وظيفة مكتبة ، throw قد يكون الإجراء المناسب.

if (!condition1) {
    throw "Condition 1 failed.";
}

if (!condition2) {
    throw "Condition 2 failed.";
}

if (!condition3) {
    throw "Condition 3 failed.";
}

// Superb!

قد تكون الإجراءات المقبولة الأخرى:

  • عودة 0, null, ، أو undefined.
  • عرض خطأ للمستخدم والعودة.

سيكون عليك تحديد إجراء الفشل المناسب لحالة الاستخدام الخاصة بك.

نصائح أخرى

يبدو أن لديك 3 شروط للتحقق و 4 إجراءات (3 أخطاء مختلفة + 1 نجاح). لسوء الحظ في الحالة العامة ، سيتطلب 3 شيكات مشروطة و 4 إجراءات. أعتقد أنه يمكن تنظيف الكود قليلاً باستخدام الهيكل التالي رغم ذلك

if (! /* condition 1 */ ) {
  // Error 1
} else if (! /* condition 2 */ ) { 
  // Error 2
} else if (! /* condition 3 */ ) { 
  // Error 3
} else {
  // superb
}

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

do {
    if (! /* Condition 1 */ ) {
        // Error 1
        break;
    }

    if (! /* Condition 2 */ ) {
        // Error 2
        break;
    }

    if (! /* Condition 3 */ ) {
        // Error 3
        break;
    }

    // Superb!
} while (false);

الحلقة (FALSE) التي تنفذها (FALSE) هي وسيلة لصنع كتلة يمكنك الخروج منها باللغات التي لن تتسامح مع كتلة مجهولة. يمكن أن يكون بسهولة وظيفة واستخدام الإرجاع ، أو تجربة تجرب مع استثناءات.

هل تفضل هذا؟

if ( /* Condition 1*/ && /* Condition 2*/ && /* Condition 3 */) {
  // Superb!
}
else if (! /* Condition 1*/){
  // Error 1
}
else if (! /* Condition 2*/){
  // Error 2
}
else if (! /* Condition 3*/){
  // Error 3
}
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}

if (! condition 2){
Error 2
throw someSortOfOtherException
}

if (! condition 3){
Error 3
throw another Exception
}

// Success!

اعتمادًا على الموقف ، قد يفضل الكود الخاص بك. ربما ترغب في التقاط هذه الاستثناءات في مكان ما على سبيل المثال.

if (!condition1)
    // Error 1 (and exit scope if necessary)

if (!condition2)
    // Error 2 (and exit scope if necessary)

if (!condition3)
    // Error 3 (and exit scope if necessary)

// Superb!

نعم؛ يمكنك تكوينك معًا if البيانات في عبارة مركب واحد باستخدام المشغل والمشغل ، والتعامل مع ظروف الخطأ في كتلة واحدة. اعتمادًا على احتياجات معالجة الأخطاء ، قد تحتاج مرة أخرى إلى الحصول على متعددة ifS للتأكد من أنك تتعامل بشكل صحيح مع الخطأ (يعتمد ذلك على دقة التعامل مع الأخطاء ، حقًا).

لخفة الظل:

if (CondA && CondB && CondC)
   {
   // Execute success
   }
else
   {
   if (!CondA)
      // Do error A
   else if (!CondB)
      // Do error B
   else if (!CondC)
     // Do error C
   }
}

هناك بعض الطرق ، والأبسط هو ببساطة كسر بعض الوظائف وتجريد الطبقات المختلفة (يجب أن يتم ذلك على أي حال إذا وجدت نفسك عميقًا.)

if ( /* Condition */ ) {
    value = aFunctionSaysWhat();
} else {
  // value = Error 1
}

....
value aFunctionSaysWhat(){
    if ( /* Condition */ ) {
         return aSecondFunctionHere();
    } else {
      // return Error 2
    }
}

الفرضية الأساسية هي أن الوظيفة يجب أن تعيش على طبقة واحدة من التجريد إن أمكن ، وأن تفعل شيئًا واحدًا.

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

if(ErrorCondition1){
   //Error 1
}else if(ErrorCondition2){
   //Error 2
}else if(ErrorCondition3){
   //Error 3
}else{
   //Superb
}

أخيرًا ، يمكنك تخزين تجزئة أو خريطة مع الإجابات المطلوبة وإزالة IF تمامًا ، تعتمد القدرة على تنفيذ هذا على قدرتك على تجزئة بعض النتائج:

Results = {'Result1':'Error1', 'Result2':'Error2', 'Result3':'Error3', 'Success':'Superb'}

return Results[ConditionHash(Condition)];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top