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

3.8 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20241115074843.png

Проблема

У вас есть публичное поле

class Person {
  name: string;
}

Решение

Сделайте поле приватным и создайте для него методы доступа

class Person {
  private _name: string;

  get name() {
    return this._name;
  }
  setName(arg: string): void {
    this._name = arg;
  }
}

Причины рефакторинга

Одним из столпов объектного программирования является Инкапсуляция или возможность сокрытия данных объекта. Иначе все данные объектов были бы публичными, и другие объекты могли бы получать и модифицировать данные вашего объекта без его ведома. При этом отделяются данные от поведений, связанных с этими данными, ухудшается модульность частей программы и усложняется её поддержка

Достоинства

  • Если данные и поведения какого-то компонента тесно связанны между собой и находятся в одном месте в коде, вам гораздо проще поддерживать и развивать этот компонент
  • Кроме того, вы можете производить какие-то сложные операции, связанные с доступом к полям объекта

Когда нельзя применить

Встречаются случаи, когда инкапсуляция полей нежелательна из соображений, связанных с повышением производительности. Эти случаи очень редки, но иногда этот момент бывает очень важным. Например, у вас есть графический редактор, в котором есть объекты, имеющие координаты x и y. Эти поля вряд ли будут меняться в будущем. К тому же, в программе участвует очень много различных объектов, в которых присутствуют эти поля. Поэтому обращение напрямую к полям координат экономит значительную часть процессорного времени, которое иначе затрачивалось бы на вызовы методов доступа. Как иллюстрация этого исключения, существует класс Point в Java, все поля которого являются публичными.

Порядок рефакторинга

  1. Создайте геттер и сеттер для поля
  2. Найдите все обращения к полю. Замените получение значения из поля геттером, а установку новых значений в поле — сеттером
  3. После того как все обращения к полям заменены, сделайте поле приватным

Борется с запахом

Ссылки