Инкапсуляция- это сокрытие ?
moderator E7
Всем привет ! Сегодня я решил обсудить такую насущную проблему в ООП как инкапсуляция и сокрытие данных и является ли первое вторым. Давайте разбираться!
Парадигма ООП - Инкапсуляция
Изначально, ООП стоит на трёх парадигмах:
- Инкапсуляция
- Наследование
- Полиморфизм
В некоторых источниках количество парадигм колеблется от 3 до 9 , но в данном случае нам не обязательно знать все возможные парадигмы.
Итак , сегодня нас интересует не количество парадигм , а почему нельзя говорить, что "инкапсуляция это сокрытие". Хочу расставить все точки над i в вопросе важности данной темы. Для начала начнём с инкапсуляции , дадим ей правильное определение:
Инкапсуляция - это механизм языка , позволяющий связывать данные и методы, работающие с этими данными, в единый объект.
А теперь посмотрим определение, которое этому механизму дают некоторые программисты:
Инкапсуляция - это механизм языка , позволяющий ограничить доступ одних компонентов программы к другим.
Прочитав данные определения и не вникнув в тему вопроса, кажется, что дефениции слов различны, и, если углубиться в тему, то всё выше сказанное может показать правдой , но она будет ей, лишь отчасти.
На следующем примере я покажу реализацию инкапсуляции на ЯП Python:

Стоит запомнить, что в Python, Smalltalk и в других подобных языках нет такого понятия как сокрытие , но есть чистая инкапсуляция как в примере выше.
Что такое сокрытие ?
Стандартное определение сокрытия данных звучит так:
Сокрытие — принцип проектирования, заключающийся в разграничении доступа различных частей программы ко внутренним компонентам друг друга. В одних языках термин тесно пересекается с инкапсуляцией, в других эти понятия абсолютно независимы.
В таких языках как C#, Java модификаторы доступа имеют больший функционал нежели в Python , поэтому и ограничиваются они не только модификаторами доступа public , protected и private , но и другими.
Давайте я покажу на примере C#-кода:

На данном скриншоте указанны модификаторы доступа, но можно обойтись и без них:

Вывод
Я предоставил вам информацию, на основе которой можно сделать несколько выводов:
- Инкапсуляция обеспечивает сокрытие, то есть имеет такой механизм как сокрытие.
- В ЯП C# , Java , C++ и т.д. имеется инкапсуляция с сокрытием , а в Python только чистая инкапсуляция.
- По большей части сокрытие обеспечивается модификаторами доступа.
Это три основных вывода которые мы сделали. Таким образом, мы видим, что ситуация напрямую зависит от ЯП.
В заключение хотелось бы сформулировать своё определение слову инкапсуляция:
Инкапсуляция - это механизм, позволяющий объединить данные и методы, работающие с этими данными в единый объект, и скрыть детали реализации от пользователя.
С любовью от E7 ;)