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

> المشكلة: إذن تريد استبدال خوارزمية موجودة بأخرى جديدة؟ الحل: استبدل جسم الدالة التي تنفذ الخوارزمية بالخوارزمية الجديدة.

## المشكلة

إذن تريد استبدال خوارزمية موجودة بأخرى جديدة؟

## الحل

استبدل جسم الدالة التي تنفذ الخوارزمية بالخوارزمية الجديدة.

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

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

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

1. تأكد من تبسيط الخوارزمية الحالية قدر الإمكان. انقل الكود غير المهم إلى دوال أخرى باستخدام تقنية [استخلاص الدالة](/extract-method). كلما قل عدد الأجزاء المتحركة في خوارزميتك، كان من الأسهل استبدالها.
2. أنشئ خوارزميتك الجديدة في دالة جديدة. استبدل الخوارزمية القديمة بالجديدة وابدأ في اختبار البرنامج.
3. إذا لم تتطابق النتائج، فارجع إلى التنفيذ القديم وقارن النتائج. حدد أسباب عدم التطابق. على الرغم من أن السبب غالبًا ما يكون خطأً في الخوارزمية القديمة، إلا أنه من المرجح أن يكون بسبب شيء لا يعمل في الخوارزمية الجديدة.
4. عند اكتمال جميع الاختبارات بنجاح، احذف الخوارزمية القديمة نهائيًا!
## Relations

**Eliminates smells**

- [الكود المكرر](/ar/smells/duplicate-code.md)
- [الدالة الطويلة](/ar/smells/long-method.md)

## Code Examples

### java

```java
// Before
String foundPerson(String[] people){
  for (int i = 0; i < people.length; i++) {
    if (people[i].equals("Don")){
      return "Don";
    }
    if (people[i].equals("John")){
      return "John";
    }
    if (people[i].equals("Kent")){
      return "Kent";
    }
  }
  return "";
}

// After
String foundPerson(String[] people){
  List candidates =
    Arrays.asList(new String[] {"Don", "John", "Kent"});
  for (int i=0; i < people.length; i++) {
    if (candidates.contains(people[i])) {
      return people[i];
    }
  }
  return "";
}
```

### csharp

```csharp
// Before
string FoundPerson(string[] people)
{
  for (int i = 0; i < people.Length; i++) 
  {
    if (people[i].Equals("Don"))
    {
      return "Don";
    }
    if (people[i].Equals("John"))
    {
      return "John";
    }
    if (people[i].Equals("Kent"))
    {
      return "Kent";
    }
  }
  return String.Empty;
}

// After
string FoundPerson(string[] people)
{
  List<string> candidates = new List<string>() {"Don", "John", "Kent"};
  
  for (int i = 0; i < people.Length; i++) 
  {
    if (candidates.Contains(people[i])) 
    {
      return people[i];
    }
  }
  
  return String.Empty;
}
```

### php

```php
// Before
function foundPerson(array $people){
  for ($i = 0; $i < count($people); $i++) {
    if ($people[$i] === "Don") {
      return "Don";
    }
    if ($people[$i] === "John") {
      return "John";
    }
    if ($people[$i] === "Kent") {
      return "Kent";
    }
  }
  return "";
}

// After
function foundPerson(array $people){
  foreach (["Don", "John", "Kent"] as $needle) {
    $id = array_search($needle, $people, true);
    if ($id !== false) {
      return $people[$id];
    }
  }
  return "";
}
```

### python

```python
// Before
def foundPerson(people):
    for i in range(len(people)):
        if people[i] == "Don":
            return "Don"
        if people[i] == "John":
            return "John"
        if people[i] == "Kent":
            return "Kent"
    return ""

// After
def foundPerson(people):
    candidates = ["Don", "John", "Kent"]
    return people if people in candidates else ""
```

### typescript

```typescript
// Before
foundPerson(people: string[]): string{
  for (let person of people) {
    if (person.equals("Don")){
      return "Don";
    }
    if (person.equals("John")){
      return "John";
    }
    if (person.equals("Kent")){
      return "Kent";
    }
  }
  return "";
}

// After
foundPerson(people: string[]): string{
  let candidates = ["Don", "John", "Kent"];
  for (let person of people) {
    if (candidates.includes(person)) {
      return person;
    }
  }
  return "";
}
```

