Інкапсуляція – це одна з трьох основних особливостей об’єктно-орієнтованого програмування (ООП). Дві інші – поліморфізм і наслідування. Разом вони складають базу ООП, визначає цілий спектр можливостей написання програм на різних мовах, використовуючи ці три принципи. Об’єктно-орієнтовані мови, у свою чергу, зобов’язані чітко їм слідувати.

Основи ООП

Об’єктно-орієнтоване програмування стоїть на трьох китах свого світобудови:

  • Поліморфізм, відповідає на питання, як певну мову програмування трактує об’єкти, що мають між собою зв’язок, подібним чином.
  • Успадкування, дає відповідь, яким чином відбувається стимуляція використання коду багаторазово.
  • Інкапсуляції, що є відповіддю на питання, як відбувається приховування реалізації, а значить і збереження цілісності даних.

Термінологія

Інкапсуляція (програмування) – це використання модифікаторів доступу з метою приховування частин програмного коду від кінцевого користувача. Під ним, в свою чергу, мається на увазі розробник або наступний об’єкт.

Суть поняття “інкапсуляція”

Дефініція визначає, що під инкапсуляцией мається на увазі приховування всього або частини програмного коду. Суть поняття “інкапсуляція” полягає в маніпулюванні модифікаторами доступу. Це означає, що розробник сам вирішує, які властивості, методи і класи будуть відкриті класу-клієнту, а які – приховані.

Модифікатори доступу

Існують такі модифікатори доступу, якими, серед інших, здатна манипуляривать інкапсуляція (програмування Java):

  • public (“паблік” – публічний, відкритий доступ) – загальний доступ як для поточних об’єктів і класів, так і для зовнішнього світу;
  • private (“прайват” – приватний, приватний, прихований доступ) – закритий доступ, суть якого цілком протилежна попередній. Забезпечує доступ тільки з поточного класу;
  • protected (“протектед” – захищений, полускрытый, доступ) – доступ для поточного класу і похідних від нього;
  • за замовчуванням – неуказанный модифікатор доступу передбачає, що поле/метод видно для всього поточного пакету класів.

У мові C# (“Сі Шарп”), крім зазначених (крім останнього), є ще такі модифікатори:

  • internal (“интернал” – внутрішній доступ) – загальнодоступність в поточному зборі, закритий доступ по всіх інших випадках;
  • internal protected (“интернал протектед” – внутрішній захищений доступ) – об’єднання двох модифікаторів в один, в якому проявляються властивості обох з них.

Роль інкапсуляції

Механізм інкапсуляції дозволяє виключити зовнішній вплив на програмний код і невірне використання закладених у ньому даних. Це відбувається за рахунок об’єднання коду і даних в одне ціле.

Об’єкт і інкапсуляція

Об’єднання реалізації програмного модуля і даних, закладених в коді, в програмуванні називається об’єктом. Суть зв’язку його з инкапсуляцией полягає в тому, що саме така методика дозволяє підтримувати і забезпечувати цілісне функціонування даного механізму.

Перевага інкапсуляції

Інкапсуляція – це спосіб спростити процес кодування. Численні рядки коду залишаються “за лаштунками”, а в основному класі робота йде з екземплярами об’єктів.

Ідея захисту даних

Інкапсуляція – це механізм, який реалізує ідею захисту даних. Програмна логіка об’єктно-орієнтованого програмування побудована на базі того, що велика частина даних буде прихована модифікатором доступу private (приватний, приватний) або protected (захищений). Зовнішній світ, клієнт випадково або навмисно не зможуть зашкодити реалізації програмного модуля. Оскільки насправді зробити це дуже легко, навіть не навмисно, інкапсуляція – це дуже хороший принцип.

Одиниці інкапсуляції

Клас, як основна одиниця інкапсуляції, описує дані містить код, який здатний оперувати цими даними. Також він є базою для побудови об’єкта. Останній, у свою чергу, представлений екземпляр класу.

