Весняний РОЗПРОДАЖ

Інкапсуляція поля

Також відомий як: 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. Після того, як усі звернення до полів замінені, зробіть поле приватним.

Подальші кроки

«Інкапсуляція поля» є всього лише першим кроком до зближення даних і поведінки над цими даними. Після того, як ви створили прості методи доступу до полів, варто ще раз перевірити місця, де ці методи викликаються. Цілком можливо, код з цих ділянок доречніше виглядав би в самих методах доступу.