Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Инкапсуляция переменной (Encapsulate Variable).md
2026-02-23 19:52:05 +03:00

50 lines
3.8 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 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]]