инкапсуляция
#программирование

Зачем нужна инкапсуляция?

Недавно наткнулся на пост про отношение программистов к такой базовой штуке, как инкапсуляция. Собственно, все ее уважают и стараются соблюдать, но складывается впечатление, что не все до конца понимают, зачем оно все-таки нужно на самом деле. В этом посте попробую привести простую аналогию, чтобы у вас сразу отпало желание эту самую инкапсуляцию нарушать.

Суть проблемы

Ее довольно полно описывает картинка в заголовке поста. Вроде как есть приватный метод, который хочется вызвать извне, а вроде как и нельзя. Или же можно?

В общем, кто-то взял да спросил прямо: а почему, собственно, нельзя изменить видимость метода и сделать его public? Вопрос получил множество ответов, в основном в академическо-университетском стиле. То есть, вроде как ответ есть, но он исключительно формальный и не особо проясняет ситуацию.

Так почему же нельзя менять видимость метода?

Давайте рассмотрим несколько ответов из этого поста. Они вполне правильные сами по себе, но, повторюсь, они нисколько не проясняют ситуацию и не добавляют понимания вопрошающему.

Итак, ответы пользователей (цитирую).

Ну типа инкапсуляция

Мой любимый ответ, который порождает еще больше вопросов. Самое смешное, что ответ абсолютно верный, но… В общем, представьте:

– Папа, а почему небо синее?
Ну, типа атмосфера
– А почему трава зеленая?
Ну, типа хлорофилл

Вот и здесь такая же ситуация. Вроде коротко и по теме, но напрашивается другой вопрос: «а зачем она, эта инкапсуляция?». Понятно, что для того, чтобы скрыть детали реализации. А зачем скрывать детали реализации? Ну, и так далее.

Другой ответ:

сокрытие реализации, принципы ООП, все дела. Вроде если метод private — то значит, что он работает непосредственно с реализацией класса, а значит не должен выходить во внешку. Для этого есть public методы, которые должны работать во внешке всегда, хоть как ты меняй реализацию класса

Ребята, этот ответ офигенный. Он полностью правильный и даже довольно полный. Но опять же, он провоцирует другие вопросы. А почему private метод, который работает с реализацией класса, не должен ходить во внешку? А public метод может работать с реализацией класса? Опять же, ответ дан, но он чисто теоретический и без какой-либо практической аналогии. Другими словами, ответ нифига непонятный.

Третий ответ:

Потому что метод может быть сделан так, что он работает только изнутри. Наример когда ты дергаешь публичный метод, запускается какаянибудь инициация или проверки. А если дернешь сразу приватный, то может все полететь к чертям без этих проверок. Это как дом. Есть дверь, есть окно. Строители не предусматривают, что ктото будет ходить через окно

Самый полный и понятный из перечисленных выше. Но все равно он довольно сухой и чисто теоретический. Про дом аналогия совершенно не в тему вышла, увы. Но сам ответ мне нравится, чувак явно понимает, что к чему.

Пример про пиво и колбасу

Чтобы вся суть стала наиболее понятна, должно быть меньше теории и больше практики. Это относится к любому делу. Так давайте приведем практический пример, почему нельзя делать приватные методы публичными.

Итак, представьте, что вы после тяжелого рабочего дня возвращаетесь домой. На дворе пятница, завтра никуда не надо, настроение у вас превосходное. По пути вы решаете заскочить в пятерочку и купить колбасы с хлебом, а затем зайти в ближайший разливок и взять себе полторашку холодного пивка.

Вот вы стоите на кассе с хлебом и колбасой. Кассир пробивает товары и говорит: «С вас 150 рублей». Вы достаете из кармана кошелек, отсчитываете 150 рублей и заодно проверяете, что на пивко вам тоже хватит, и передаете деньги кассиру. Получив товар, вы уходите из магазина. Оплата — это ваш приватный метод.

А теперь давайте сделаем его публичным?

Вы стоите на кассе, перед вами колбаса и хлеб, и кассир снова вам говорит, что с вас 150 рублей. Только на этот раз он выходит из-за прилавка, сам лезет к вам в карман и выгребает оттуда деньги, презики и фотографию вашего ребенка. Вы выходите из пятерочки и направляетесь в разливок.

Стоя на кассе и предвкушая хороший вечер, вы слышите, что с вас еще 200 рублей. Вы лезете в кошелек и осознаете, что в нем вообще нет денег, кто-то туда плюнул и исчезла фотография вашего ребенка. Вы не можете расплатиться и не знаете, что делать. Вдруг вы осознаете, что кто-то извне (кассир из пятерочки, если быть точным) нарушил правило инкапсуляции и изменил ваше внутреннее состояние. И все из-за того, что ваш метод оплаты в предыдущем магазине вдруг стал публичным.

Заключение

Я думаю, в таком примере правило инкапсуляции становится гораздо понятнее, и у начинающих орлов прибавится понимания, почему его стоило бы придерживаться, верно?

В общем, почему бы нам всем не начать объяснять сложные штуки на простых примерах? Это гораздо проще для понимания, чем универские научные объяснения, которые делают и без того непонятные вещи еще более запутанными.

Понравилось? Подписывайтесь на меня в соцсетях!

 
Facebook
Twitter
VK
guest
0 Комментариев
Inline Feedbacks
View all comments
Social media & sharing icons powered by UltimatelySocial
0
Нравится? Оставьте комментарий!x
()
x