Сегодня я хочу попробовать формат коллективных твиттеров у себя в твиттере. Потвичу пару часов о мифах вокруг ООП. Лайк, шер приветствуется. Задание на самопроверку:

Какой вид полиморфизма имеется ввиду когда речь идет про полиморфизм в ООП?

Перед тем как я буду выдавать какие-то утверждения и прикладывать пруфы. У меня есть десяток мифов, которые я бы хотел разобрать задав вопросы тут. Поэтому продолжаю спрашивать:

Нужно ли наследование для реализации полиморфизма подтипов?
Может ли язык называться ООП если в нем нет классов?
Инкапсуляция это:
Самое главное в ООП
Возможно ли моделирование предметной области за рамками ООП? (Сущности вот это все)
Принцип лисков про классы и наследование
Дисклеймер. ООП не слишком формальная штука, поэтому мы скорее говорим о общепризнанных и широко распространенных практиках и способах организации кода, по которым этот код отличается от остальных способов. Причем этот способ общий для разных языков, а не одного конкретного.
Начнем из далека. В понимании ООП, как минимум, существует две школы. Одна "последователи Алана Кея", вторая "последователи Страуструпа и Буча". Эти школы говорят о совершенно разных вещах и не смотря на то что Алан Кей начал раньше, мейнстримом стала вторая школа.
Алан Кей изобрел термин ООП, но он не изобретал слово "объекты", он взял его из языка Simula. https://t.co/r6RL4F6E02 Он говорил:

ООП для меня это сообщения, локальное удержание и защита, скрытие состояния и позднее связывание всего. Это можно сделать в Smalltalk и в LISP.
Я тут по пути подумал, а че стесняться. Мы на Хекслете ищем наставников и программистов. Если кому интересно, пишите на [email protected]) https://t.co/BlMOGMAEMn

Ребят, щас на часик на собеседование и я вернусь. Расскажу историю ооп и дальше уже в кишки! Пока набрасывайте)
Про Алана Кея хотелось бы поговорить по больше, но не в этот раз. Рекомендую разобраться с теми идеями, которые он распространял. Пара материалов: https://t.co/xy7SfnNtjz (о нем самом и его жизни) https://t.co/sH8uZHOXoF (про ооп лиспы и т.п.)
Но напомню что в 2016 году он отвечал на вопросы в тред хакер ньюза, где можно найти тонну интересных мыслей: https://t.co/RmMheWUS5f

Ему нравится self (из которого взята прототипная модель для js)

И он считает что erlang/elixir истинно ОО языки https://t.co/YjpX47Cekc
> Он утверждал, что идеальный компьютер должен работать по принципам живых существ, где каждая клетка — индивидуальна, однако вместе они образовывают единую большую систему, способную масштабироваться, изменяться и модифицироваться.

Можно сказать что интернет это ООП по Алану
Теперь переходим к мейнстриму. Кто такой буч? https://t.co/eUM8fpX1Ze

Booch developed the Booch method of software development, which he presents in his 1991/94 book, Object Oriented Analysis and Design With Applications. He advises adding more classes to simplify complex code.
The Booch method is a technique used in software engineering. It is an object modeling language and methodology that was widely used in object-oriented analysis and design. It was developed by Booch while at Rational Software.

То есть это тот самый мужик, который привил нам =>
Полиморфизм наследование и инкапсуляцию. А так же натянул моделирование на ООП, так, что многие теперь думают что понятие "сущности" есть только там где есть классы. А без объектов нельзя размышлять о поведении. Между тем, книгу "ОО анализ и дизайн", почитать стоит.
Буч является отцом создателем UML. Но то что он имел ввиду и то чем оно стало – две большие разницы. Поэтому он послал комитет и ушел оттуда. Очень крутой мужик, занимается ИИ. Крайне рекомендую интервью с ним на эту тему https://t.co/NzvXfiIUWz Для тех кто хочет понять UML
А теперь поехали в мякотку. ООП приписывают много вещей, которые в нем конечно же есть, но появились они не благодаря ООП. Более того, существуют вне него и существовали задолго до него. (я все еще не даю определение ооп, к нему надо подобраться)
Давайте начнем с полиморфизма. Когда речь идет про ООП, то в первую очередь подразумевается полиморфизм подтипов. Его еще называют сабтайпинг https://t.co/VKRCuVkvp0 Этот полиморфизм появляется там, где мы можем подменить реализацию чего-либо.
Представьте что в приложении мы работаем с системой кеширования и вызываем код: cache.set(key, value), а дальше соответственно cache.get(key). Как можно отключить работу кешера в тестах (он там не нужен)? Можно конечно поставить иф, что делают почти всегда и нормально живут, но
Эталонное решение с точки зрения ООП это подмена реализации. То есть на этапе конфигурирования приложения создается другой объект cache (от другого класса например), но с тем же интерфейсом. Это значит что код работающий с кешем не поменяется. То есть иф уходит в конфигурацию.
Этот подход основан на том, что мы не работаем с классом Cache напрямую (new Cache()), мы получаем его в местах использования как параметр функции. Только в этом случае возможна подмена, а значит полиморфизм подтипов. Это называется инверсия зависимостей.
Фишка в том, что этот полиморфизм прекрасно живет за рамками ООП в тех же функциональных языках. И реализуется даже проще: https://t.co/tnpTYHcSqc

