الفرق بين المراجعتين لصفحة: «Refactoring/decompose conditional»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: تجزئة الشَرطيات (Decompose Conditional)}}</noinclude> == المشكلة == توجد شَرطية مُعقدة (<code>if-then</c...'
 
لا ملخص تعديل
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: تجزئة الشَرطيات (Decompose Conditional)}}</noinclude>
 
تجزئة الشَرطيات (Decompose Conditional)


== المشكلة ==
== المشكلة ==
سطر 89: سطر 90:


== مصادر ==
== مصادر ==
<span> </span>
* [https://refactoring.guru/decompose-conditional صفحة توثيق تجزئة الشَرطيات في موقع refactoring.guru].
* [https://refactoring.guru/decompose-conditional صفحة توثيق تجزئة الشَرطيات في موقع refactoring.guru].
[[تصنيف:Refactoring]]
[[تصنيف:Refactoring Techniques]]
[[تصنيف:Refactoring Simplifying Conditional Expressions]]

مراجعة 14:17، 11 ديسمبر 2018

تجزئة الشَرطيات (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()‎ أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.

آلية الحل

  1. استخرج الشرطية إلى تابع منفصل عن طريق استخراج التوابع.
  2. كرر العملية لمُحتوى then و else.

انظر أيضًا

مصادر