إدخال كائن فارغ (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
-
أنشئ فئة فرعية (Subclass) من الفئة المعنية لتقوم بدور الكائن الفارغ (Null Object).
-
في كلا الفئتين، أنشئ التابع
isNull()، والذي سيعيدtrueللكائن الفارغ وfalseللفئة الحقيقية. -
ابحث عن جميع الأماكن التي قد يعيد فيها الكود قيمة
nullبدلاً من كائن حقيقي. وغيّر الكود ليعيد كائناً فارغاً. -
ابحث عن جميع الأماكن التي تتم فيها مقارنة متغيرات الفئة الحقيقية بالقيمة
null. واستبدل هذه الفحوصات باستدعاء التابعisNull(). -
- إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة
null، فأعد تعريف هذه التوابع في فئة الكائن الفارغ وأدخل الكود من جزءelseللشرط هناك. بعد ذلك، يمكنك حذف الجملة الشرطية بالكامل وسيتم تنفيذ السلوك المختلف عبر تعدد الأشكال (Polymorphism). - إذا لم تكن الأمور بهذه البساطة ولا يمكن إعادة تعريف التوابع، فتحقق مما إذا كان بإمكانك ببساطة استخراج العمليات التي كان من المفترض تنفيذها في حالة قيمة
nullإلى توابع جديدة في الكائن الفارغ. واستدعِ هذه التوابع بدلاً من الكود القديم فيelseكعمليات افتراضية.
- إذا كانت توابع الفئة الأصلية يتم تشغيلها في هذه الجمل الشرطية عندما لا تساوي القيمة