---
title: "استخراج الفئة الفرعية"
type: "refactoring-technique"
slug: "extract-subclass"
url: "http://localhost:3000/ar/extract-subclass.md"
category: "التعامل مع التعميم"
description: "المشكلة: تحتوي فئة على ميزات تُستخدم فقط في حالات معينة. الحل: أنشئ فئة فرعية واستخدمها في هذه الحالات."
---
# استخراج الفئة الفرعية

> المشكلة: تحتوي فئة على ميزات تُستخدم فقط في حالات معينة. الحل: أنشئ فئة فرعية واستخدمها في هذه الحالات.

## المشكلة

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

## الحل

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

## دواعي إعادة الهيكلة

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

## الفوائد

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

## كيفية إعادة الهيكلة

1. أنشئ فئة فرعية جديدة من الفئة المعنية.
2. إذا كنت بحاجة إلى بيانات إضافية لإنشاء كائنات من فئة فرعية، فأنشئ منشئاً (constructor) وأضف المعاملات اللازمة إليه. لا تنسَ استدعاء منشئ الفئة الأب.
3. ابحث عن جميع الاستدعاءات لمنشئ الفئة الأب. عندما تكون وظائف الفئة الفرعية ضرورية، استبدل منشئ الفئة الأب بمنشئ الفئة الفرعية.
4. انقل الدوال والحقول اللازمة من الفئة الأب إلى الفئة الفرعية. قم بذلك عبر [إنزال الدالة](/push-down-method) و [إنزال الحقل](/push-down-field). من الأسهل البدء بنقل الدوال أولاً. بهذه الطريقة، تظل الحقول سهلة الوصول طوال العملية بأكملها: من الفئة الأب قبل النقل، ومن الفئة الفرعية نفسها بعد اكتمال النقل.
5. بعد أن تصبح الفئة الفرعية جاهزة، ابحث عن جميع الحقول القديمة التي كانت تتحكم في اختيار الوظيفة. احذف هذه الحقول باستخدام تعدد الأشكال (polymorphism) لاستبدال جميع المعاملات التي تم استخدام الحقول فيها. مثال بسيط: في الفئة Car، كان لديك الحقل `isElectricCar`، وبناءً عليه، في دالة `refuel()` يتم تعبئة السيارة بالوقود أو شحنها بالكهرباء. بعد إعادة الهيكلة، يتم حذف حقل `isElectricCar` وستحصل فئتا `Car` و `ElectricCar` على تطبيقاتهما الخاصة لدالة `refuel()`.
## Relations

**Similar techniques**

- [استخراج الفئة](/ar/extract-class.md)

**Eliminates smells**

- [الكلاس الضخمة](/ar/smells/large-class.md)

