#рефакторинг #методы_рефакторинга ![[Pasted image 20250131084410.png]] ### **Проблема** Поле используется в другом классе больше, чем в собственном. ```javascript class Customer { get plan() {return this._plan;} get discountRate() {return this._discountRate;} } ``` ### **Решение** Создайте поле в новом классе и перенаправьте к нему всех пользователей старого поля. ```javascript class Customer { get plan() {return this._plan;} get discountRate() {return this.plan.discountRate;} } ``` ### **Причины рефакторинга** Зачастую поля переносятся как часть [[Извлечение класса (Extract Class)|извлечение одного класса из другого]]. Решить, в каком из классов должно остаться поле, бывает непросто. Поле должно быть там, где находятся методы, которые его используют (либо там, где этих методов больше). ### **Порядок рефакторинга** 1. Если поле публичное, вам будет намного проще совершить рефакторинг, если вы сделаете его приватным и предоставите публичные методы доступа (для этого можно использовать рефакторинг инкапсуляция поля). 2. Создайте такое же поле с методами доступа в классе-приёмнике 3. Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект. Если нет — нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя. 4. Замените все обращения к старому полю на соответствующие вызовы методов в классе-получателе. Если поле не приватное, проделайте это и в суперклассе, и в подклассах. 5. Удалите поле в исходном классе ### **Борется с запахом** - [[Стрельба дробью]] - [[Параллельные иерархии наследования]] - [[Неуместная близость]] ### **Ссылки** - https://refactoring.guru/ru/move-field - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]