#рефакторинг #методы_рефакторинга ![[Pasted image 20241115074843.png]] ### **Проблема** У вас есть публичное поле ```typescript class Person { name: string; } ``` ### **Решение** Сделайте поле приватным и создайте для него методы доступа ```typescript class Person { private _name: string; get name() { return this._name; } setName(arg: string): void { this._name = arg; } } ``` ### **Причины рефакторинга** Одним из столпов объектного программирования является _Инкапсуляция_ или возможность сокрытия данных объекта. Иначе все данные объектов были бы публичными, и другие объекты могли бы получать и модифицировать данные вашего объекта без его ведома. При этом отделяются данные от поведений, связанных с этими данными, ухудшается модульность частей программы и усложняется её поддержка ### **Достоинства** - Если данные и поведения какого-то компонента тесно связанны между собой и находятся в одном месте в коде, вам гораздо проще поддерживать и развивать этот компонент - Кроме того, вы можете производить какие-то сложные операции, связанные с доступом к полям объекта ### **Когда нельзя применить** Встречаются случаи, когда инкапсуляция полей нежелательна из соображений, связанных с повышением производительности. Эти случаи очень редки, но иногда этот момент бывает очень важным. Например, у вас есть графический редактор, в котором есть объекты, имеющие координаты `x` и `y`. Эти поля вряд ли будут меняться в будущем. К тому же, в программе участвует очень много различных объектов, в которых присутствуют эти поля. Поэтому обращение напрямую к полям координат экономит значительную часть процессорного времени, которое иначе затрачивалось бы на вызовы методов доступа. Как иллюстрация этого исключения, существует класс [Point](http://docs.oracle.com/javase/7/docs/api/java/awt/Point.html) в Java, все поля которого являются публичными. ### **Порядок рефакторинга** 1. Создайте геттер и сеттер для поля 2. Найдите все обращения к полю. Замените получение значения из поля геттером, а установку новых значений в поле — сеттером 3. После того как все обращения к полям заменены, сделайте поле приватным ### **Борется с запахом** - [[Классы данных]] ### **Ссылки** - https://refactoring.guru/ru/encapsulate-field - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]