استبدال الشرط المتداخل بعبارات الحماية.
لديك مجموعة من الجمل الشرطية المتداخلة ويصعب تحديد التدفق الطبيعي لتنفيذ الكود.
اعزل جميع الفحوصات الخاصة والحالات الاستثنائية في عبارات منفصلة وضعها قبل الفحوصات الرئيسية. من الناحية المثالية، يجب أن تحصل على قائمة "مسطحة" من الشروط، واحدًا تلو الآخر.
##Example
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();
}##Why Refactor
من السهل جدًا اكتشاف "الشرط المتداخل الجحيمي". تشكل المسافات البادئة لكل مستوى من مستويات التداخل سهمًا يشير إلى اليمين في اتجاه الألم والمشاكل:
if () {
if () {
do {
if () {
if () {
if () {
...
}
}
...
}
...
}
while ();
...
}
else {
...
}
}
من الصعب معرفة ما يفعله كل شرط وكيف، لأن التدفق "الطبيعي" لتنفيذ الكود ليس واضحًا على الفور. تشير هذه الشروط إلى تطور فوضوي، حيث تمت إضافة كل شرط كإجراء مؤقت دون أي تفكير في تحسين الهيكل العام.
لتبسيط الموقف، اعزل الحالات الخاصة في شروط منفصلة تنهي التنفيذ فورًا وتعيد قيمة فارغة إذا كانت عبارات الحماية صحيحة. في الواقع، مهمتك هنا هي جعل الهيكل مسطحًا.
##How to Refactor
حاول تخليص الكود من الآثار الجانبية (side effects) - قد يكون من المفيد استخدام تقنية فصل الاستعلام عن التعديل (Separate Query from Modifier) لهذا الغرض. سيكون هذا الحل ضروريًا لإعادة الترتيب الموصوفة أدناه.
-
اعزل جميع عبارات الحماية (guard clauses) التي تؤدي إلى استدعاء استثناء أو إرجاع قيمة فورية من الدالة. ضع هذه الشروط في بداية الدالة.
-
بعد اكتمال إعادة الترتيب واجتياز جميع الاختبارات بنجاح، تحقق مما إذا كان بإمكانك استخدام تقنية دمج التعبير الشرطي (Consolidate Conditional Expression) لعبارات الحماية التي تؤدي إلى نفس الاستثناءات أو القيم المرتجعة.