شعار ConstructiCat
CodeBust.
تصفح القسم ▾

استبدال الشرط المتداخل بعبارات الحماية.

المشكلة

لديك مجموعة من الجمل الشرطية المتداخلة ويصعب تحديد التدفق الطبيعي لتنفيذ الكود.

الحل

اعزل جميع الفحوصات الخاصة والحالات الاستثنائية في عبارات منفصلة وضعها قبل الفحوصات الرئيسية. من الناحية المثالية، يجب أن تحصل على قائمة "مسطحة" من الشروط، واحدًا تلو الآخر.

##مثال

قبل
public double getPayAmount() {
  double result;
  if (isDead){
    result = deadAmount();
  }
  else {
    if (isSeparated){
      result = separatedAmount();
    }
    else {
      if (isRetired){
        result = retiredAmount();
      }
      else{
        result = normalPayAmount();
      }
    }
  }
  return result;
}
بعد
public double getPayAmount() {
  if (isDead){
    return deadAmount();
  }
  if (isSeparated){
    return separatedAmount();
  }
  if (isRetired){
    return retiredAmount();
  }
  return normalPayAmount();
}

##لماذا نعيد الهيكلة

من السهل جدًا اكتشاف "الشرط المتداخل الجحيمي". تشكل المسافات البادئة لكل مستوى من مستويات التداخل سهمًا يشير إلى اليمين في اتجاه الألم والمشاكل:

if () {
    if () {
        do {
            if () {
                if () {
                    if () {
                        ...
                    }
                }
                ...
            }
            ...
        }
        while ();
        ...
    }
    else {
        ...
    }
}

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

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

##كيفية إعادة الهيكلة

حاول تخليص الكود من الآثار الجانبية (side effects) - قد يكون من المفيد استخدام تقنية فصل الاستعلام عن التعديل (Separate Query from Modifier) لهذا الغرض. سيكون هذا الحل ضروريًا لإعادة الترتيب الموصوفة أدناه.

  1. اعزل جميع عبارات الحماية (guard clauses) التي تؤدي إلى استدعاء استثناء أو إرجاع قيمة فورية من الدالة. ضع هذه الشروط في بداية الدالة.

  2. بعد اكتمال إعادة الترتيب واجتياز جميع الاختبارات بنجاح، تحقق مما إذا كان بإمكانك استخدام تقنية دمج التعبير الشرطي (Consolidate Conditional Expression) لعبارات الحماية التي تؤدي إلى نفس الاستثناءات أو القيم المرتجعة.