Refactoring/decompose conditional
تجزئة الشَرطيات (Decompose Conditional)
المشكلة
توجد شَرطية مُعقدة (if-then
/else
أو switch
).
الحل
فصل الأجزاء المعقدة من الشَرطية إلى توابع منفصلة: الشرط، then
و else
.
مثال
قبل إعادة التصميم
في لغة Java:
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
charge = quantity * winterRate + winterServiceCharge;
}
else {
charge = quantity * summerRate;
}
في لغة C#:
if (date < SUMMER_START || date > SUMMER_END)
{
charge = quantity * winterRate + winterServiceCharge;
}
else
{
charge = quantity * summerRate;
}
في لغة PHP:
if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
$charge = $quantity * $winterRate + $winterServiceCharge;
}
else {
$charge = $quantity * $summerRate;
}
في لغة Python:
if date.before(SUMMER_START) or date.after(SUMMER_END):
charge = quantity * winterRate + winterServiceCharge
else:
charge = quantity * summerRate
بعد إعادة التصميم
في لغة Java:
if (isSummer(date)) {
charge = summerCharge(quantity);
}
else {
charge = winterCharge(quantity);
}
في لغة C#:
if (isSummer(date))
{
charge = SummerCharge(quantity);
}
else
{
charge = WinterCharge(quantity);
}
في لغة PHP:
if (isSummer($date)) {
$charge = summerCharge($quantity);
}
else {
$charge = winterCharge($quantity);
}
في لغة Python:
if isSummer(date):
charge = summerCharge(quantity)
else:
charge = winterCharge(quantity)
لم إعادة التصميم؟
كلما كانت قطعة الشيفرة البرمجية أطول، كلما كان من الصعب فهمها. وتصبح الأمور أكثر صعوبة في الفهم عندما تمتلئ الشيفرة بالشروط:
- بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى then، تنسى ماذا كان الشرط المُرتبِط.
- وكذلك بينما تكون مشغولًا بتحليل مُحتوى else، تنسى ما تؤديه الشيفرة البرمجية في
then
.
فوائد تطبيق الحل
- باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي سيصون الشيفرة البرمجية لاحقًا (مثلك أنت، بعد شهرين من الآن!).
- تقنية إعادة التصميم هذه قابلة للتطبيق أيضا على التعبيرات القصيرة في الشروط. تبدو السلسلة النصية
isSalaryDay()
أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.
آلية الحل
- استخرج الشرطية إلى تابع منفصل عن طريق استخراج التوابع.
- كرر العملية لمُحتوى then و else.