Как я перестал бояться и научился любить инкапсуляцию и полиморфизм

В далеком 2001 году я уже разработал пару приложений как мне тогда казалось сносного качества и решил, что учиться дальше по обрывочным статьям из Интернета не имеет смысла, пошел на "Балку" (книжный рынок в Харькове) и купил книгу "Язык программирования С++" Стивена Прата. Эта книга собственно стала моим первым знакомством с ООП, она же отбила у меня охоту использовать ООП на долгое время.
Прата излагал материал подробно, четко и крайне нудно. При том, что Прата достаточно подробно описал все особенности ООП в С++ он умудрился обойти стороной такие мелочи как теорию ООП (не определял даже понятия наследования). Однако, он  дал определение полиморфизма функций (он же широко известен как перегрузка функций) и первое определение полиморфизма для меня выглядело так:
Полиморфизм функций — это расширение возможностей языка С, реализованное в С++. Аргументы, заданные по умолчанию, позволяют вам обратиться к одной и той же функции, воспользовавшись с этой целью различным числом аргументов.
И тогда, и сейчас это определение вызывает только одну мысль: "Это он со мной разговаривал?"
Определение объекта, к слову, отсутствовало как таковое, а вот определение класса на удивление было вполне вменяемым:
В языке С++ класс представляет собой платформу для перевода абстракции в тип, определяемый пользователем.
Почувствовав, что товарищ Прата пишет для жестких инженеров, а не школяров, я стал искать литературу полегче и нашел "Visual C++ 6: учебный курс" за авторством некоего С. Холзнера. С. Холзнер в отличии от Прата считал программирование исключительно прикладной дисциплиной, а потому вся книга состояла из многостраничных выкладок кода с комментариями в качестве описания (а что поделать, компакт-диски тогда еще были дороги). Холзнер в такие мелочи, как теория, не вдавался совсем: он объявлял классы, наследовался от них, филигранно управлял видимостью элементов класса, но ответы на вопросы "Что? Зачем? Почему?" оставлял за кадром. Выкладки действительно пригодились, поскольку сканер у меня в то время был.
Окончательно убедившись в том, что С++ не для меня и почувствовав легкий бриз, который веял в сторону Web разработки, я стал учить JavaScript, ASP и PHP одновременно (дикая смесь, смысла которой я до сих пор не могу понять). И на удивление именно изучая JavaScript, я нашел для себя первое вменяемое понятие объекта (познакомил меня с ним Келли Л Мэрдок):
Объект — это абстрактный контейнер для хранения данных.
Лучшего определения я не встречал по сей день. Не то, что бы оно охватывало все аспекты понятия объекта, но оно дает главное — определяет надсистему (контейнер) и функциональное отличие (хранение данных). И это действительно то, чем является объект.
Ни один из авторов, по которым я учил ASP и PHP не опускались до уровня теории. Да им было и не до того, они были заняты описанием всех возможным вариантов неправильно использовать конструкции языка, с целью побороть ошибки, возникающие при правильном их использовании (ООП в PHP это то еще баго-хранилище). Поскольку ООП в этих технологиях использовать было практически невозможно, то и вопрос его изучения не стоял.
Но пришел год 2006 и я перешел на Java. Только действительно разрабатывая на Java я почувствовал, что в моих знаниях наблюдается значительный разрыв между теорией и практикой ООП.
В 2008 году я нашел скан книги "Приемы объектно-ориентированного проектирования. Паттерны проектирования". Книга как не странно была того самого 2001 года издания (в котором я впервые познакомился с ООП). Издание представляло собой каталог паттернов, которых сейчас достаточно много, но в ней был огромный плюс — глоссарий. Именно в ней я встретил самые простые и понятные определения:
Полиморфизм — способность подставлять во время выполнения вместо одного объекта другой с совместимым интерфейсом.
Инкапсуляция — результат сокрытия представления и реализации в объекте.
Не скажу, что на этом мои поиски завершились. Были еще статьи из Википедии, заметки с rsdn и многое другое. В результате, я вывел для себя следующие определения:
Инкапсуляция — сокрытие деталей реализации за интерфейсом.
Полиморфизм — взаимозаменяемость реализаций.
Безусловно эти определения не претендуют на научную полноту, однако они в полной мере отражают мое представление об этих понятиях.
Published with Blogger-droid v1.7.4