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

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


==== بعد إعادة التصميم ====
=== بعد إعادة التصميم ===
إنشاء دالة باسم <code>()isSummer</code> تتحقق من الشرط المعقد، واستعمالها مع البنية الشرطية <code>if</code> مباشرةً:
 
في لغة Java:<syntaxhighlight lang="java">
في لغة Java:<syntaxhighlight lang="java">
if (isSummer(date)) {
if (isSummer(date)) {
سطر 71: سطر 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>.


== انظر أيضًا ==
== انظر أيضًا ==
سطر 89: سطر 92:


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

انظر أيضًا

مصادر