استخراج الأصناف الفرعية (Extract Subclass)
المشكلة
يكون للصنف ميزات تستعمل فقط في حالات معينة.
الحل
إنشاء صنف فرعي واستخدامه في هذه الحالات.
مثال
قبل إعادة التصميم
بعد إعادة التصميم
لم إعادة التصميم؟
يحتوي الصنف الرئيسي على توابع وحقول لتطبيق حالة نادرة معينة لاستخدام الصنف. وفي حين أن الحالة نادرة الحدوث، يكون الصنف مسؤولًا عنها وسيكون من الخطأ نقل جميع الحقول والتوابع المرتبطة بها إلى صنفٍ منفصلٍ تمامًا. لكن يمكن نقلهم إلى صنف فرعي، وهو ما سنفعله بمساعدة تقنية إعادة التصميم هذه.
فوائد تطبيق الحل
- إنشاء صنف فرعي بسرعة وسهولة.
- إمكانية إنشاء عدة أصناف فرعية منفصلة إذا كان الصنف الرئيسي ينجز حاليًا أكثر من مثل هذه الحالة الخاصة.
مساوئ تطبيق الحل
- على الرغم من ما يبدو عليه من بساطة، يمكن أن يؤدي التوريث إلى طريق مسدود إذا كان عليك فصل عدة تسلسلات هرمية مختلفة للصنف. إذا وُجِد على سبيل المثال الصنف
كلاب
وله سلوك مختلف اعتمادا على حجم وفراء الكلاب، يمكن استنباط اثنين من التسلسلات الهرمية:- بحسب الحجم:
كبير
ومتوسط
وصغير
- بحسب الفراء:
ناعم
وأشعث
- بحسب الحجم:
كل شيء سيكون على ما يرام، إلا أن المشاكل سوف تتفاقم حالما تحتاج إلى إنشاء صنف كلب يكون كبير
و ناعم
على حد سواء، إذ يمكنك إنشاء كائن من صنفٍ واحدٍ فقط. ومع ذلك، يمكنك تجنب هذه المشكلة باستخدام التركيب بدلا من الميراث (انظر نمط الاستراتيجية). وبعبارة أخرى، سيكون للصنف كلاب حقلين مكونين، الحجم والفراء. ستقوم بتركيب العناصر المكونة من الأصناف اللازمة إلى هذه الحقول. حتى تتمكن من إنشاء كلب لديه حجم_كبير
وفراء_أشعث
.
آلية الحل
- أنشئ صنف فرعي جديدة من الصنف المعني.
- إذا كنت بحاجة إلى بيانات إضافية لإنشاء كائنات من صنفٍ فرعي، أنشئ مُنشِئ واضف المعاملات اللازمة إليه. لا تنسى استدعاء تطبيق أصل المُنشئ.
- ابحث عن كل استدعاءات مُنشئ الصنف الأصل. عندما تكون وظيفة الصنف الفرعي ضرورية، يستعاض عن المُنشئ الأصل بالمُنشئ الفرعي.
- انقل التوابع والحقول الضرورية من الصنف الأصل إلى الصنف الفرعي. قم بهذا من خلال دفع التابع لأسفل ودفع الحقل لأسفل. من الأسهل البدء بنقل التوابع أولًا. وبهذه الطريقة، تظل الحقول متاحة طوال العملية بأكملها: من الصنف الأصل قبيل الانتقال، ومن الصنف الفرعي نفسه بعد اكتمال النقل.
- بعد أن يكون الصنف الفرعي جاهزًا، ابحث عن كل الحقول القديمة التي تحكمت في اختيار الوظيفة. احذف هذه الحقول باستخدام التعدديّة الشكليّة لتحل محل جميع العوامل التي استخدمت فيها الحقول. مثال بسيط: في صنف السيارات، يوجد الحقل
هي_سيارة_كهربية
، واعتمادًا عليه، في تابعالتزود_بالوقود()
تكون السيارة إما مزودة بالمحروقات أو مشحونة بالكهرباء. بعد إعادة التصميم، يحذف الحقلهي_سيارة_كهربية
وسيكون للصنفين السيارات وسيارة_كهربية
التطبيقات الخاصة بهما في تابعالتزود_بالوقود()
.