الفرق بين المراجعتين ل"Refactoring/consolidate conditional expression"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق.)
 
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE: توحيد التعبير الشرطي (Consolidate Conditional Expression)}}</noinclude>
 
<noinclude>{{DISPLAYTITLE: توحيد التعبير الشرطي (Consolidate Conditional Expression)}}</noinclude>
 
== المشكلة ==
 
== المشكلة ==
وجود عدة شَرطيات تؤدي إلى نفس النتيجة أو الإجراء.
+
وجود عدة شروط تؤدي إلى نفس النتيجة أو الإجراء.
  
 
== الحل ==
 
== الحل ==
توحيد جميع هذه الشَرطيات في تعبير وحيد.
+
توحيد جميع هذه الشروط في تعبير وحيد.
  
=== مثال ===
+
== مثال ==
  
 
==== قبل إعادة التصميم ====
 
==== قبل إعادة التصميم ====
 +
وجود عدة شروط يتم التحقق منها في الشيفرة:
 +
 
في لغة Java:<syntaxhighlight lang="java">
 
في لغة Java:<syntaxhighlight lang="java">
 
double disabilityAmount() {
 
double disabilityAmount() {
سطر 20: سطر 22:
 
     return 0;
 
     return 0;
 
   }
 
   }
   // compute the disability amount
+
   // حساب مقدار العجز
 
   //...
 
   //...
 
}
 
}
سطر 38: سطر 40:
 
     return 0;
 
     return 0;
 
   }
 
   }
   // compute the disability amount
+
   // حساب مقدار العجز
 
   //...
 
   //...
 
}
 
}
سطر 46: سطر 48:
 
   if ($this->monthsDisabled > 12) return 0;
 
   if ($this->monthsDisabled > 12) return 0;
 
   if ($this->isPartTime) return 0;
 
   if ($this->isPartTime) return 0;
   // compute the disability amount
+
   // حساب مقدار العجز
 
   ...
 
   ...
 
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python">
 
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python">
سطر 56: سطر 58:
 
     if isPartTime:
 
     if isPartTime:
 
         return 0
 
         return 0
     # compute the disability amount
+
     # حساب مقدار العجز
 
     #...
 
     #...
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== بعد إعادة التصميم ====
+
=== بعد إعادة التصميم ===
 +
إنشاء دالة باسم <code>()isNotEligableForDisability</code> تضم جميع الشروط السابقة واستعمال بنية شرطية وحيدة للتحقق من القيمة التي تعيدها:
 +
 
 
في لغة Java:<syntaxhighlight lang="java">
 
في لغة Java:<syntaxhighlight lang="java">
 
double disabilityAmount() {
 
double disabilityAmount() {
سطر 66: سطر 70:
 
     return 0;
 
     return 0;
 
   }
 
   }
   // compute the disability amount
+
   // حساب مقدار العجز
 
   //...
 
   //...
 
}
 
}
سطر 76: سطر 80:
 
     return 0;
 
     return 0;
 
   }
 
   }
   // compute the disability amount
+
   // حساب مقدار العجز
 
   //...
 
   //...
 
}
 
}
سطر 82: سطر 86:
 
