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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(مراجعة وتدقيق.)
 
سطر 1: سطر 1:
 
+
<noinclude>{{DISPLAYTITLE:تجزئة الشَرطيات (Decompose Conditional)}}</noinclude>
تجزئة الشَرطيات (Decompose Conditional)
 
 
 
 
== المشكلة ==
 
== المشكلة ==
توجد شَرطية مُعقدة (<code>if-then</code>/<code>else</code> أو <code>switch</code>).
+
يوجد شَرط مُعقد (<code>if-then</code>/<code>else</code> أو <code>switch</code>).
  
 
== الحل ==
 
== الحل ==
فصل الأجزاء المعقدة من الشَرطية إلى توابع منفصلة: الشرط، <code>then</code> و <code>else</code>.
+
فصل الأجزاء المعقدة من الشَرط إلى توابع منفصلة: الشرط، <code>then</code> و <code>else</code>.
 +
 
 +
== مثال ==
  
=== مثال ===
+
=== قبل إعادة التصميم ===
 +
وجود شرط معقد ناتج عن دمج شرطين باستعمال المعامل <code>||</code> الثنائي في البنية <code>if</code>:
  
==== قبل إعادة التصميم ====
 
 
في لغة Java:<syntaxhighlight lang="java">
 
في لغة Java:<syntaxhighlight lang="java">
 
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
 
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
سطر 41: سطر 41:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== بعد إعادة التصميم ====
+
=== بعد إعادة التصميم ===
 +
إنشاء دالة باسم <code>()isSummer</code> تتحقق من الشرط المعقد، واستعمالها مع البنية الشرطية <code>if</code> مباشرةً:
 +
 
 
في لغة Java:<syntaxhighlight lang="java">
 
في لغة Java:<syntaxhighlight lang="java">
 
if (isSummer(date)) {
 
if (isSummer(date)) {
سطر 72: سطر 74:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== لم إعادة التصميم؟ ===
+
== لم إعادة التصميم؟ ==
كلما كانت قطعة الشيفرة البرمجية أطول، كلما كان من الصعب فهمها. وتصبح الأمور أكثر صعوبة في الفهم عندما تمتلئ الشيفرة بالشروط:
+
كلما كانت قطعة الشيفرة البرمجية أطول، كان من الصعب فهمها. وتصبح الأمور أكثر صعوبة في الفهم عندما تمتلئ الشيفرة بالشروط:
* بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى then، تنسى ماذا كان الشرط المُرتبِط.
+
* بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى <code>then</code>، تنسى ماذا كان الشرط المُرتبِط.
* وكذلك بينما تكون مشغولًا بتحليل مُحتوى else، تنسى ما تؤديه الشيفرة البرمجية في <code>then</code>.
+
* وكذلك بينما تكون مشغولًا بتحليل مُحتوى <code>else</code>، تنسى ما تؤديه الشيفرة البرمجية في <code>then</code>.
  
=== فوائد تطبيق الحل ===
+
== فوائد تطبيق الحل ==
* باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي سيصون الشيفرة البرمجية لاحقًا (مثلك أنت، بعد شهرين من الآن!).
+
* باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي سيجري صيانة للشيفرة البرمجية لاحقًا (كأن تكون أنت مثلًا، بعد شهرين من الآن!).
* تقنية إعادة التصميم هذه قابلة للتطبيق أيضا على التعبيرات القصيرة في الشروط. تبدو السلسلة النصية <code>isSalaryDay()‎</code> أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.
+
* تقنية إعادة التصميم هذه قابلة للتطبيق أيضًا على التعبيرات الشرطية القصيرة. تبدو السلسلة النصية <code>isSalaryDay()‎</code> أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.
  
=== آلية الحل ===
+
== آلية الحل ==
# استخرج الشرطية إلى تابع منفصل عن طريق [[Refactoring/extract method|استخراج التوابع]].
+
# استخرج الشرط إلى تابع منفصل عن طريق [[Refactoring/extract method|استخراج التوابع]].
# كرر العملية لمُحتوى then و else.
+
# كرر العملية لمُحتوى <code>then</code> و <code>else</code>.
  
 
== انظر أيضًا ==
 
== انظر أيضًا ==
سطر 91: سطر 93:
 
== مصادر ==
 
== مصادر ==
 
* [https://refactoring.guru/decompose-conditional صفحة توثيق تجزئة الشَرطيات في موقع refactoring.guru].
 
* [https://refactoring.guru/decompose-conditional صفحة توثيق تجزئة الشَرطيات في موقع refactoring.guru].
 +
[[تصنيف:Refactoring]]
 +
[[تصنيف:Refactoring Techniques]]
 +
[[تصنيف:Refactoring Simplifying Conditional Expressions]]

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

المشكلة

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

آلية الحل

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

انظر أيضًا

مصادر