---
title: "إدخال كائن فارغ (Introduce Null Object)"
type: "refactoring-technique"
slug: "introduce-null-object"
url: "http://localhost:3000/ar/introduce-null-object.md"
category: "تبسيط التعبيرات الشرطية"
description: "المشكلة: نظراً لأن بعض التوابع تعيد قيمة null بدلاً من كائنات حقيقية، فإن لديك العديد من فحوصات التحقق من null في الكود. الحل: بدلاً من null، أعد كائناً فارغاً (Null Object) يقدم السلوك الافتراضي."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# إدخال كائن فارغ (Introduce Null Object)

> المشكلة: نظراً لأن بعض التوابع تعيد قيمة null بدلاً من كائنات حقيقية، فإن لديك العديد من فحوصات التحقق من null في الكود. الحل: بدلاً من null، أعد كائناً فارغاً (Null Object) يقدم السلوك الافتراضي.

## المشكلة

نظراً لأن بعض التوابع تعيد قيمة `null` بدلاً من كائنات حقيقية، فإن لديك العديد من فحوصات التحقق من `null` في الكود.

## الحل

بدلاً من `null`، أعد كائناً فارغاً يقدم السلوك الافتراضي.

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

عشرات الفحوصات للتحقق من قيمة `null` تجعل كودك أطول وأكثر قبحاً.

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

1. أنشئ فئة فرعية (Subclass) من الفئة المعنية لتقوم بدور الكائن الفارغ (Null Object).
2. في كلا الفئتين، أنشئ التابع `isNull()`، والذي سيعيد `true` للكائن الفارغ و`false` للفئة الحقيقية.
3. ابحث عن جميع الأماكن التي قد يعيد فيها الكود قيمة `null` بدلاً من كائن حقيقي. وغيّر الكود ليعيد كائناً فارغاً.
4. ابحث عن جميع الأماكن التي تتم فيها مقارنة متغيرات الفئة الحقيقية بالقيمة `null`. واستبدل هذه الفحوصات باستدعاء التابع `isNull()`.
5. * إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة `null`، فأعد تعريف هذه التوابع في فئة الكائن الفارغ وأدخل الكود من جزء `else` للشرط هناك. بعد ذلك، يمكنك حذف الجملة الشرطية بالكامل وسيتم تنفيذ السلوك المختلف عبر تعدد الأشكال (Polymorphism).
  * إذا لم تكن الأمور بهذه البساطة ولا يمكن إعادة تعريف التوابع، فتحقق مما إذا كان بإمكانك ببساطة استخراج العمليات التي كان من المفترض تنفيذها في حالة قيمة `null` إلى توابع جديدة في الكائن الفارغ. واستدعِ هذه التوابع بدلاً من الكود القديم في `else` كعمليات افتراضية.
## Relations

**Similar techniques**

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

**Eliminates smells**

- [عبارات Switch](/ar/smells/switch-statements.md)
- [الحقل المؤقت](/ar/smells/temporary-field.md)

## Code Examples

### java

```java
// Before
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}

// After
class NullCustomer extends Customer {
  boolean isNull() {
    return true;
  }
  Plan getPlan() {
    return new NullPlan();
  }
  // وظائف NULL أخرى.
}

// استبدال قيم null بكائن فارغ (Null-object).
customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// استخدام الكائن الفارغ كأنه فئة فرعية عادية.
plan = customer.getPlan();
```

### csharp

```csharp
// Before
if (customer == null) 
{
  plan = BillingPlan.Basic();
}
else 
{
  plan = customer.GetPlan();
}

// After
public sealed class NullCustomer: Customer 
{
  public override bool IsNull 
  {
    get { return true; }
  }
  
  public override Plan GetPlan() 
  {
    return new NullPlan();
  }
  // وظائف NULL أخرى.
}

// استبدال قيم null بكائن فارغ (Null-object).
customer = order.customer ?? new NullCustomer();

// استخدام الكائن الفارغ كأنه فئة فرعية عادية.
plan = customer.GetPlan();
```

### php

```php
// Before
if ($customer === null) {
  $plan = BillingPlan::basic();
} else {
  $plan = $customer->getPlan();
}

// After
class NullCustomer extends Customer {
  public function isNull() {
    return true;
  }
  public function getPlan() {
    return new NullPlan();
  }
  // وظائف NULL أخرى.
}

// استبدال قيم null بكائن فارغ (Null-object).
$customer = ($order->customer !== null) ?
  $order->customer :
  new NullCustomer;

// استخدام الكائن الفارغ كأنه فئة فرعية عادية.
$plan = $customer->getPlan();
```

### python

```python
// Before
if customer is None:
    plan = BillingPlan.basic()
else:
    plan = customer.getPlan()

// After
class NullCustomer(Customer):

    def isNull(self):
        return True

    def getPlan(self):
        return self.NullPlan()

    # وظائف NULL أخرى.

# استبدال قيم null بكائن فارغ (Null-object).
customer = order.customer or NullCustomer()

# استخدام الكائن الفارغ كأنه فئة فرعية عادية.
plan = customer.getPlan()
```

### typescript

```typescript
// Before
if (customer == null) {
  plan = BillingPlan.basic();
}
else {
  plan = customer.getPlan();
}

// After
class NullCustomer extends Customer {
  isNull(): boolean {
    return true;
  }
  getPlan(): Plan {
    return new NullPlan();
  }
  // وظائف NULL أخرى.
}

// استبدال قيم null بكائن فارغ (Null-object).
let customer = (order.customer != null) ?
  order.customer : new NullCustomer();

// استخدام الكائن الفارغ كأنه فئة فرعية عادية.
plan = customer.getPlan();
```