Використовується також така термінологія:

  • члени – це код і дані, що входять в клас;
  • поля, або змінні екземпляра – так називаються дані, які визначає клас;
  • функції-члени – в них міститься сам код. Функції-члени – загальна назва. Окремий випадок – методи.

Інкапсуляція на конкретному прикладі

Інкапсуляція (програмування) приклад:

* Примітка:

description – це опис методу/властивості/змінної, тобто коментування того, що, власне, відбувається в програмі. Продемонстровано за допомогою відкриваються/закриваються тегів

using System;

namespace OOPLibrary.Auto

{

///

/// Цей клас призначений для того, щоб описувати властивості і дії автомобіля

///

public class Auto

{

///

/// Змінна, створена для того, щоб в неї записувати, скільки автомобілю років, так як зовнішнє втручання в цю властивість розробник вважає зайвим

/// виділяється модифікатором private, тобто закритий, приватний доступ (див. опис вище).

///

private int _age;

///

/// Булевская змінна (тільки два можливих значення – або так, або ні), яка описує, рухається автомобіль на даний момент

/// Вона також не повинна бути відкрита для кінцевого користувача, ким би він не був. Тому і цієї змінної присвоюється закритий модифікатор доступу “прайват”

///

private bool _isMoving;

///

/// В даній строкової змінної повинна міститися інформація про колір автомобіля. Він може зазнавати змін з боку зовнішнього впливу

/// тому для Кольори вибрано модифікатор відкритого доступу “паблік”.

///

public string Color;

///

/// В даному конкретному випадку допускаємо, що ім’я автомобіля теж можна міняти

/// присвоюється модифікатор паблік (відкритий доступ для всіх, незалежно від класу чи складання).

///

public string Name;

///

/// Відкривається конструктор класу і всі властивості, виражені змінними і задані трохи раніше, отримують свої значення

///

public Auto()

{

_age = 5;

_isMoving = false;

Color = “Purple”;

Name = “Шкода Октавіа”;

}

///

/// Метод реалізує повернення значення віку авто. Навіщо це необхідно?

/// закритий модифікатор доступу не робить його можливим для зміни клієнтом.

///

/// Повертає вік автомобіля.

public string GetAge()

{

return “На даний момент обраної машині” + _age + ” років.”;

}

///

/// Якщо автомобіль не рухається, цей метод реалізує старт руху. Виконується перевірка змінної, обознающей, в якому стані знаходиться автомобіль (їде він чи ні), і, залежно від результатів, виконується відповідна дія/виводиться відповідне повідомлення.

///

public void Start()

{

if (_isMoving)

{

Console.WriteLine(“Рух вже було розпочато”);

}

else

{

_isMoving = true;

Console.WriteLine(“На старт, увага.. Вперед! Поїхали!”);

}

}

///

/// Якщо рух було розпочато, то цей метод його зупиняє. Та ж програмна логіка, що й у попередньому розглянутому випадку.

///

public void Stop()

{

if (_isMoving)

{

_isMoving = false;

Console.WriteLine(“Стоп, машина”);

}

else

{

Console.WriteLine(“Помилка. Автомобіль і так стоїть на місці, не рухається”);

}

}

///

/// Здійснюється поворот наліво, якщо має місце руху автомобіля

///

public void MoveLeft()

{

if (_isMoving)

{

Console.WriteLine(“Здійснено поворот ліворуч”);

}

else

{

Console.WriteLine(“Помилка. Автомобіль стоїть на місці. Функція повороту на даний момент недоступна”);

}

}

///

/// Аналогічний метод з поворотом направо

///

public void MoveRight()

{

if (_isMoving)

{

Console.WriteLine(“Поворот направо було здійснено успішно”);

}

else

{

Console.WriteLine(“Помилка. Автомобіль ще не рухався з місця. Поворот направо є на даний момент дією, неможливим для виконання.”);

}

}

}

}

НАПИСАТИ ВІДПОВІДЬ

Please enter your comment!
Please enter your name here