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

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

## المشكلة

لديك مجموعة من الجمل الشرطية المتداخلة ويصعب تحديد التدفق الطبيعي لتنفيذ الكود.

## الحل

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

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

من السهل جدًا اكتشاف "الشرط المتداخل الجحيمي". تشكل المسافات البادئة لكل مستوى من مستويات التداخل سهمًا يشير إلى اليمين في اتجاه الألم والمشاكل:

if () {
    if () {
        do {
            if () {
                if () {
                    if () {
                        ...
                    }
                }
                ...
            }
            ...
        }
        while ();
        ...
    }
    else {
        ...
    }
}

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

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

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

حاول تخليص الكود من الآثار الجانبية (side effects) - قد يكون من المفيد استخدام تقنية [فصل الاستعلام عن التعديل](/separate-query-from-modifier) لهذا الغرض. سيكون هذا الحل ضروريًا لإعادة الترتيب الموصوفة أدناه.

1. اعزل جميع عبارات الحماية التي تؤدي إلى استدعاء استثناء أو إرجاع قيمة فورية من الدالة. ضع هذه الشروط في بداية الدالة.
2. بعد اكتمال إعادة الترتيب واجتياز جميع الاختبارات بنجاح، تحقق مما إذا كان بإمكانك استخدام [دمج التعبير الشرطي](/consolidate-conditional-expression) لعبارات الحماية التي تؤدي إلى نفس الاستثناءات أو القيم المرتجعة.
## Code Examples

### java

```java
// Before
public double getPayAmount() {
  double result;
  if (isDead){
    result = deadAmount();
  }
  else {
    if (isSeparated){
      result = separatedAmount();
    }
    else {
      if (isRetired){
        result = retiredAmount();
      }
      else{
        result = normalPayAmount();
      }
    }
  }
  return result;
}

// After
public double getPayAmount() {
  if (isDead){
    return deadAmount();
  }
  if (isSeparated){
    return separatedAmount();
  }
  if (isRetired){
    return retiredAmount();
  }
  return normalPayAmount();
}
```

### csharp

```csharp
// Before
public double GetPayAmount()
{
  double result;
  
  if (isDead)
  {
    result = DeadAmount();
  }
  else 
  {
    if (isSeparated)
    {
      result = SeparatedAmount();
    }
    else 
    {
      if (isRetired)
      {
        result = RetiredAmount();
      }
      else
      {
        result = NormalPayAmount();
      }
    }
  }
  
  return result;
}

// After
public double GetPayAmount() 
{
  if (isDead)
  {
    return DeadAmount();
  }
  if (isSeparated)
  {
    return SeparatedAmount();
  }
  if (isRetired)
  {
    return RetiredAmount();
  }
  return NormalPayAmount();
}
```

### php

```php
// Before
function getPayAmount() {
  if ($this->isDead) {
    $result = $this->deadAmount();
  } else {
    if ($this->isSeparated) {
      $result = $this->separatedAmount();
    } else {
      if ($this->isRetired) {
        $result = $this->retiredAmount();
      } else {
        $result = $this->normalPayAmount();
      }
    }
  }
  return $result;
}

// After
function getPayAmount() {
  if ($this->isDead) {
    return $this->deadAmount();
  }
  if ($this->isSeparated) {
    return $this->separatedAmount();
  }
  if ($this->isRetired) {
    return $this->retiredAmount();
  }
  return $this->normalPayAmount();
}
```

### python

```python
// Before
def getPayAmount(self):
    if self.isDead:
        result = deadAmount()
    else:
        if self.isSeparated:
            result = separatedAmount()
        else:
            if self.isRetired:
                result = retiredAmount()
            else:
                result = normalPayAmount()
    return result

// After
def getPayAmount(self):
    if self.isDead:
        return deadAmount()
    if self.isSeparated:
        return separatedAmount()
    if self.isRetired:
        return retiredAmount()
    return normalPayAmount()
```

### typescript

```typescript
// Before
getPayAmount(): number {
  let result: number;
  if (isDead){
    result = deadAmount();
  }
  else {
    if (isSeparated){
      result = separatedAmount();
    }
    else {
      if (isRetired){
        result = retiredAmount();
      }
      else{
        result = normalPayAmount();
      }
    }
  }
  return result;
}

// After
getPayAmount(): number {
  if (isDead){
    return deadAmount();
  }
  if (isSeparated){
    return separatedAmount();
  }
  if (isRetired){
    return retiredAmount();
  }
  return normalPayAmount();
}
```

