الفرق بين المراجعتين لصفحة: «Refactoring/decompose conditional»
Khaled-yassin (نقاش | مساهمات) لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) مراجعة وتدقيق. |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:تجزئة الشَرطيات (Decompose Conditional)}}</noinclude> | |||
تجزئة الشَرطيات (Decompose Conditional) | |||
== المشكلة == | == المشكلة == | ||
يوجد شَرط مُعقد (<code>if-then</code>/<code>else</code> أو <code>switch</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> | ||
== لم إعادة التصميم؟ == | |||
كلما كانت قطعة الشيفرة البرمجية أطول، | كلما كانت قطعة الشيفرة البرمجية أطول، كان من الصعب فهمها. وتصبح الأمور أكثر صعوبة في الفهم عندما تمتلئ الشيفرة بالشروط: | ||
* بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى | * بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى <code>then</code>، تنسى ماذا كان الشرط المُرتبِط. | ||
* وكذلك بينما تكون مشغولًا بتحليل مُحتوى | * وكذلك بينما تكون مشغولًا بتحليل مُحتوى <code>else</code>، تنسى ما تؤديه الشيفرة البرمجية في <code>then</code>. | ||
== فوائد تطبيق الحل == | |||
* باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي | * باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي سيجري صيانة للشيفرة البرمجية لاحقًا (كأن تكون أنت مثلًا، بعد شهرين من الآن!). | ||
* تقنية إعادة التصميم هذه قابلة للتطبيق | * تقنية إعادة التصميم هذه قابلة للتطبيق أيضًا على التعبيرات الشرطية القصيرة. تبدو السلسلة النصية <code>isSalaryDay()</code> أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ. | ||
== آلية الحل == | |||
# استخرج | # استخرج الشرط إلى تابع منفصل عن طريق [[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()
أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.
آلية الحل
- استخرج الشرط إلى تابع منفصل عن طريق استخراج التوابع.
- كرر العملية لمُحتوى
then
وelse
.