function disabilityAmount() {
 
function disabilityAmount() {
 
   if ($this->isNotEligableForDisability()) return 0;
 
   if ($this->isNotEligableForDisability()) return 0;
   // compute the disability amount
+
   // حساب مقدار العجز
 
   ...
 
   ...
 
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python">
 
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python">
سطر 88: سطر 92:
 
     if isNotEligableForDisability():
 
     if isNotEligableForDisability():
 
         return 0
 
         return 0
     # compute the disability amount
+
     # حساب مقدار العجز
 
     #...
 
     #...
 
</syntaxhighlight>
 
</syntaxhighlight>
سطر 95: سطر 99:
 
تحتوي الشيفرة البرمجية على العديد من العوامل المتناوبة التي تنفذ إجراءات متطابقة. ومن غير الواضح لماذا تنقسم هذه العوامل.
 
تحتوي الشيفرة البرمجية على العديد من العوامل المتناوبة التي تنفذ إجراءات متطابقة. ومن غير الواضح لماذا تنقسم هذه العوامل.
  
الغرض الرئيسي من التوحيد هو استخراج الشرطيات إلى توابع منفصلة لزيادة الوضوح.
+
الغرض الرئيسي من التوحيد هو استخراج الشروط إلى توابع منفصلة لزيادة الوضوح.
  
 
== فوائد تطبيق الحل ==
 
== فوائد تطبيق الحل ==
* إزالة تكرار الشيفرة البرمجية لتدفق التحكم. إذ يساعد الجمع بين العديد من الشرطيات التي لها نفس "الوجهة" على إظهار أنك تجري اختبار واحد فقط معقد يقود إلى إجراء واحد.
+
* إزالة تكرار الشيفرة البرمجية لتدفق التحكم، إذ يساعد الجمع بين العديد من الشروط التي لها نفس "الوجهة" على إظهار أنك تجري اختبارً واحدًا معقدًا فقط يقود إلى إجراء واحد.
* بتوحيد جميع العوامل، يمكن الآن عزل هذا التعبير المُعقَّد في تابع جديد له اسم يفسر الغرض من الشَرطية.
+
* بتوحيد جميع العوامل، يمكن الآن عزل هذا التعبير المُعقَّد في تابع جديد له اسم يفسر الغرض من الشرط.
  
 
== آلية الحل ==
 
== آلية الحل ==
قبل إعادة التصميم، تأكد من أن الشرطية لا تملك أي "آثار جانبية" أو تُعدِّل شيئًا خلاف ذلك، بدلًا من مجرد إعادة القيم. قد تختبئ الآثار الجانبية في الشيفرة البرمجية المُنفَّذة داخل العامل نفسه، مثل عند إضافة شيئًا ما لمتغير استنادًا على نتائج الشَرطية.
+
قبل إعادة التصميم، تأكد من أن الشروط لا تملك أي "آثار جانبية" أو تُعدِّل شيئًا خلاف ذلك، بدلًا من مجرد إعادة القيم. قد تختبئ الآثار الجانبية في الشيفرة البرمجية المُنفَّذة داخل العامل نفسه، مثل عند إضافة شيئًا ما لمتغير استنادًا على نتائج الشَرطية.
 
# وحِّد الشرطية في تعبير واحد باستخدام <code>and</code> و <code>or</code>. وكقاعدة عامة عند توحيد:
 
# وحِّد الشرطية في تعبير واحد باستخدام <code>and</code> و <code>or</code>. وكقاعدة عامة عند توحيد:
 
#* تُضم الشرطيات المتداخلة باستخدام <code>and</code>.
 
#* تُضم الشرطيات المتداخلة باستخدام <code>and</code>.
 
#* تُضم الشرطيات المتتابعة باستخدام <code>or</code>.
 
#* تُضم الشرطيات المتتابعة باستخدام <code>or</code>.
# نفِّذ [[Refactoring/extract method|استخراج التوابع (Extract Methods)]] علي شروط العامل واعطِه اسم يعكس الغرض من التعبير.
+
# نفِّذ [[Refactoring/extract method|استخراج التوابع (Extract Methods)]] على شروط العامل واعطِه اسمًا يعكس الغرض من التعبير.
  
 
== انظر أيضًا ==
 
== انظر أيضًا ==

المراجعة الحالية بتاريخ 08:02، 19 ديسمبر 2018

المشكلة

وجود عدة شروط تؤدي إلى نفس النتيجة أو الإجراء.

الحل

توحيد جميع هذه الشروط في تعبير وحيد.

مثال

قبل إعادة التصميم

وجود عدة شروط يتم التحقق منها في الشيفرة:

في لغة Java:

double disabilityAmount() {
  if (seniority < 2) {
    return 0;
  }
  if (monthsDisabled > 12) {
    return 0;
  }
  if (isPartTime) {
    return 0;
  }
  // حساب مقدار العجز
  //...
}

في لغة C#‎:

double DisabilityAmount() 
{
  if (seniority < 2) 
  {
    return 0;
  }
  if (monthsDisabled > 12) 
  {
    return 0;
  }
  if (isPartTime) 
  {
    return 0;
  }
  // حساب مقدار العجز
  //...
}

في لغة PHP:

function disabilityAmount() {
  if ($this->seniority < 2) return 0;
  if ($this->monthsDisabled > 12) return 0;
  if ($this->isPartTime) return 0;
  // حساب مقدار العجز
  ...

في لغة Python:

def disabilityAmount():
    if seniority < 2:
        return 0
    if monthsDisabled > 12:
        return 0
    if isPartTime:
        return 0
    # حساب مقدار العجز
    #...

بعد إعادة التصميم

إنشاء دالة باسم ()isNotEligableForDisability تضم جميع الشروط السابقة واستعمال بنية شرطية وحيدة للتحقق من القيمة التي تعيدها:

في لغة Java:

double disabilityAmount() {
  if (isNotEligableForDisability()) {
    return 0;
  }
  // حساب مقدار العجز
  //...
}

في لغة C#‎:

double DisabilityAmount() 
{
  if (IsNotEligableForDisability()) 
  {
    return 0;
  }
  // حساب مقدار العجز
  //...
}

في لغة PHP:

function disabilityAmount() {
  if ($this->isNotEligableForDisability()) return 0;
  // حساب مقدار العجز
  ...

في لغة Python:

def disabilityAmount():
    if isNotEligableForDisability():
        return 0
    # حساب مقدار العجز
    #...

لم إعادة التصميم؟

تحتوي الشيفرة البرمجية على العديد من العوامل المتناوبة التي تنفذ إجراءات متطابقة. ومن غير الواضح لماذا تنقسم هذه العوامل.

الغرض الرئيسي من التوحيد هو استخراج الشروط إلى توابع منفصلة لزيادة الوضوح.

فوائد تطبيق الحل

  • إزالة تكرار الشيفرة البرمجية لتدفق التحكم، إذ يساعد الجمع بين العديد من الشروط التي لها نفس "الوجهة" على إظهار أنك تجري اختبارً واحدًا معقدًا فقط يقود إلى إجراء واحد.
  • بتوحيد جميع العوامل، يمكن الآن عزل هذا التعبير المُعقَّد في تابع جديد له اسم يفسر الغرض من الشرط.

آلية الحل

قبل إعادة التصميم، تأكد من أن الشروط لا تملك أي "آثار جانبية" أو تُعدِّل شيئًا خلاف ذلك، بدلًا من مجرد إعادة القيم. قد تختبئ الآثار الجانبية في الشيفرة البرمجية المُنفَّذة داخل العامل نفسه، مثل عند إضافة شيئًا ما لمتغير استنادًا على نتائج الشَرطية.

  1. وحِّد الشرطية في تعبير واحد باستخدام and و or. وكقاعدة عامة عند توحيد:
    • تُضم الشرطيات المتداخلة باستخدام and.
    • تُضم الشرطيات المتتابعة باستخدام or.
  2. نفِّذ استخراج التوابع (Extract Methods) على شروط العامل واعطِه اسمًا يعكس الغرض من التعبير.

انظر أيضًا

مصادر