الفرق بين المراجعتين ل"Refactoring/inline temp"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط
ط (مراجعة وتدقيق.)
 
سطر 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]]
 +
[[تصنيف: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).

آلية الحل

  1. إيجاد كافة المواقع التي يُستخدَم فيها المتغيِّر المؤقّت في الشيفرة وتبديل المتغيِّر فيها إلى التعبير (expression) الفعليّ الذي أُسنِد له قبلًا.
  2. حذف كلٍّ من تصريح المتغيِّر وإسناد التعبير إليه.

انظر أيضًا

مصادر