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