---
title: "استخراج الفئة"
type: "refactoring-technique"
slug: "extract-class"
url: "http://localhost:3000/ar/extract-class.md"
category: "نقل الميزات بين الكائنات"
description: "المشكلة: عندما تقوم فئة واحدة بعمل فئتين، ينتج عن ذلك ارتباك وتعقيد. الحل: بدلاً من ذلك، أنشئ فئة جديدة وضع فيها الحقول والدوال المسؤولة عن الوظائف ذات الصلة."
---
# استخراج الفئة

> المشكلة: عندما تقوم فئة واحدة بعمل فئتين، ينتج عن ذلك ارتباك وتعقيد. الحل: بدلاً من ذلك، أنشئ فئة جديدة وضع فيها الحقول والدوال المسؤولة عن الوظائف ذات الصلة.

## المشكلة

عندما تقوم فئة واحدة بعمل فئتين، ينتج عن ذلك ارتباك وتعقيد.

## الحل

بدلاً من ذلك، أنشئ فئة جديدة وضع فيها الحقول والدوال المسؤولة عن الوظائف ذات الصلة.

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

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

## الفوائد

* تساعد تقنية إعادة الهيكلة هذه في الحفاظ على الالتزام بـ _مبدأ المسؤولية الفردية_. سيكون كود فئاتك أكثر وضوحاً وفهماً.
* الفئات ذات المسؤولية الفردية أكثر موثوقية وتسامحاً مع التغييرات. على سبيل المثال، لنفترض أن لديك فئة مسؤولة عن عشرة أشياء مختلفة. عندما تقوم بتغيير هذه الفئة لتحسينها لشيء واحد، فإنك تخاطر بكسرها للأشياء التسعة الأخرى.

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

قبل البدء، حدد كيف تريد تقسيم مسؤوليات الفئة بالضبط.

1. أنشئ فئة جديدة لاحتواء الوظائف ذات الصلة.
2. أنشئ علاقة بين الفئة القديمة والفئة الجديدة. من الأفضل أن تكون هذه العلاقة أحادية الاتجاه؛ مما يسمح بإعادة استخدام الفئة الثانية دون أي مشاكل. ومع ذلك، إذا كنت ترى أن هناك حاجة لعلاقة ثنائية الاتجاه، فيمكن إعدادها دائماً.
3. استخدم [نقل الحقل](/move-field) و [نقل الدالة](/move-method) لكل حقل ودالة قررت نقلهما إلى الفئة الجديدة. بالنسبة للدوال، ابدأ بالدوال الخاصة (private) لتقليل مخاطر حدوث عدد كبير من الأخطاء. حاول النقل شيئاً فشيئاً واختبر النتائج بعد كل عملية نقل، لتجنب تراكم الأخطاء وتصحيحها في النهاية.
بعد الانتهاء من النقل، ألقِ نظرة أخرى على الفئات الناتجة. قد يتم إعادة تسمية الفئة القديمة التي تغيرت مسؤولياتها لمزيد من الوضوح. تحقق مرة أخرى لمعرفة ما إذا كان بإمكانك التخلص من العلاقات ثنائية الاتجاه بين الفئات، إن وجدت.
4. فكر أيضاً في إمكانية الوصول إلى الفئة الجديدة من الخارج. يمكنك إخفاء الفئة تماماً عن العميل بجعلها خاصة (private)، وإدارتها عبر الحقول من الفئة القديمة. بدلاً من ذلك، يمكنك جعلها عامة (public) عن طريق السماح للعميل بتغيير القيم مباشرة. يعتمد قرارك هنا على مدى أمان سلوك الفئة القديمة عندما يتم إجراء تغييرات مباشرة غير متوقعة على القيم في الفئة الجديدة.
## Relations

**Similar techniques**

- [استخراج الفئة الفرعية](/ar/extract-subclass.md)
- [استبدال قيمة البيانات بكائن](/ar/replace-data-value-with-object.md)

**Opposite refactorings**

- [تضمين الفئة](/ar/inline-class.md)

**Eliminates smells**

- [الكود المكرر](/ar/smells/duplicate-code.md)
- [الكلاس الضخمة](/ar/smells/large-class.md)
- [التغيير المتشعب](/ar/smells/divergent-change.md)
- [تجمعات البيانات](/ar/smells/data-clumps.md)
- [الهوس بالأنواع الأساسية](/ar/smells/primitive-obsession.md)
- [الحقل المؤقت](/ar/smells/temporary-field.md)
- [الألفة غير اللائقة](/ar/smells/inappropriate-intimacy.md)

