Инкапсуляция php: Инкапсуляция — PHP: Введение в ООП

Содержание

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

Также известен как: 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; }
  }
}

После

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. После того как все обращения к полям заменены, сделайте поле приватным.

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

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

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш интерактивный курс. Он гораздо более интересный, чем банальный текст.