تجزئة الشَرطيات (Decompose Conditional)
المشكلة
يوجد شَرط مُعقد (if-then/else أو switch).
الحل
فصل الأجزاء المعقدة من الشَرط إلى توابع منفصلة: الشرط، then و else.
مثال
قبل إعادة التصميم
وجود شرط معقد ناتج عن دمج شرطين باستعمال المعامل || الثنائي في البنية if:
في لغة 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
بعد إعادة التصميم
إنشاء دالة باسم ()isSummer تتحقق من الشرط المعقد، واستعمالها مع البنية الشرطية if مباشرةً:
في لغة 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.