تجزئة الشَرطيات (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
.