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

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

## المشكلة

تنقسم الدالة إلى أجزاء، يتم تشغيل كل منها اعتمادًا على قيمة معامل.

## الحل

استخلص الأجزاء الفردية من الدالة إلى دوال خاصة بها واستدعها بدلاً من الدالة الأصلية.

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

تضخمت دالة تحتوي على متغيرات معتمدة على المعاملات بشكل كبير. ويتم تشغيل كود معقد في كل فرع، وتضاف متغيرات جديدة نادرًا جدًا.

## الفوائد

* يحسن مقروئية الكود. من الأسهل بكثير فهم الغرض من `startEngine()` بدلاً من `setValue("engineEnabled", true)`.

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

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

**Similar techniques**

- [استبدال الجمل الشرطية بتعدد الأشكال (Replace Conditional with Polymorphism)](/ar/replace-conditional-with-polymorphism.md)

**Opposite refactorings**

- [جعل التابع يقبل معاملات (Parameterize Method)](/ar/parameterize-method.md)

**Eliminates smells**

- [عبارات Switch](/ar/smells/switch-statements.md)
- [الدالة الطويلة](/ar/smells/long-method.md)

## Code Examples

### java

```java
// Before
void setValue(String name, int value) {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  Assert.shouldNeverReachHere();
}

// After
void setHeight(int arg) {
  height = arg;
}
void setWidth(int arg) {
  width = arg;
}
```

### csharp

```csharp
// Before
void SetValue(string name, int value) 
{
  if (name.Equals("height")) 
  {
    height = value;
    return;
  }
  if (name.Equals("width")) 
  {
    width = value;
    return;
  }
  Assert.Fail();
}

// After
void SetHeight(int arg) 
{
  height = arg;
}
void SetWidth(int arg) 
{
  width = arg;
}
```

### php

```php
// Before
function setValue($name, $value) {
  if ($name === "height") {
    $this->height = $value;
    return;
  }
  if ($name === "width") {
    $this->width = $value;
    return;
  }
  assert("Should never reach here");
}

// After
function setHeight($arg) {
  $this->height = $arg;
}
function setWidth($arg) {
  $this->width = $arg;
}
```

### python

```python
// Before
def output(self, name):
    if name == "banner"
        # طباعة اللافتة (banner).
        # ...
    if name == "info"
        # طباعة المعلومات (info).
        # ...

// After
def outputBanner(self):
    # طباعة اللافتة (banner).
    # ...

def outputInfo(self):
    # طباعة المعلومات (info).
    # ...
```

### typescript

```typescript
// Before
setValue(name: string, value: number): void {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  
}

// After
setHeight(arg: number): void {
  height = arg;
}
setWidth(arg: number): number {
  width = arg;
}
```

