---
title: "إدخال توكيد (Introduce Assertion)"
type: "refactoring-technique"
slug: "introduce-assertion"
url: "http://localhost:3000/ar/introduce-assertion.md"
category: "تبسيط التعبيرات الشرطية"
description: "المشكلة: لكي يعمل جزء معين من الكود بشكل صحيح، يجب أن تكون شروط أو قيم معينة صحيحة. الحل: استبدل هذه الافتراضات بفحوصات توكيد (assertions) محددة."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# إدخال توكيد (Introduce Assertion)

> المشكلة: لكي يعمل جزء معين من الكود بشكل صحيح، يجب أن تكون شروط أو قيم معينة صحيحة. الحل: استبدل هذه الافتراضات بفحوصات توكيد (assertions) محددة.

## المشكلة

لكي يعمل جزء معين من الكود بشكل صحيح، يجب أن تكون شروط أو قيم معينة صحيحة.

## الحل

استبدل هذه الافتراضات بفحوصات توكيد (assertions) محددة.

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

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

اجعل هذه الافتراضات واضحة عن طريق إضافة التوكيدات المقابلة. كما هو الحال مع تلميح الأنواع (type hinting) في معاملات التوابع، يمكن أن تعمل هذه التوكيدات كتوثيق حي للبرنامج الخاص بك.

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

## الفوائد

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

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

عندما ترى أنه يُفترض وجود شرط معين، أضف توكيداً (assertion) لهذا الشرط للتأكد.

لا ينبغي أن يؤدي إضافة التوكيد إلى تغيير سلوك البرنامج.

لا تبالغ في استخدام التوكيدات لكل **شيء** في الكود الخاص بك. تحقق فقط من الشروط الضرورية لعمل الكود بشكل صحيح. إذا كان الكود يعمل بشكل طبيعي حتى عندما يكون توكيد معين خاطئاً، فيمكنك إزالة التوكيد بأمان.
## Relations

**Eliminates smells**

- [التعليقات](/ar/smells/comments.md)

## Code Examples

### java

```java
// Before
double getExpenseLimit() {
  // يجب أن يكون هناك إما حد للمصاريف أو
  // مشروع رئيسي.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.getMemberExpenseLimit();
}

// After
double getExpenseLimit() {
  Assert.isTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

### csharp

```csharp
// Before
double GetExpenseLimit() 
{
  // يجب أن يكون هناك إما حد للمصاريف أو
  // مشروع رئيسي.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit :
    primaryProject.GetMemberExpenseLimit();
}

// After
double GetExpenseLimit() 
{
  Assert.IsTrue(expenseLimit != NULL_EXPENSE || primaryProject != null);

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.GetMemberExpenseLimit();
}
```

### php

```php
// Before
function getExpenseLimit() {
  // يجب أن يكون هناك إما حد للمصاريف أو
  // مشروع رئيسي.
  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}

// After
function getExpenseLimit() {
  assert($this->expenseLimit !== NULL_EXPENSE || isset($this->primaryProject));

  return ($this->expenseLimit !== NULL_EXPENSE) ?
    $this->expenseLimit:
    $this->primaryProject->getMemberExpenseLimit();
}
```

### python

```python
// Before
def getExpenseLimit(self):
    # يجب أن يكون هناك إما حد للمصاريف أو
    # مشروع رئيسي.
    return self.expenseLimit if self.expenseLimit != NULL_EXPENSE else \
        self.primaryProject.getMemberExpenseLimit()

// After
def getExpenseLimit(self):
    assert (self.expenseLimit != NULL_EXPENSE) or (self.primaryProject != None)

    return self.expenseLimit if (self.expenseLimit != NULL_EXPENSE) else \
        self.primaryProject.getMemberExpenseLimit()
```

### typescript

```typescript
// Before
getExpenseLimit(): number {
  // يجب أن يكون هناك إما حد للمصاريف أو
  // مشروع رئيسي.
  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}

// After
getExpenseLimit(): number {
  // لا تحتوي لغتا TypeScript و JS على توكيدات مدمجة، لذلك سنستخدم
  // الأسلوب التقليدي console.error(). يمكنك دائماً استخراج هذا في
  // تابع توكيد مخصص.
  if (!(expenseLimit != NULL_EXPENSE ||
       (typeof primaryProject !== 'undefined' && primaryProject))) {
      console.error("Assertion failed: getExpenseLimit()");
  }

  return (expenseLimit != NULL_EXPENSE) ?
    expenseLimit:
    primaryProject.getMemberExpenseLimit();
}
```

