Інкапсуляція поля
Інкапсуля́ція по́ля (англ. Encapsulate Field) — прийом рефакторингу, що дозволяє полегшити роботу з даними, покращити модульність частин програми та полегшити її підтримку. Забезпечує зближення даних і поведінки над цими даними.
Проблема
Є публічне поле.
C#
class Person
{
public string name;
}
class Person
{
public:
std::string name;
};
Рішення
Зробити поле приватним і створити для нього методи доступу чи властивість.
C#
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
class Person
{
private:
std::string name;
public:
const std::string &get_name() const
{
return name;
}
void set_name(const std::string &new_name)
{
name = new_name;
}
};
Причини рефакторингу
Одним із принципів об'єктного програмування є інкапсуляція або можливість приховання даних об'єкту. Інакше всі дані об'єктів були б публічними, а інші об'єкти могли б отримувати та модифікувати дані об'єкту без його відома. При цьому розділяються дані та поведінка, яка пов'язана з цими даними, погіршується модульність частин програми та ускладнюється її підтримка.
Переваги
- Якщо дані й поведінка якогось компоненту тісно пов'язані між собою і знаходяться в одному місці коду, то набагато простіше буде підтримувати та розвивати цей компонент.
- Можна робити якісь складні операції, пов'язані з доступом до полів об'єкту.
Випадки, коли застосувати не можна
Трапляються випадки, коли інкапсуляція полів небажана з міркувань підвищення швидкодії. Ці випадки дуже рідкісні, але іноді цей момент буває дуже важливим.
Наприклад, є графічний редактор, в якому є об'єкти, що мають координати x і y. Ці поля навряд чи змінюватимуться в майбутньому. До того ж, в програмі бере участь дуже багато різних об'єктів, в яких є присутніми ці поля. Тому звернення безпосередньо до полів координат економить значну частину процесорного часу, який інакше витрачався б на виклики методів доступу.
Порядок рефакторингу
- Створити властивості (геттер і сеттер) для поля.
- Знайти усі звернення до поля. Замінити отримання значення з поля — геттером, а установку нових значень в полі - сеттером.
- Після того, як усі звернення до полів замінені, зробити поле приватним.
- Виконати компіляцію і тестування.
Подальші кроки
Інкапсуляція поля є всього лише першим кроком до зближення даних і поведінки над цими даними. Після того, як було створено прості методи доступу до полів, варто ще раз перевірити місця, де ці методи викликаються. Цілком можливо, код з цих ділянок доречніше виглядав би в самих методах доступу.
Схожі рефакторинги
- Самоінкапсуляція поля
Бореться з запахом
- Клас даних