Программисты любят спорить про ООП (объектно ориентированное программирование). Там прям весело. Давайте копнем поглубже…
- Введение
- Так WordPress он про ООП или нет?
- С чего все началось?
- Прежде чем продолжим еще 2 статьи в тему про настоящее ООП
- И треснул мир напополам…
- Цитаты Алана Кея про ООП
- Кто, где и в какой мир ушел?
- Кто добро, а кто зло?
- Про наследование, инкапсуляцию и полиморфизм
- Что такое обмен сообщениями в ООП?
- Про первичный ООП в PHP и PSR 14
- Споры о том что ООП это плохо
- В чем беда с EDA? (Event Drive Architecture)
- Как быть с поздним связыванием, переиспользованием и полимормфизмом?
- Итого
Введение
Многие говорят что WordPress это не про ООП. Про ООП это что то типа Laravel или Symfony.
Я вот тут интервью проходил и мне так и сказали:
Мы видим что у вас много опыта про WordPress. А вы что то знаете про ООП?
ООП-программист
Для тех кто совсем не в теме стоит прочитать русскую википедию, раздел: Различные ООП-методологии.
Если кратко, то сегодня википедия знает про 3 типа ООП:
- Класс-ориентированное программирование: то что 99% программистов думаю что это ООП. Потомок Ивана Сазерленда.
- Компонентное программирование: парадигма которая изначально имелась ввиду как ООП автором этой темы — Аланом Кеем (Alan Curtis Kay)
- Прототипное программирование — используется в JS и др. языках, но особой силы и популярности так и не получила.
Сегодня мы имеем ситуацию разлома ООП-мира на 2 основные части: экземпляры с иерархией классов и компоненты с потоком сообщений.
ООП на основе прототипов — постепенно уходит. Но все же в JS мире еще имеет какое то значение.
Так WordPress он про ООП или нет?
Все зависит от точки зрения и инженерного уровня.
Если человек думает что ООП это что то про классы и наследование — тогда нет.
А если человек хоть что то понимает в типах ООП — то очень даже да. Даже да больше чем многие аналоги.
С чего все началось?
Изначально эту идею придумал Алан Кей где то в 70х или 80х годах https://habr.com/ru/company/hexlet/blog/303754/
Часть программистов поняли идею близко к автору, а часть поняли так как смогли.
Появились 2 разные идеологии ООП:
- классы с иерархией классов
- компоненты с обменом сообщениями
Эту тему можно прочитать в библии архитекторов ПО: «Мифический человеко-месяц» автор Фредерик Брукс, 1980е годы. Там классно описана тема когда мир начал разбиваться на 2 части.
А затем пришел Майкрософт с кучей бабла и решал свои проблемы захвата рынка. Тут была история про C, C++ (Microsoft) & Objective-C (Apple).
Apple уловила основную идею Алана Кея и купила язык который поддерживал именно ее. Работа компонентов через обмен сообщений.
Microsoft купил C++ который работал на альтернативной идее иерархии классов. Так появился Visual C++.
О том как решалась бойня за рынок в те годы можно было посмотреть в видео про ранние годы Битрикса. Но сорян видео умерло. Потому далее придется верить на слово.
Кратко резюме и тезисы:
- в те годы (90-е, 00-е) компании бились не за клиента, а за программистов, кто захватил программистов тот захватил рынок
- Майкрософт это понимали и начали битву за программистов
- Чтобы достичь эту цель было крайне важно пересадить программистов на Visual C++
- Так появились инвестиции в обучение и тонны учебников о том что такое C++
- А там писали о том что ООП это классы и иерархия классов (минус те факты которые были важны для настоящего ООП)
Прежде чем продолжим еще 2 статьи в тему про настоящее ООП
«Классы — это не объектно»: интервью Егора Бугаенко с Дэвидом Уэстом
ООП будущего: Барух Садогурский и Егор Бугаенко о том, как мы будем программировать через 20 лет
И треснул мир напополам…
Так образовалась трещина в мире ООП.
Можно сказать что образовалось 2 разных мира ООП:
- мир классов — где важно знать паттерны и как правильно назвать папки с файлами
- мир сообщений — важно понимать события, хуки, сообщения, триггеры — кто где на что реагирует
Есть туча фреймворков на любом языке про эти 2 мира, но программисты которые смогли осилить 1 мир — думают что кодеры из другого мира какие то не правильные.
По сути это выглядит как война добра со злом.
И треснул мир напополам, дымит разлом
И льется кровь, идет война добра со злом
И меркнет свет, в углах паук плетет узор…
Уматурман — Ночной дозор
Сейчас мир ООП состоит из 2х частей:
- одни думают головой и изучают историю ООП, понимают что это такое на самом деле
- а вторые идут по пути который куплен Майкрософтом. Учебники, книги, и все такое что дается людям начиная со школы и ВУЗов… Все то что позволяет забить в голову программистам что ООП это история про классы и их экземпляры 🙂
Цитаты Алана Кея про ООП
Которые помогают понять лучше что это такое.
- Я изобрел понятие «объектно-ориентированный», но могу заявить, что не имел в виду C++ при этом.
- Мне жаль, что давным давно я использовал термин «объект» для этой темы, потому что из-за этого многие люди фокусируются на меньшей из идей.
- Большая идея это «сообщения»
- Я считал объекты чем-то вроде биологических клеток, и/или отдельных компьютеров в сети, которые могут общаться только через сообщения.
- Ключ к созданию хороших масштабируемых систем это проработка механизмов общения модулей, а не проработка их внутренних свойств и поведения.
- Я не против типов, но мне не знакома ни одна система типов, которая не вызывала бы боли. Так что мне все еще нравится динамическая типизация.
- Одна из ключевых идей: система должна продолжать работу во время тестирования о особенно во время произведения изменений. Даже крупные изменения должны быть поэтапными и занимать не больше доли секунды.
- Большинство программ на сегодняшний день подобны египетским пирамидам из миллиона кирпичиков друг на друге и без конструктивной целостности — они просто построены грубой силой и тысячами рабов.
- Проблема в слабых, плохо масштабируемых идеях и инструментах, лени, нехватке знаний и т.д.
- Мой опыт в математике заставил меня понять, что каждый объект может иметь несколько алгебр, они могут объединяться в семейства, и это может быть очень полезным.
- ООП для меня это сообщения, локальное удержание и защита, скрытие состояния и позднее связывание всего. Это можно сделать в Smalltalk и в LISP.
Кто, где и в какой мир ушел?
Сегодня мир разделился на 2 части, где есть продукты которые базируются на одной из этих 2-х идеологий.
ООП как компоненты с обменом сообщений |
ООП как классы с иерархией |
JS: — Vue — React |
JS: — Angular |
Ruby: Redmine |
Ruby: GitLab |
PHP: — WHMCS — WordPress — Drupal — FreeScout |
PHP: — Joomla — Symfony — Laravel |
Кто добро, а кто зло?
Из того что написано части можно подумать что одна из этих идеологий добро, а другая зло 🙂
Но это не совсем так. Обе идеологии правильные. Беда там где программисты начинают использовать только одну из них.
Например Angular был одним из лидеров рынка на старте, но ввиду того что сильно ушел в классы и иерархию — уступил лидерство 2м другим игрокам которые сделали ставку на компоненты и обмен сообщениями. Команда проиграла двум другим игрокам: React & Vue.
Если брать сообщество PHP, то тут безусловным лидером является WordPress, который держит более 40% рынка, за счет того что более 15 лет уже развивает идею ООП на основе обмена сообщениями. Однако WP не забывает про классы и их иерархию. Там много классов с наследованием. Но они не являются движущей силой платформы. Его часто критикуют за то что он не про ООП, но это далеко от истины. Он то как раз про настоящее ООП, то самое которое было придумано Аланом Кеем в 70х годах. Он умело использует как ООП на основе сообщений (80% логики), так и ООП на основе иерархии классов (20% логики).
Про наследование, инкапсуляцию и полиморфизм
В этих 3х словах очень много путаницы, которые программистов держат в клетке.
Все 3 термина правильные. Но в зависимости от контекста (обмен сообщениями или иерархия классов) — они выглядят сильно по разному. Потому программисты говорят одни слова, но видят разное кино и потому не могут понять друг друга. Это сложно.
Наследование и инкапсуляция это очень разные способы написания кода в зависимости от того что вы сейчас пишете? Вы пишете классы и наследованием через иерархию классов? Или компоненты с наследованием через сообщения?
Инкапсуляция — примерно та же история. В классах она делается на классах, а в сообщениях оно может работать через неймспейсы.
Полиморфизм — изначально идея была такова что переменные могут иметь разные типы данных: строка, массив, число, null.
В случае с первичным ООП это правильно, а в случае с ООП на основе иерархии классов эта часть часто подвергается сомнению и возникают такие завихрени как типизированный JS (TypeScript) или типы в PHP (сильно развилось в 7+ версии).
Ввиду того что полиморфимз изначально подразумевал динамическую типизацию, за которую топил Алан Кей, то вот в мире где строгая типизация взяла верх — для полиморфизма пришлось придумать очень странные определения.
Но если глядеть в истоки — то полиморфизм не так сложно понять.
Что такое обмен сообщениями в ООП?
Есть 4 типа определения этого понятия:
- В каких то фреймворках/языках это зовется как события (Symfony/EventDispatcher, JS/AddEventListener)
- Где то это называется как хуки (React/WordPress/WHMCS/Redmine)
- А где то называется как это было названо прородителем идеи — обмен сообщениями
- Есть еще 4й очень спорный тип — Webhook, который получил развитие в ходе движения микросервисов.
Про 4й пункт можно поспорить. Но в каком то смысле он тоже может считаться частью этой идеологии.
Про первичный ООП в PHP и PSR 14
Основная проблема Симфони или Ларавел заключается в том что они на 90% основаны на ООП 2го типы (иерархия классов) и почти не используют ООП 1го типа (обмен сообщениями с компонентами).
Однако мир постепенно развивается, чары Майрософта развеиваются, и люди начинают понимать что почем. В JS это давно поняли и птм лидеры этого мира типа React. Они отказались от классов и перешли на хуки с функциями.
А в PHP это начали понимать только вот вот и в 2019 году появился PSR 14 https://habr.com/ru/company/oleg-bunin/blog/450812/
Возможно через 3-5 лет все фреймворки из мира PHP (Симфони или Ларавел) догонят WordPress (он на этой механике уже 15 лет работает) в части этой идеологии и смогу представить что-то рабочее. Но это не точно.
Хотя можно найти промежуточные решения — например FreeScout, который базируется на Laravel & классах, в итоге для реализации модульной архитектуры взяли в качестве диспетчера сообщений Eventy. По сути смогли реализовать некий гибридный вариант.
Споры о том что ООП это плохо
В мире и в рунете на Хабре часто появляются статьи о том что ООП это плохо. Что это беда. Например:
- раз https://habr.com/ru/post/451982/
- два https://habr.com/ru/post/453836/
- три https://habr.com/ru/post/147890/
Засада в том что ребята которые пишут эти статьи слабо понимают что такое ООП на самом деле 🙂 Они думают что ООП это иерархия классов (спасибо Майкрософту). И впадают в праведный гнев.
И все это превращается в холивары.
Стороны исходят из ошибочной предпосылки что ООП это обязательно классы.
Там встречаются единичные комменты тех кто понимает что такое ООП, но эти единичные комменты теряются в массе тех кто мыслит классами и функциями )
В чем беда с EDA? (Event Drive Architecture)
Засада заключается в том что механизм уровня PSR-14 PHP можно написать на любом языке за 1-2 дня работы среднего программиста.
Это не сложно.
Сложно другое. Внедрить сами события в код системы. У WordPress на это ушло 15 лет. Это очень сложно. Научить программистов думать событиями/сообщениями/хуками. Тем более научить думать так целое сообщество которое разбросано по всему миру.
Мышление программиста из мира иерархии классов и из мира обмена сообщениями отличается ровное также как мышление христиан от мусульман. По сути можно сказать что это разные религии. Но как и в религиях — наиболее опытные искатели могут заявить о том что все они про одно, просто есть детали и разные слова.
Смешной видосик в тему
Как быть с поздним связыванием, переиспользованием и полимормфизмом?
Это те самые штуки, которые ребята из Майкрософт в ходе финансирования образования программистов очень грамотно исключили и сделали так чтобы программисты о них не думали.
Ну типа раз в ООП от Майкрофост эти штуки хреново работают, то надо сделать что? Правильно — надо сделать так чтобы программисты об этом забыли или не поняли эти штуки достаточно хорошо.
- Позднее связывание — надо сделать так чтобы код можно было менять не меняя основной код. Большинство программистов не знают как это сделать 🙂
- Полиморфизм — надо сделать так чтобы переменная могла быть разных типов. Может быть это строка? А может быть число? А может быть завтра это будет массив? Не не не… в C++ это нельзя и птм это нельзя? ))
- Переиспользование — ну это совсем жесть 🙂 Чтобы переиспользовать код надо прям замарочиться…
Мы любезно будем упоминать цитату Алана Кея…
Одна из ключевых идей: система должна продолжать работу во время тестирования о особенно во время произведения изменений. Даже крупные изменения должны быть поэтапными и занимать не больше доли секунды.
Алан Кей
Переведя на язык прикладной системы это выглядит так:
- имеет некую систему, будь то сайт компании, Интернет-мгазина или CRM
- мы можем поставить новый объект (модуль, плагин, компонент, бандл)
- и этот объект заработает сразу, причем позволит менять любую часть системы, не меняя код который был до этого
В мире Java/C++ — это кажется не реальной фантазией.
Даже в мире Symfony если у тебя есть некий бандл, то скорее всего ты не сможешь включить его просто так. Тебе придется дописать кучу кода чтобы он заработал.
В мире WordPress, который следует первичной идеи ООП все эти принципы соблюдаются. Ты можешь иметь Интернет-магазина, добавить плагин и он сразу начнет работать. Без модификации кода. Добавится любая часть логики которая вам нужна.
Более того — когда ядро обновится или какой то плагин — они могут обновиться сами по себе. За долю секунды. Не ломая всю систему.
Фантастика? Не совсем так 🙂 Это просто соблюдение идей ООП Алана Кея.
Там применяется парадигма обмена сообщениями в первичном варианте. И это позволяет связывать компоненты в любом варианте и все это работает без изменения кода.
Итого
И треснул мир наполалам… Так бывает 🙂
Но мир постепенно развивается. Наиболее прогрессивная часть программистов начинает понимать что к чему. Иначе бы не появились такие продукты как Vue, React, WordPress, FreeScout, Redmine, WHMCS …
Где то начиная с 2000-х стратегия Майкрософт начала терять свою силу. То что они купили мозги программистов и начали впихивать свое понимание ООП — стало ослабевать с приходом OpenSource. Сейчас они это начали понимать. Стоит посмотреть на VS Code или новые Edge на базе Chromium. Это вполне достойные продукты.
Следствием этого перелома появился PSR-14 в PHP.
Нас ждет новый мир 🙂 Мир где ООП начнет принимать ту форму которая была задумана Аланом Кеем в 60-70-х годах.
Где иерархия классов, компонентность и обмен сообщениями — живут в гармонии.
На мой взгляд лучше всех это смог сделать WordPress. Наверное именно по этой причине он держит 40% рынка веб сайтов в мире и каждый год увеличивает свою долю рынка вот уже на протяжении 15 лет.