Введение Null-объекта.
Из-за того, что некоторые методы возвращают null вместо реальных объектов, у вас в коде присутствует множество проверок на null.
Вместо null возвращайте Null-объект, который предоставляет поведение по умолчанию.
##Пример
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 на Null-объект.
customer = (order.customer != null) ?
order.customer : new NullCustomer();
// Null-объект используется так же, как обычный подкласс.
plan = customer.getPlan();##Зачем делать рефакторинг
Десятки проверок на null усложняют и засоряют код.
##Как делать рефакторинг
-
Из интересующего вас класса создайте подкласс, который будет выполнять роль Null-объекта.
-
В обоих классах создайте метод
isNull(), который будет возвращатьtrueдля Null-объекта иfalseдля реального класса. -
Найдите все места, где код может вернуть
nullвместо реального объекта. Измените этот код так, чтобы он возвращал Null-объект. -
Найдите все места, где переменные реального класса сравниваются с
null. Замените такие проверки вызовом методаisNull(). -
Теперь упростите сами условные операторы:
- Если в этих условных операторах при значении не равном
nullвыполняются методы исходного класса, переопределите эти методы в Null-классе и вставьте туда код изelseчасти условия. После этого условный оператор можно будет вообще удалить, а разное поведение будет осуществляться за счёт полиморфизма. - Если не все так просто, и методы переопределить не получается, посмотрите, нельзя ли просто вынести операции, которые должны были выполняться при значении, равном
null, в новые методы Null-объекта. Вызывайте эти методы вместо старого кода вelseкак операции по умолчанию.
- Если в этих условных операторах при значении не равном