Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Введение частного случая (Introduce Special Case).md
2026-02-23 19:52:05 +03:00

58 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20250207090733.png]]
### **Проблема**
Из-за того, что некоторые методы возвращают null вместо реальных объектов, у вас в коде присутствует множество проверок на null.
```typescript
if (customer == null) {
plan = BillingPlan.basic();
}
else {
plan = customer.getPlan();
}
```
### **Решение**
Вместо null возвращайте Null-объект, который предоставляет поведение по умолчанию.
```typescript
class NullCustomer extends Customer {
isNull(): boolean {
return true;
}
getPlan(): Plan {
return new NullPlan();
}
// Some other NULL functionality.
}
// Replace null values with Null-object.
let customer = (order.customer != null) ?
order.customer : new NullCustomer();
// Use Null-object as if it's normal subclass.
plan = customer.getPlan();
```
### **Причины рефакторинга**
Десятки проверок на null усложняют и засоряют код.
### **Недостатки**
- За отказ от условных операторов вы платите ещё одним новым классом.
### **Порядок рефакторинга**
1. Из интересующего вас класса создайте подкласс, который будет выполнять роль Null-объекта.
2. В обоих классах создайте метод isNull(), который будет возвращать true для Null-объекта и false для реального класса.
3. Найдите все места, где код может вернуть null вместо реального объекта. Измените этот код так, чтобы он возвращал Null-объект.
4. Найдите все места, где переменные реального класса сравниваются с null. Замените такие проверки вызовом метода isNull().
5.
- Если в этих условных операторах при значении не равном null выполняются методы исходного класса, переопределите эти методы в Null-классе и вставьте туда код из else части условия. После этого условный оператор можно будет вообще удалить, а разное поведение будет осуществляться за счёт полиморфизма.
- Если не все так просто, и методы переопределить не получается, посмотрите, можно ли просто выделите операции, которые должны были выполняться при значении равном null в новые методы Null-объекта. Вызывайте эти методы вместо старого кода в else как операции по умолчанию.
### **Борется с запахом**
- [[Повторяющиеся switch]]
- [[Временное поле]]
### **Ссылки**
- https://refactoring.guru/ru/introduce-null-object
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]