Насколько сильно он влияет на код и его архитектуру?
Если коротко, то полиморфизм подтипов устраняет ифы, по крайней мере они перестают быть разбросаны по всему коду и уходят на этап конфигурирования. Нам не надо ставить иф в каждом месте где мы кешируем. Достаточно создать правильный кешер (по ифу например). Второй плюс =>
С другой стороны, он позволяет расширять поведение, без необходимости переписывать код, который использует его. Можно добавить новую реализацию и передать ее в полиморфную функцию, somefunction(<любй вид кешера>). В теории звучит прекрасно.
На практике это компромисс. Ничего не бывает бесплатно. Инвертирование зависимостей усложняет код. Он вроде бы становится гибче, но только в том направлении, которое в него было заложено. Но от ифов избавляет хорошо если правильно пользоваться.
Связан ли полиморфизм с наследованием? Если почитать статьи что были выше, то видно что там везде явно прослеживается разница между типами/подтипами и классами/наследованием. Применительно к ООП языкам типы и подтипы это про интерфейсы! Ни про классы, ни про наследование.
На эту тему огромное количество материалов в сети. Гуглите по запросу: Inheritance Is Not Subtyping

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

wiki > Subtyping should not be confused with the notion of (class or object) inheritance from object-oriented languages =>
> subtyping is a relation between types (interfaces in object-oriented parlance) whereas inheritance is a relation between implementations stemming from a language feature that allows new objects to be created from existing ones. =>
> In a number of object-oriented languages, subtyping is called interface inheritance, with inheritance referred to as implementation inheritance.
А теперь можно перечитать принципов лисков и переосознать его. Вот что недавно у себя в блоге написал Роберт Мартин по поводу LSP:

People (including me) have made the mistake that this is about inheritance.

А вообще LSP про предусловия и постусловия.
Беру перерыв. Завтра могу продолжить если будет интересно. Мы где-то может быть в районе середины или даже трети от всего повествования. Что скажете ребят?

More from All

1. Mini Thread on Conflicts of Interest involving the authors of the Nature Toilet Paper:
https://t.co/VUYbsKGncx
Kristian G. Andersen
Andrew Rambaut
Ian Lipkin
Edward C. Holmes
Robert F. Garry

2. Thanks to @newboxer007 for forwarding the link to the research by an Australian in Taiwan (not on

3. K.Andersen didn't mention "competing interests"
Only Garry listed Zalgen Labs, which we will look at later.
In acknowledgements, Michael Farzan, Wellcome Trust, NIH, ERC & ARC are mentioned.
Author affiliations listed as usual.
Note the 328 Citations!
https://t.co/nmOeohM89Q


4. Kristian Andersen (1)
Andersen worked with USAMRIID & Fort Detrick scientists on research, with Robert Garry, Jens Kuhn & Sina Bavari among


5. Kristian Andersen (2)
Works at Scripps Research Institute, which WAS in serious financial trouble, haemorrhaging 20 million $ a year.
But just when the first virus cases were emerging, they received great news.
They issued a press release dated November 27, 2019:

You May Also Like

Oh my Goodness!!!

I might have a panic attack due to excitement!!

Read this thread to the end...I just had an epiphany and my mind is blown. Actually, more than blown. More like OBLITERATED! This is the thing! This is the thing that will blow the entire thing out of the water!


Has this man been concealing his true identity?

Is this man a supposed 'dead' Seal Team Six soldier?

Witness protection to be kept safe until the right moment when all will be revealed?!

Who ELSE is alive that may have faked their death/gone into witness protection?


Were "golden tickets" inside the envelopes??


Are these "golden tickets" going to lead to their ultimate undoing?

Review crumbs on the board re: 'gold'.


#SEALTeam6 Trump re-tweeted this.
1. Project 1742 (EcoHealth/DTRA)
Risks of bat-borne zoonotic diseases in Western Asia

Duration: 24/10/2018-23 /10/2019

Funding: $71,500
@dgaytandzhieva
https://t.co/680CdD8uug


2. Bat Virus Database
Access to the database is limited only to those scientists participating in our ‘Bats and Coronaviruses’ project
Our intention is to eventually open up this database to the larger scientific community
https://t.co/mPn7b9HM48


3. EcoHealth Alliance & DTRA Asking for Trouble
One Health research project focused on characterizing bat diversity, bat coronavirus diversity and the risk of bat-borne zoonotic disease emergence in the region.
https://t.co/u6aUeWBGEN


4. Phelps, Olival, Epstein, Karesh - EcoHealth/DTRA


5, Methods and Expected Outcomes
(Unexpected Outcome = New Coronavirus Pandemic)