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

Когда-то, лет 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

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

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

Комментарии (16)


  1. JBFW
    17.01.2025 13:56

    "Это другие обьекты" )

    А то, о чем вы говорите - вас сейчас тапками закидают, потому что у вас "тип посылки заранее не определен", а сейчас в моде "типизация": ваша посылка в почтовый ящик не пройдет, потому что этот ящик строго под определенную форму посылки.


    1. EvgenyKho Автор
      17.01.2025 13:56

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


  1. WaterSmith
    17.01.2025 13:56

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

    К слову, вы пишете:

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

    Не понятно, почему вы противопоставляете ООП и Питон со Скалой? Это вообще сравнение теплого с мягким.


    1. EvgenyKho Автор
      17.01.2025 13:56

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

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


  1. netricks
    17.01.2025 13:56

    Вот это правильная статья про ООП

    Я ещё позволю себе добавить, что ООП есть воплощение общеинженерного принципа декомпозиции и убежать от него никуда не получится. Хотя бы по той причине, что мы, люди, думаем объектами


  1. Indemsys
    17.01.2025 13:56

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

    Например, в малых встраиваемых системах. Вот буквально вчера увидел анонс от STMicroelectronics (ST) о том, что они перевели свою библиотеку по управлению моторами с C++ на C, и это значительно упростило её (с их слов).


    1. netricks
      17.01.2025 13:56

      Таки переход от с++ к си не означает отказа от ооп. Как известно, эталонное применение ооп, vfs ядра линукс - это вполне себе бодрый си


      1. JBFW
        17.01.2025 13:56

        Всякая вещь, будучи применена на своем месте, неминуемо приносит пользу (с) К.Прутков, 19 век

        К сожалению люди часто любят приводить всё к одному знаменателю, запихивая ООП (то, которое с классами-наследованием-полиморфизмом) туда где оно нафиг не нужно.


        1. netricks
          17.01.2025 13:56

          Давайте зацепимся за эту мысль.

          По сути у нас есть две разных сущности с одним названием.

          Есть ООП как "Средства поддержки ООП" - это вот про классы, инкапсуляцию, композицию , полиморфизм и прочее.

          А есть ООП как парадигма, как способ мышления и филосовский инженерный принцип

          И это конечно же не одно и тоже. Тем не менее, по устоявшейся традиции и то и другое называется ООП


      1. tbl
        17.01.2025 13:56

        При переходе на C придется забыть про хэш-таблицы: "Библиотеки от проекта GNOME, которые написаны в парадигме gobject - это г... лютое, там на каждый чих по 10 аллокаций памяти, и линейный перебор по куче связанных списков.

        А все потому, что в С еще не изобрели хеш-таблицу".


        1. netricks
          17.01.2025 13:56

          Помойму это очень странное заявление... во первых я не понимаю, какое отношение это имеет к теме, а во вторых, никаких проблем с использованием хештаблиц в си нет


  1. Lewigh
    17.01.2025 13:56

    Мое мнение что главная проблема современного ООП что никто толком даже не понимает что это вообще такое. Все есть объект? Если взять столпы ООП в виде C++ и Java, там все есть объект? Нет. Инкапсуляция, наследование, полиморфизм? Прекрасно существуют и в не ООП языках и не делают их ООП языками.
    По моему личному мнению, современное ООП это не целостная самодостаточная концепция с четкой теоретической базой, целями, задачами и путями их решения. Современное ООП - это просто одно из направлений развития старого доброго структурного программирования к которому добавили идею еще одного уровня модульности (на уровне структуры) и прикрутили несколько свистоперделок в виде наследования типов и динамической диспетчеризации а также назвали это модным по тем годам словом.
    Именно по этому, за несколько десятилетий так и не научились как на нем правильно писать а эволюция написания ООП программы пришла к простому процедурному стилю, где нужно иметь тупые объекты только с данными и сервисы без состояния.


  1. nav68
    17.01.2025 13:56

    не сыпьте бисер перед свиньями. Свини красоту бисера не смогут оценить.