الحفاظ على الكائن كاملًا (Preserve Whole Object)
المشكلة
حصولك على عدة قيم من أحد الكائنات، ثم تمررها كمعاملات إلى أحد التوابع.
الحل
حاول تمرير الكائن بالكامل بدلًا من ذلك.
مثال
قبل إعادة التصميم
في لغة 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)
بعد إعادة التصميم
في لغة Java:
boolean withinPlan = plan.withinRange(daysTempRange);
في لغة C#:
bool withinPlan = plan.WithinRange(daysTempRange);
في لغة PHP:
$withinPlan = $plan->withinRange($daysTempRange);
في لغة Python:
withinPlan = plan.withinRange(daysTempRange)
لم إعادة التصميم؟
تكمن المشكلة في وجوب استدعاء توابع كائن المعامل المستقبلي كل مرة قبل استدعاء التابع. إذا تغيرت هذه التوابع أو كمية البيانات التي تم الحصول عليها للتابع، سوف نحتاج إلى البحث عن العشرات من هذه الأماكن في البرنامج بعناية وتنفيذ هذه التغييرات في كل منها.
بعد تطبيق تقنية إعادة التصميم هذه، ستُخزَّن شيفرة الحصول على كل البيانات الضرورية في مكان واحد وهو التابع نفسه.
فوائد تطبيق الحل
- رؤية كائنٍ واحدٍ له اسم مفهوم بدلًا من خلط المعاملات.
- إذا احتاج التابع إلى المزيد من البيانات من أحد الكائنات، لن تحتاج إلى إعادة كتابة جميع الأماكن التي يُستخدم فيها التابع - داخل التابع نفسه.
مساوئ تطبيق الحل
- يؤدي هذا التحول في بعض الأحيان إلى أن يصبح التابع أقل مرونة: في السابق كان يمكن للتابع الحصول على البيانات من مصادر مختلفة كثيرة، ولكن قصرنا الآن استخدامها على الكائنات ذات واجهة معينة فقط بسبب إعادة التصميم.
آلية الحل
- أنشئ معامل داخل التابع للكائن الذي يمكنك الحصول منه على القيم الضرورية.
- ابدأ في إزالة المعاملات القديمة من التابع واحدًا تلو الآخر، واستبدلها باستدعاءات إلى توابع كائن المعامل ذات الصلة. ثم اختبر البرنامج بعد كل استبدال للمعامل.
- احذف شيفرة الحصول getter من كائن المعامل الذي سبق استدعاء التابع.
انظر أيضًا
- تقديم كائن المُعامل (Introduce Parameter Object).
- تبديل المعاملات باستدعاء التوابع (Replace Parameter with Method Call).
- هوس الحقول الأساسية (Primitive Obsession).
- القائمة الطويلة للمعاملات (Long Parameter List).
- التوابع الطويلة (Long Methods).
- البيانات المُجمَّعة (Data Clumps).