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