Что такое ООП (объектно-ориентированное программирование)

8d93b9758cb2485372d651274871024d

Тут вот какое дело, понимаю, что написаны тысячи, если не миллионы, книг и статей на тему… Сам я безработный разработчик предпенсионного возраста, нахожусь в поиске, и меня, хотя и редко, но приглашают на собеседование, где меня обязательно спросят про «основные принципы ООП», чем всегда ставят меня в тупик, я не знаю, что отвечать на этот вопрос.

Когда-то, лет 30 назад, мне посчастливилось поработать в одном очень продвинутом коллективе известного ВУЗа, и там один из научных руководителей регулярно приходил в бешенстве с конференций, на которых обсуждались видения ООП и подходы к реализациям, потому что его понимание сильно отличалось от коллег-участников конференций с других кафедр. Кстати сказать, он написал java-подобный язык, который вроде до сих пор с успехом используют. Этим воспоминанием я хочу подчеркнуть, что проблема не такая уж и новая, и не такая уж и надуманная.

В современных источниках об ООП-принципах вы непременно найдете тезис об инкапсуляции, наследовании и полиморфизме, тогда как на заре компьютерных наук ни один из разработчиков или компьютерных ученых ничего подобного вам бы не заявил. Наверняка здесь есть какая-то путаница.

Ну, посудите сами, парадигмы процедурного программирования основанные на теореме структурного программирования окончательно сформировались только к началу 70-х годов прошлого века, а первые языки ООП появились еще в начале 60-х годов. Но современное поколение, в основной своей массе, почему-то считает, что ООП — это что-то новое, и к тому же неудачное, и поэтому его надо срочно заменить чем-то типа Питона или на худой конец Скалы итп.

В этой связи встает вопрос: как же компьютерные ученые, разработчики первых языков ООП, представляли себе постановку задачи, и вообще, что это такое ООП?

Идея состояла в том, что мы в реальном мире каким-то образом манипулируем объектами, и пришли к выводу, что все, что мы для этого делаем — мы передаем сообщения объектам, и самое интересное, что нам совершенно все равно, что там дальше происходит с этим сообщением, но мы уверены, что оно будет обработано и нами будет получен результат обработки. Тогда ученые и задумались, как бы нам создать такие языки программирования, чтобы и в виртуальной среде можно было решать задачи используя подобный подход.

Например, когда еще не было электронной почты (многие даже не представляют, что такое было), люди писали письмо другу на бумаге, потом запечатывали его в конверт, писали на конверте адрес получателя и отправителя, потом несли конверт к почтовому ящику, опускали его туда, и ждали результат — либо «доставлено», либо «возврат отправителю». В данном примере мы имеем дело с объектом «почтовый ящик», мы передаем ему сообщение — опускаем письмо, другими словами: вызываем метод Result postBox.send (Letter letter);

Это и есть первый принцип ООП — он так и называется: Message Passing.

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

Дальше нам бы хотелось, чтобы почтовый ящик был таким, что в него можно было бы опускать письма любого типа: закзаные, открытки, микро бандероли …. типа того. И мы бы не соверашали дополнительных действий, а просто бросали письмо любого типа в один и тот же ящик и ни о чем не задумывались, не задумывались, как этот ящик будет обрабатывать разные типы. Т.е. на этапе создания почтового ящика мы не знаем какого типа письма будут в него опускать, ящик должен уметь обрабатывать любой тип письма без дополнительных на то уведомлений.

Переходя к программированию мы говорим, что на этапе компиляции тип объекта сообщения нам неизвестен, а узнаем мы этот тип только в рантайме — этот принцип ООП называется Late Binding, а никакой не полиморфизм. А полиморфизм — это всего лишь определенное поведение переменной.

Ну и наконец подходим к главному. В реальной жизни мы и понятия не имеем, как создается и как работает почтовый ящик, мы просто находим уже готовый объект и опускаем туда письмо. Надо сказать, что этот подход довольно долго не удавалось сформулировать и как-то его осмыслить, и только в середине 70-х годов английский компьютерный ученый Майкл Джексон (кстати Java-разработчики обязательно знают библиотеку для JSON-процессинга Jackson — она названа в его честь) описал паттерн, который мы знаем как IoC.

Вот мы и сформулировали три основных принципа ООП:

1. Message Passing

2. Late Binding

3. IoC

А то, о чем все говорят, — это просто приемы проектирования приложений с использованием языков объектно-ориентированного программирования.

Надеюсь, что интервьюеры прочитают этот мой опус и не будут больше задавать этот вопрос.

© Habrahabr.ru