---
title: "استبدال الدالة بكائن دالة"
type: "refactoring-technique"
slug: "replace-method-with-method-object"
url: "http://localhost:3000/ar/replace-method-with-method-object.md"
category: "تركيب التوابع"
description: "المشكلة: لديك دالة طويلة تتشابك فيها المتغيرات المحلية لدرجة أنه لا يمكنك تطبيق تقنية استخلاص الدالة (Extract Method). الحل: قم بتحويل الدالة إلى فئة منفصلة بحيث تصبح المتغيرات المحلية حقولاً في هذه الفئة. بعد ذلك، يمكنك تقسيم الدالة إلى عدة دوال فرعية داخل نفس الفئة."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# استبدال الدالة بكائن دالة

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

## المشكلة

لديك دالة طويلة تتشابك فيها المتغيرات المحلية لدرجة أنه لا يمكنك تطبيق تقنية _استخلاص الدالة_.

## الحل

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

## لماذا نقوم بإعادة الهيكلة

تكون الدالة طويلة جدًا ولا يمكنك فصلها بسبب التشابك المعقد للمتغيرات المحلية التي يصعب عزلها عن بعضها البعض.

الخطوة الأولى هي عزل الدالة بأكملها في فئة منفصلة وتحويل متغيراتها المحلية إلى حقول في الفئة.

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

## الفوائد

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

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

1. أنشئ فئة جديدة. وقم بتسميتها بناءً على الغرض من الدالة التي تعيد هيكلتها.
2. في الفئة الجديدة، قم بإنشاء حقل خاص لتخزين مرجع إلى مثيل من الفئة التي كانت الدالة تقع فيها سابقًا. يمكن استخدامه للحصول على بعض البيانات المطلوبة من الفئة الأصلية إذا لزم الأمر.
3. قم بإنشاء حقل خاص منفصل لكل متغير محلي في الدالة.
4. أنشئ بانيًا يقبل معلمات تمثل قيم جميع المتغيرات المحلية للدالة ويقوم أيضًا بتهيئة الحقول الخاصة المقابلة.
5. أعلن عن الدالة الرئيسية وانسخ كود الدالة الأصلية إليها، مع استبدال المتغيرات المحلية بالحقول الخاصة.
6. استبدل جسم الدالة الأصلية في الفئة الأصلية عن طريق إنشاء كائن دالة واستدعاء دالته الرئيسية.
## Relations

**Similar techniques**

- [استبدال قيمة البيانات بكائن](/ar/replace-data-value-with-object.md)

**Eliminates smells**

- [الدالة الطويلة](/ar/smells/long-method.md)

## Code Examples

### java

```java
// Before
class Order {
  // ...
  public double price() {
    double primaryBasePrice;
    double secondaryBasePrice;
    double tertiaryBasePrice;
    // إجراء عملية حسابية طويلة.
  }
}

// After
class Order {
  // ...
  public double price() {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator {
  private double primaryBasePrice;
  private double secondaryBasePrice;
  private double tertiaryBasePrice;
  
  public PriceCalculator(Order order) {
    // نسخ المعلومات ذات الصلة من كائن الطلب (order).
  }
  
  public double compute() {
    // إجراء عملية حسابية طويلة.
  }
}
```

### csharp

```csharp
// Before
public class Order 
{
  // ...
  public double Price() 
  {
    double primaryBasePrice;
    double secondaryBasePrice;
    double tertiaryBasePrice;
    // إجراء عملية حسابية طويلة.
  }
}

// After
public class Order 
{
  // ...
  public double Price() 
  {
    return new PriceCalculator(this).Compute();
  }
}

public class PriceCalculator 
{
  private double primaryBasePrice;
  private double secondaryBasePrice;
  private double tertiaryBasePrice;
  
  public PriceCalculator(Order order) 
  {
    // نسخ المعلومات ذات الصلة من كائن الطلب (order).
  }
  
  public double Compute() 
  {
    // إجراء عملية حسابية طويلة.
  }
}
```

### php

```php
// Before
class Order {
  // ...
  public function price() {
    $primaryBasePrice = 10;
    $secondaryBasePrice = 20;
    $tertiaryBasePrice = 30;
    // إجراء عملية حسابية طويلة.
  }
}

// After
class Order {
  // ...
  public function price() {
    return (new PriceCalculator($this))->compute();
  }
}

class PriceCalculator {
  private $primaryBasePrice;
  private $secondaryBasePrice;
  private $tertiaryBasePrice;
  
  public function __construct(Order $order) {
      // نسخ المعلومات ذات الصلة من كائن الطلب (order).
  }
  
  public function compute() {
    // إجراء عملية حسابية طويلة.
  }
}
```

### python

```python
// Before
class Order:
    # ...
    def price(self):
        primaryBasePrice = 0
        secondaryBasePrice = 0
        tertiaryBasePrice = 0
        # إجراء عملية حسابية طويلة.

// After
class Order:
    # ...
    def price(self):
        return PriceCalculator(self).compute()


class PriceCalculator:
    def __init__(self, order):
        self._primaryBasePrice = 0
        self._secondaryBasePrice = 0
        self._tertiaryBasePrice = 0
        # نسخ المعلومات ذات الصلة من كائن الطلب (order).

    def compute(self):
        # إجراء عملية حسابية طويلة.
```

### typescript

```typescript
// Before
class Order {
  // ...
  price(): number {
    let primaryBasePrice;
    let secondaryBasePrice;
    let tertiaryBasePrice;
    // إجراء عملية حسابية طويلة.
  }
}

// After
class Order {
  // ...
  price(): number {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator {
  private _primaryBasePrice: number;
  private _secondaryBasePrice: number;
  private _tertiaryBasePrice: number;
  
  constructor(order: Order) {
    // نسخ المعلومات ذات الصلة من كائن الطلب (order).
  }
  
  compute(): number {
    // إجراء عملية حسابية طويلة.
  }
}
```

