الفرق بين المراجعتين لصفحة: «Refactoring/inline temp»
جميل-بيلوني (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:استخراج التوابع (Extract Methods)}}</noinclude> == المشكلة == وجود متغيِّرٍ مؤقَّت (temporary) لحفظ...' |
جميل-بيلوني (نقاش | مساهمات) ط مراجعة وتدقيق. |
||
(2 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: | <noinclude>{{DISPLAYTITLE:دمج المتغير المؤقت (Inline Temp)}}</noinclude> | ||
== المشكلة == | == المشكلة == | ||
وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه. | وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه. | ||
سطر 9: | سطر 9: | ||
=== قبل إعادة التصميم === | === قبل إعادة التصميم === | ||
نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم <code>basePrice</code> لتخزين القيمة الناتجة عن تعبير استدعاء التابع <code>order.basePrice()</code>، والذي سيُستخدَم في التعليمة التالية لتعريفه:<syntaxhighlight lang="java"> | نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم <code>basePrice</code> لتخزين القيمة الناتجة عن تعبير استدعاء التابع <code>order.basePrice()</code>، والذي سيُستخدَم في التعليمة التالية لتعريفه: | ||
في لغة Java:<syntaxhighlight lang="java"> | |||
boolean hasDiscount(Order order) { | boolean hasDiscount(Order order) { | ||
double basePrice = order.basePrice(); | double basePrice = order.basePrice(); | ||
سطر 15: | سطر 17: | ||
} | } | ||
</syntaxhighlight>في لغة #C:<syntaxhighlight lang="c#"> | |||
bool HasDiscount(Order order) | |||
{ | |||
double basePrice = order.BasePrice(); | |||
return basePrice > 1000; | |||
} | |||
</syntaxhighlight>في لغة PHP:<syntaxhighlight lang="php"> | |||
$basePrice = $anOrder->basePrice(); | |||
return $basePrice > 1000; | |||
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python"> | |||
def hasDiscount(order): | |||
basePrice = order.basePrice() | |||
return basePrice > 1000 | |||
</syntaxhighlight>في لغة TypeScript:<syntaxhighlight lang="typescript"> | |||
hasDiscount(order: Order): boolean { | |||
let basePrice: number = order.basePrice(); | |||
return basePrice > 1000; | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== بعد إعادة التصميم === | === <span> </span>بعد إعادة التصميم === | ||
تكون إعادة التصميم بمثل هذه الحالة بالاستغناء عن المتغيِّر المؤقّت <code>basePrice</code> في الشيفرة السابقة واستخدام التعبير مباشرةً كما هو لتصبح الشيفرة كما يلي:<syntaxhighlight lang="java"> | تكون إعادة التصميم بمثل هذه الحالة بالاستغناء عن المتغيِّر المؤقّت <code>basePrice</code> في الشيفرة السابقة واستخدام التعبير مباشرةً كما هو لتصبح الشيفرة كما يلي: | ||
في لغة Java:<syntaxhighlight lang="java"> | |||
boolean hasDiscount(Order order) { | boolean hasDiscount(Order order) { | ||
return order.basePrice() > 1000; | return order.basePrice() > 1000; | ||
} | } | ||
</syntaxhighlight>في لغة #C:<syntaxhighlight lang="c#"> | |||
bool HasDiscount(Order order) | |||
{ | |||
return order.BasePrice() > 1000; | |||
} | |||
</syntaxhighlight>في لغة PHP:<syntaxhighlight lang="php"> | |||
return $anOrder->basePrice() > 1000; | |||
</syntaxhighlight>في لغة Python:<syntaxhighlight lang="python"> | |||
def hasDiscount(order): | |||
return order.basePrice() > 1000 | |||
</syntaxhighlight>في لغة TypeScript:<syntaxhighlight lang="typescript"> | |||
hasDiscount(order: Order): boolean { | |||
return order.basePrice() > 1000; | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 45: | سطر 82: | ||
== مصادر == | == مصادر == | ||
* [https://refactoring.guru/inline-temp صفحة توثيق دمج المتغيِّر المؤقَّت في موقع refactoring.guru.] | * [https://refactoring.guru/inline-temp صفحة توثيق دمج المتغيِّر المؤقَّت في موقع refactoring.guru.] | ||
[[تصنيف:Refactoring]] | |||
[[تصنيف:Refactoring Techniques]] | |||
[[تصنيف:Refactoring Composing Methods]] |
المراجعة الحالية بتاريخ 08:23، 2 مارس 2019
المشكلة
وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه.
الحل
تبديل كلُّ مرجعيّةٍ (reference) للمتغيِّر ليحلَّ محلَّها التعبيرُ نفسه.
مثال
قبل إعادة التصميم
نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم basePrice
لتخزين القيمة الناتجة عن تعبير استدعاء التابع order.basePrice()
، والذي سيُستخدَم في التعليمة التالية لتعريفه:
في لغة Java:
boolean hasDiscount(Order order) {
double basePrice = order.basePrice();
return basePrice > 1000;
}
في لغة #C:
bool HasDiscount(Order order)
{
double basePrice = order.BasePrice();
return basePrice > 1000;
}
في لغة PHP:
$basePrice = $anOrder->basePrice();
return $basePrice > 1000;
في لغة Python:
def hasDiscount(order):
basePrice = order.basePrice()
return basePrice > 1000
في لغة TypeScript:
hasDiscount(order: Order): boolean {
let basePrice: number = order.basePrice();
return basePrice > 1000;
}
بعد إعادة التصميم
تكون إعادة التصميم بمثل هذه الحالة بالاستغناء عن المتغيِّر المؤقّت basePrice
في الشيفرة السابقة واستخدام التعبير مباشرةً كما هو لتصبح الشيفرة كما يلي:
في لغة Java:
boolean hasDiscount(Order order) {
return order.basePrice() > 1000;
}
في لغة #C:
bool HasDiscount(Order order)
{
return order.BasePrice() > 1000;
}
في لغة PHP:
return $anOrder->basePrice() > 1000;
في لغة Python:
def hasDiscount(order):
return order.basePrice() > 1000
في لغة TypeScript:
hasDiscount(order: Order): boolean {
return order.basePrice() > 1000;
}
لم إعادة التصميم؟
يُجرَى دمج المتغيِّر المؤقَّت كجزءٍ من تقنيّة تبديل المتغيِّر المؤقَّت إلى استدعاء (query) أو لتمهيد الطريق لاستخراج التابع (extract method).
فوائد تطبيق الحل
ما من فائدةٍ هائلةٍ من تطبيق الحلِّ بحدِّ ذاته ولكن عندما يُستخدَم المتغيِّر المؤقّت لتخزين ناتج استدعاء أحد التوابع (method) فإنَّ تضمينه سيحسِّن من قابلية قراءة الشيفرة (readability) عبر التخلِّص من المتغيِّرات الزائدة.
مساوئ تطبيق الحل
قد تُستخدَم المتغيِّرات المؤقّتة أحيانًا بهدف توفير العمليات المكلفة التي يقوم بها البرنامج بكلِّ مرة يحتاجها بها، إذ تكون هذه المتغيِّرات بمثابة مكانٍ تخزينيّ لتلك القيم، وبإزالة تلك المتغيِّرات ستزداد الكلفة وهذا بدوره سيُضعِف الأداء (performance).
آلية الحل
- إيجاد كافة المواقع التي يُستخدَم فيها المتغيِّر المؤقّت في الشيفرة وتبديل المتغيِّر فيها إلى التعبير (expression) الفعليّ الذي أُسنِد له قبلًا.
- حذف كلٍّ من تصريح المتغيِّر وإسناد التعبير إليه.