Інкапсуля́ція по́ля () — прийом рефакторингу, що дозволяє полегшити роботу з даними, покращити модульність частин програми та полегшити її підтримку. Забезпечує зближення даних і поведінки над цими даними.
Проблема Є публічне поле.C# class Person { public string name; } C++ class Person { public: std::string name;
Рішення Зробити поле приватним і створити для нього методи доступу чи властивість.C# class Person { private string name;
public string Name
get { return name; } set { name = value; }
C++ 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. Ці поля навряд чи змінюватимуться в майбутньому. До того ж, у програмі бере участь дуже багато різних об'єктів, у яких є ці поля. Тому звернення безпосередньо до полів координат економить значну частину процесорного часу, який інакше витрачався б на виклики методів доступу.
Порядок рефакторингу Створити властивості (геттер і сеттер) для поля. Знайти усі звернення до поля. Замінити отримання значення з поля — геттером, а установку нових значень в полі - сеттером. Після того, як усі звернення до полів замінені, зробити поле приватним. Виконати компіляцію і тестування.
Подальші кроки Інкапсуляція поля є всього лише першим кроком до зближення даних і поведінки над цими даними. Після того, як було створено прості методи доступу до полів, варто ще раз перевірити місця, де ці методи викликаються. Цілком можливо, код з цих ділянок доречніше виглядав би в самих методах доступу.
Схожі рефакторинги Самоінкапсуляція поля Бореться з запахом Клас даних Посилання Encapsulate Field Encapsulate Field Інкапсуляція поля Рефакторинг для инкапсуляции поля (C#)