На цьому уроці ми поговоримо про ще один з базових принципів ООП - інкапсуляції.
Скажу відразу, що ця тема складна для розуміння новачкові, і для гарного освоєння теми, прочитати цей урок або будь-який інший недостатньо. Розуміння інкапсуляції прийде з практикою. На цьому уроці я постараюся направити вас на правильне мислення.
Інкапсуляція - це приховування реалізації об'єкта від кінцевого користувача, яке в Сі-шарп здійснюється за допомогою модифікаторів доступу (private, public ...). Кінцевим користувачем об'єкта тут виступає або об'єкт спадкоємець, або програміст.
Коли ми оголошуємо якийсь член класу приватним, і створюємо об'єкт такого класу, доступ до цього члену закритий для програміста, це і є прихованням реалізації.
А тепер давайте будемо розбиратися, навіщо потрібна інкапсуляція, навіщо щось приховувати. Уявімо що об'єкт це яка-небудь річ (телефон, автомобіль ...), так ось інкапсуляція дозволяє створити корпус цієї речі. Візьмемо для прикладу мобільний телефон. У нього є різні кнопки, інші елементи інтерфейсу, і те, що всередині (схеми, з'єднання ...). Якщо порівнювати з об'єктом в програмуванні, то елементи інтерфейсу це публічні методи, а те що всередині - приватні члени об'єкта. Коли ми натискаємо яку-небудь кнопку на телефоні, нам немає необхідності знати, які при цьому процеси відбуваються всередині телефону, ми чекаємо тільки результату. У програмуванні ми викликаємо якийсь метод, цей метод може викликати інший, внутрішній, допоміжний метод, і в результаті ми отримуємо результат. Цей допоміжний метод немає сенсу викликати безпосередньо, це може зініціювати якийсь збій в програмі, тому доступ до нього варто обмежити.
От уявіть собі телевізор без корпусу. Людина хоче перемкнути канал, підходить до телевізора, і замість того, щоб натиснути кнопку перемикання каналу, він висмикує якийсь проводок (ну не мав він ніколи справи з телевізорами або п'яний). Канал не переключився, результат не той. У програмуванні це рівноцінно викликом допоміжного методу, непризначених для прямого виклику. Людині властиво помилятися, інкапсуляція дозволяє позбавити програміста від допущення подібного роду помилок.
Для реалізації інкапсуляції в Сі-шарп використовуються модифікатори доступу. Які вони бувають я вже писав в уроці Класи в Сі-шарп, але повторюся і тут:
- Public - доступ до члена можливий з будь-якого місця однієї збірки, або з іншої збірки, на яку є посилання;
- Protected - доступ до члена можливий тільки усередині класу, або в класі-спадкоємця (при спадкуванні);
- Internal - доступ до члена можливий тільки з збірки, в якої він проголошений;
- Private - доступ до члена можливий тільки всередині класу;
- Protected internal - доступ до члена можливий з однієї збірки, або з класу-спадкоємця інший збірки.
Який модифікатор і де використовувати, так однозначно пояснити неможливо. Все залежить від конкретного завдання, ситуації. Знаю, що вибір модифікатора є однією з найчастіших проблем новачків. Скажу, що для початку головне розібратися з трьома модифікаторами - public, protected і private. Вся вище написана теорія повинна допомогти вам у їх освоєнні, а закріплення знань прийде тільки з практикою. Але одну підказку таки скажу. Прості поля класу майже ніколи не оголошуються як public, дотримуйтеся цієї норми.
А для тих, хто думає «Це ж я пишу програму, я все в ній розумію, і знаю, що і як використовувати, навіщо з цими модифікаторами заморочуватися», скажу що в маленьких програмах, які ви пишете один, можна було б на це уваги не звертати, але якщо справа дійде до програм більших, якщо ви будете працювати в команді, на роботі, і ваш код будуть використовувати інші, без інкапсуляції не обійтися.
В якості домашнього завдання, я попрошу вас проаналізувати програми, які ви писали до цього, зрозуміти чи правильно ви там використовували модифікатори доступу. Якщо не впевнені, як має бути, запитуйте в коментарях.