الفرق بين المراجعتين ل"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
.