Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

Инкапсуляция поля

Также известен как: Encapsulate Field

Проблема

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

Решение

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

До
class Person {
  public String name;
}
После
class Person {
  private String name;

  public String getName() {
    return name;
  }
  public void setName(String arg) {
    name = arg;
  }
}
До
class Person 
{
  public string name;
}
После
class Person 
{
  private string name;

  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}
До
public $name;
После
private $name;

public getName() {
  return $this->name;
}

public setName($arg) {
  $this->name = $arg;
}
До
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. После того как все обращения к полям заменены, сделайте поле приватным.

Последующие шаги

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