---
title: "استخراج الدالة"
type: "refactoring-technique"
slug: "extract-method"
url: "http://localhost:3000/ar/extract-method.md"
category: "تركيب التوابع"
description: "المشكلة: لديك جزء من الكود يمكن تجميعه معاً. الحل: انقل هذا الكود إلى دالة جديدة منفصلة واستبدل الكود القديم باستدعاء لهذه الدالة."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# استخراج الدالة

> المشكلة: لديك جزء من الكود يمكن تجميعه معاً. الحل: انقل هذا الكود إلى دالة جديدة منفصلة واستبدل الكود القديم باستدعاء لهذه الدالة.

## المشكلة

لديك جزء من الكود يمكن تجميعه معاً.

## الحل

انقل هذا الكود إلى دالة جديدة منفصلة واستبدل الكود القديم باستدعاء لهذه الدالة.

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

كلما زادت السطور الموجودة في الدالة، زادت صعوبة معرفة ما تفعله. هذا هو السبب الرئيسي لإعادة الهيكلة هذه.

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

## الفوائد

* كود أكثر قابلية للقراءة! تأكد من إعطاء الدالة الجديدة اسماً يصف الغرض منها مثل: `createOrder()` أو `renderCustomerInfo()`، إلخ.
* تكرار أقل للكود. غالباً ما يمكن إعادة استخدام الكود الموجود في الدالة في أماكن أخرى من برنامجك. لذا يمكنك استبدال التكرارات باستدعاءات لدالتك الجديدة.
* يعزل أجزاء مستقلة من الكود، مما يقلل من احتمالية حدوث أخطاء (مثل تعديل متغير خاطئ).

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

1. أنشئ دالة جديدة وامنحها اسماً يوضح الغرض منها بشكل جلي.
2. انسخ جزء الكود المعني إلى دالتك الجديدة. احذف هذا الجزء من مكانه القديم وضع استدعاء للدالة الجديدة هناك بدلاً منه.
ابحث عن جميع المتغيرات المستخدمة في هذا الجزء من الكود. إذا كانت معلنة داخل هذا الجزء ولم تُستخدم خارجه، فما عليك سوى تركها دون تغيير—ستصبح متغيرات محلية (local variables) للدالة الجديدة.
3. إذا تم الإعلان عن المتغيرات قبل الكود الذي تقوم باستخراجه، فستحتاج إلى تمرير هذه المتغيرات إلى معاملات دالتك الجديدة لاستخدام القيم التي كانت تحتوي عليها سابقاً. في بعض الأحيان، يكون من الأسهل التخلص من هذه المتغيرات باللجوء إلى طريقة [استبدال المتغير المؤقت باستعلام](/replace-temp-with-query).
4. إذا رأيت أن متغيراً محلياً يتغير بطريقة ما في الكود المستخرج، فقد يعني هذا أن هذه القيمة المتغيرة ستكون مطلوبة لاحقاً في دالتك الرئيسية. تحقق جيداً! وإذا كان الأمر كذلك بالفعل، فقم بإرجاع قيمة هذا المتغير إلى الدالة الرئيسية للحفاظ على عمل كل شيء بشكل صحيح.
## Relations

**Helps you do**

- [إدخال كائن المعاملات (Introduce Parameter Object)](/ar/introduce-parameter-object.md)
- [تكوين دالة القالب](/ar/form-template-method.md)
- [جعل التابع يقبل معاملات (Parameterize Method)](/ar/parameterize-method.md)

**Similar techniques**

- [نقل التابع (Move Method)](/ar/move-method.md)

**Opposite refactorings**

- [تضمين التابع (Inline Method)](/ar/inline-method.md)

**Eliminates smells**

- [الكود المكرر](/ar/smells/duplicate-code.md)
- [الدالة الطويلة](/ar/smells/long-method.md)
- [الحسد على الميزات](/ar/smells/feature-envy.md)
- [عبارات Switch](/ar/smells/switch-statements.md)
- [سلاسل الرسائل](/ar/smells/message-chains.md)
- [التعليقات](/ar/smells/comments.md)
- [كلاس البيانات](/ar/smells/data-class.md)

## Code Examples

### java

```java
// Before
void printOwing() {
  printBanner();

  // طباعة التفاصيل.
  System.out.println("name: " + name);
  System.out.println("amount: " + getOutstanding());
}

// After
void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails(double outstanding) {
  System.out.println("name: " + name);
  System.out.println("amount: " + outstanding);
}
```

### csharp

```csharp
// Before
void PrintOwing() 
{
  this.PrintBanner();

  // طباعة التفاصيل.
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}

// After
void PrintOwing()
{
  this.PrintBanner();
  this.PrintDetails();
}

void PrintDetails()
{
  Console.WriteLine("name: " + this.name);
  Console.WriteLine("amount: " + this.GetOutstanding());
}
```

### php

```php
// Before
function printOwing() {
  $this->printBanner();

  // طباعة التفاصيل.
  print("name:  " . $this->name);
  print("amount " . $this->getOutstanding());
}

// After
function printOwing() {
  $this->printBanner();
  $this->printDetails($this->getOutstanding());
}

function printDetails($outstanding) {
  print("name:  " . $this->name);
  print("amount " . $outstanding);
}
```

### python

```python
// Before
def printOwing(self):
    self.printBanner()

    # طباعة التفاصيل
    print("name:", self.name)
    print("amount:", self.getOutstanding())

// After
def printOwing(self):
    self.printBanner()
    self.printDetails(self.getOutstanding())

def printDetails(self, outstanding):
    print("name:", self.name)
    print("amount:", outstanding)
```

### typescript

```typescript
// Before
printOwing(): void {
  printBanner();

  // طباعة التفاصيل.
  console.log("name: " + name);
  console.log("amount: " + getOutstanding());
}

// After
printOwing(): void {
  printBanner();
  printDetails(getOutstanding());
}

printDetails(outstanding: number): void {
  console.log("name: " + name);
  console.log("amount: " + outstanding);
}
```

