Інкапсуляція поля
Проблема
У вас є публічне поле.
Рішення
Зробіть поле приватним і створіть для нього методи доступу.
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, усі поля якого є публічними.
Порядок рефакторингу
-
Створіть геттер і сеттер для поля.
-
Знайдіть усі звернення до поля. Замініть отримання значення з поля — геттером, а установку нових значень в полі — сеттером.
-
Після того, як усі звернення до полів замінені, зробіть поле приватним.
Подальші кроки
«Інкапсуляція поля» є всього лише першим кроком до зближення даних і поведінки над цими даними. Після того, як ви створили прості методи доступу до полів, варто ще раз перевірити місця, де ці методи викликаються. Цілком можливо, код з цих ділянок доречніше виглядав би в самих методах доступу.