Введение Null-объекта.
Problem
Из-за того, что некоторые методы возвращают null вместо реальных объектов, у вас в коде присутствует множество проверок на null.
Solution
Вместо null возвращайте Null-объект, который предоставляет поведение по умолчанию.
##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();
}
// Some other NULL functionality.
}
// Replace null values with Null-object.
customer = (order.customer != null) ?
order.customer : new NullCustomer();
// Use Null-object as if it's normal subclass.
plan = customer.getPlan();##Why Refactor
Десятки проверок на null усложняют и засоряют код.
##How to Refactor
-
Из интересующего вас класса создайте подкласс, который будет выполнять роль Null-объекта.
-
В обоих классах создайте метод
isNull(), который будет возвращатьtrueдля Null-объекта иfalseдля реального класса. -
Найдите все места, где код может вернуть
nullвместо реального объекта. Измените этот код так, чтобы он возвращал Null-объект. -
Найдите все места, где переменные реального класса сравниваются с
null. Замените такие проверки вызовом методаisNull(). -
- Если в этих условных операторах при значении не равном
nullвыполняются методы исходного класса, переопределите эти методы в Null-классе и вставьте туда код изelseчасти условия. После этого условный оператор можно будет вообще удалить, а разное поведение будет осуществляться за счёт полиморфизма. - Если не все так просто, и методы переопределить не получается, посмотрите, можно ли просто выделите операции, которые должны были выполняться при значении равном
nullв новые методы Null-объекта. Вызывайте эти методы вместо старого кода вelseкак операции по умолчанию.
- Если в этих условных операторах при значении не равном