إدخال كائن فارغ (Introduce Null Object).
المشكلة
نظراً لأن بعض التوابع تعيد قيمة null بدلاً من كائنات حقيقية، فإن لديك العديد من فحوصات التحقق من null في الكود.
الحل
بدلاً من null، أعد كائناً فارغاً (Null Object) يقدم السلوك الافتراضي.
##مثال
قبل
if (customer == null) {
plan = BillingPlan.basic();
}
else {
plan = customer.getPlan();
}بعد
class NullCustomer extends Customer {
boolean isNull() {
return true;
}
Plan getPlan() {
return BillingPlan.basic();
}
// سلوكيات أخرى للكائن الفارغ.
}
// استبدال قيم null بكائن فارغ (Null-object).
customer = (order.customer != null) ?
order.customer : new NullCustomer();
// استخدام الكائن الفارغ كأنه فئة فرعية عادية.
plan = customer.getPlan();##لماذا نعيد الهيكلة
عشرات الفحوصات للتحقق من قيمة null تجعل كودك أطول وأكثر قبحاً.
##كيفية إعادة الهيكلة
-
أنشئ فئة فرعية (Subclass) من الفئة المعنية لتقوم بدور الكائن الفارغ (Null Object).
-
في كلا الفئتين، أنشئ التابع
isNull()، والذي سيعيدtrueللكائن الفارغ وfalseللفئة الحقيقية. -
ابحث عن جميع الأماكن التي قد يعيد فيها الكود قيمة
nullبدلاً من كائن حقيقي. وغيّر الكود ليعيد كائناً فارغاً. -
ابحث عن جميع الأماكن التي تتم فيها مقارنة متغيرات الفئة الحقيقية بالقيمة
null. واستبدل هذه الفحوصات باستدعاء التابعisNull(). -
بعد ذلك، بسّط الجمل الشرطية نفسها:
- إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة
null، فأعد تعريف هذه التوابع في فئة الكائن الفارغ وأدخل الكود من جزءelseللشرط هناك. بعد ذلك، يمكنك حذف الجملة الشرطية بالكامل وسيتم تنفيذ السلوك المختلف عبر تعدد الأشكال (Polymorphism). - إذا لم تكن الأمور بهذه البساطة ولا يمكن إعادة تعريف التوابع، فتحقق مما إذا كان بإمكانك ببساطة استخراج العمليات التي كان من المفترض تنفيذها في حالة قيمة
nullإلى توابع جديدة في الكائن الفارغ. واستدعِ هذه التوابع بدلاً من الكود القديم فيelseكعمليات افتراضية.
- إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة