الحفاظ على الكائن كاملًا (Preserve Whole Object)

من موسوعة حسوب
< Refactoring
مراجعة 07:23، 26 فبراير 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المشكلة

جلب عدة قيم من أحد الكائنات، ثم تمريرها كمعاملات إلى أحد التوابع.

الحل

حاول تمرير الكائن بالكامل بدلًا من ذلك.

مثال

قبل إعادة التصميم

جلب قيمة درجة الحرارة المنخفضة low والمرتفعة high من الكائن daysTempRange ثم تمريرهما إلى التابع ()withinTange:

في لغة Java:

int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);

في لغة C#‎:

int low = daysTempRange.GetLow();
int high = daysTempRange.GetHigh();
bool withinPlan = plan.WithinRange(low, high);

في لغة PHP:

$low = $daysTempRange->getLow();
$high = $daysTempRange->getHigh();
$withinPlan = $plan->withinRange($low, $high);

في لغة Python:

low = daysTempRange.getLow()
high = daysTempRange.getHigh()
withinPlan = plan.withinRange(low, high)

بعد إعادة التصميم

تمرير الكائن daysTempRange بالكامل إلى التابع ()withinTange:

في لغة Java:

boolean withinPlan = plan.withinRange(daysTempRange);

في لغة C#‎:

bool withinPlan = plan.WithinRange(daysTempRange);

في لغة PHP:

$withinPlan = $plan->withinRange($daysTempRange);

في لغة Python:

withinPlan = plan.withinRange(daysTempRange)

لم إعادة التصميم؟

تكمن المشكلة في وجوب استدعاء توابع كائن المعامل المستقبلي كل مرة قبل استدعاء التابع. إذا تغيرت هذه التوابع أو كمية البيانات التي تم الحصول عليها للتابع، سوف نحتاج إلى البحث عن العشرات من هذه الأماكن في البرنامج بعناية وتنفيذ هذه التغييرات في كل منها.

بعد تطبيق تقنية إعادة التصميم هذه، ستُخزَّن شيفرة الحصول على كل البيانات الضرورية في مكان واحد وهو التابع نفسه.

فوائد تطبيق الحل

  • رؤية كائنٍ واحدٍ له اسم مفهوم بدلًا من خلط المعاملات.
  • إذا احتاج التابع إلى المزيد من البيانات من أحد الكائنات، لن تحتاج إلى تعديل جميع الأماكن التي يُستخدم فيها التابع - داخل التابع نفسه.

مساوئ تطبيق الحل

  • يؤدي هذا التحول في بعض الأحيان إلى أن يصبح التابع أقل مرونة: في السابق كان يمكن للتابع الحصول على البيانات من مصادر مختلفة كثيرة، ولكن قصرنا الآن استخدامها على الكائنات ذات واجهة معينة فقط بسبب إعادة التصميم.

آلية الحل

  1. أنشئ معاملًا داخل التابع للكائن الذي يمكنك الحصول منه على القيم الضرورية.
  2. ابدأ في إزالة المعاملات القديمة من التابع واحدًا تلو الآخر، واستبدلها باستدعاءات إلى توابع كائن المعامل ذات الصلة. اختبر بعد ذلك البرنامج بعد كل استبدال للمعامل.
  3. احذف شيفرة الحصول (getter) من كائن المعامل الذي سبق استدعاء التابع.

انظر أيضًا

مصادر