ConstructiCat Logo
CodeBust.
Browse section ▾

استخراج الفئة الفرعية.

Problem

تحتوي فئة على ميزات تُستخدم فقط في حالات معينة.

Solution

أنشئ فئة فرعية واستخدمها في هذه الحالات.

##Example

قبل
Extract Subclass - Before
بعد
Extract Subclass - After

##Why Refactor

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

##Benefits

  • ينشئ فئة فرعية بسرعة وسهولة.

  • يمكنك إنشاء عدة فئات فرعية منفصلة إذا كانت فئتك الرئيسية تنفذ حالياً أكثر من حالة خاصة كهذه.

##How to Refactor

  1. أنشئ فئة فرعية جديدة من الفئة المعنية.

  2. إذا كنت بحاجة إلى بيانات إضافية لإنشاء كائنات من فئة فرعية، فأنشئ منشئاً (constructor) وأضف المعاملات اللازمة إليه. لا تنسَ استدعاء منشئ الفئة الأب (parent constructor).

  3. ابحث عن جميع الاستدعاءات لمنشئ الفئة الأب. عندما تكون وظائف الفئة الفرعية ضرورية، استبدل منشئ الفئة الأب بمنشئ الفئة الفرعية.

  4. انقل الدوال والحقول اللازمة من الفئة الأب إلى الفئة الفرعية. قم بذلك عبر طريقة إنزال الدالة و إنزال الحقل. من الأسهل البدء بنقل الدوال أولاً. بهذه الطريقة، تظل الحقول سهلة الوصول طوال العملية بأكملها: من الفئة الأب قبل النقل، ومن الفئة الفرعية نفسها بعد اكتمال النقل.

  5. بعد أن تصبح الفئة الفرعية جاهزة، ابحث عن جميع الحقول القديمة التي كانت تتحكم في اختيار الوظيفة. احذف هذه الحقول باستخدام تعدد الأشكال (polymorphism) لاستبدال جميع المعاملات التي تم استخدام الحقول فيها. مثال بسيط: في الفئة Car، كان لديك الحقل isElectricCar، وبناءً عليه، في دالة refuel() يتم تعبئة السيارة بالوقود أو شحنها بالكهرباء. بعد إعادة الهيكلة، يتم حذف حقل isElectricCar وستحصل فئتا Car و ElectricCar على تطبيقاتهما الخاصة لدالة refuel().