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

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

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