58 lines
3.4 KiB
Markdown
58 lines
3.4 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[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]] |