ConstructiCat Logo
CodeBust.
Browse section ▾

إدخال كائن فارغ (Introduce Null Object).

Problem

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

Solution

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

##Example

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();

##Why Refactor

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

##How to Refactor

  1. أنشئ فئة فرعية (Subclass) من الفئة المعنية لتقوم بدور الكائن الفارغ (Null Object).

  2. في كلا الفئتين، أنشئ التابع isNull()، والذي سيعيد true للكائن الفارغ وfalse للفئة الحقيقية.

  3. ابحث عن جميع الأماكن التي قد يعيد فيها الكود قيمة null بدلاً من كائن حقيقي. وغيّر الكود ليعيد كائناً فارغاً.

  4. ابحث عن جميع الأماكن التي تتم فيها مقارنة متغيرات الفئة الحقيقية بالقيمة null. واستبدل هذه الفحوصات باستدعاء التابع isNull().

    • إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة null، فأعد تعريف هذه التوابع في فئة الكائن الفارغ وأدخل الكود من جزء else للشرط هناك. بعد ذلك، يمكنك حذف الجملة الشرطية بالكامل وسيتم تنفيذ السلوك المختلف عبر تعدد الأشكال (Polymorphism).
    • إذا لم تكن الأمور بهذه البساطة ولا يمكن إعادة تعريف التوابع، فتحقق مما إذا كان بإمكانك ببساطة استخراج العمليات التي كان من المفترض تنفيذها في حالة قيمة null إلى توابع جديدة في الكائن الفارغ. واستدعِ هذه التوابع بدلاً من الكود القديم في else كعمليات افتراضية.