Принципы ООП. 3. Полиморфизм

preview_player
Показать описание
Всем привет! Это третий ролик из небольшого цикла лекций о принципах ООП. Сегодня поговорим о полиморфизме.

Курсы для новичков:

Продвинутые курсы для состоявшихся девелоперов:

Рекомендации по теме
Комментарии
Автор

🦊Новый поток Advanced курса Enterprise Patterns стартует уже 1 февраля 2023 года ❗

SergeyNemchinskiy
Автор

Ценю работу над каналом, но поддержу мнение, что за столом было душевшее) И эхо в этой студии сильное

expurple
Автор

По теме )
.
# Полиморфизм -- это возможность одного и того же алгоритма обрабатывать данные разных типов, независимо от того, какие это типы. Без проверок типов внутри и ветвления в зависимости от того, с каким конкретным типом алгоритм работает в конкретный момент времени.
.
# Мнимый полиморфизм (ad-hoc) -- это когда только создается видимость, что алгоритм полиморфный, но на самом деле в момент компиляции/транспайлинга программы либо происходит подстановка другого алгоритма, в зависимости от типа/ов переданных аргументов, либо происходит неявное преобразование типа/ов аргумента/ов. Важно то, что в результате есть один или больше алгоритмов, каждый из которых мономорфный -- т.е. работает с данными строго одного типа. Ярким примером является перегрузка функций/методов. Когда для обработки разных данных создаются разные функции, имеющие одно имя, но разную сигнатуру (имя + перечень типов аргументов). Такое возможно далеко не во всех языках программирования.
.
К такому типу полиморфизма относится и паттерн-матчинг, т.к. он сводится к совокупности мономорфных алгоритмов.
.
По способу достижения полиморфизма можно выделить:
- полмиорфизм подтипов
- структурный полиморфизм
- параметрический полиморфизм
.
# Полиморфизм подтипов - это возможность алгоритма работать со всеми подтипами одного общего типа, опираясь на свойства общего типа (например, на то, что экземпляры общего типа, а значит и всех его подтипом, имеют определенный метод, с определенной сигнатурой). Наследование -- это частный случай создания Подтипа. Определяя интерфейс, создается тип. Реализация интерфейса -- это также создаение Подтипа, хоть наследование и не происходит.
TypeScript и Flow работают именно с таким типом Полиморфизма, даже не смотря на то, что проверка того, является ли Тип подтипом Общего Типа осуществляется путем сопоставления структур Типа и Общего типа (без необходимости синтаксически декларировать такую связь).
.
# Структурный полиморфизм - это возможность алгоритма работать с объектами (значениями), игнорируя их тип и способ создания, и предполагая, что объекты/значения обладают нужными свойствами (например у объектов будет нужный метод с нужной сигнатурой). Его часто называют Утинным Полиморфизмом. Такой работат в JS. Собственно, я бы Структурный полиморфизм отнес к разновидностям Полиморфизма подтипов, но с оговоркой, что статической проверки типов нет.
.
# Параметрический полиморфизм -- это возможность алгоритма работать с данными "не названных" типов, которым присвоены абстрактные имена. Т.е. типы являются Параметрами алгоритма, равно, как и его аргументы. Это всеми нами гороче любимые Generic-и. Например: Array<T> -- это пример Параметрического полиморфизма. Tree<T>, List<T> etc. etc.

dimitro.cardellini
Автор

Белы фон вам не идет. Прежние видео были ламповее, чтоли.

homo-ergaster
Автор

Дублировать текстом вещи о которых идет речь есть очень хорошо. Примеры бы с кодом какие в виде призентации на фоне. А так супер!)

ВиталийИванович-що
Автор

Сергію, дякую! Не додам нічого нового до того, що сказано іншими, просто урок вийшов традиційно змістовним і цікавим і заслуговує на "свіжий" коментар))

SergiiIatsenko
Автор

Блин. А про if-то мысль реально хороша. Объяснение полиморфизма через нее пока самое доступное на моей памяти.
Было бы круто добавить короткий пример замены if-а или оставить ссылку на него.

nmodonov
Автор

Ой, сколько новых видео!!! Сергей, ставлю лайк даже не посмотрев (сейчас исправлю эту ошибку), так сказать заочно! Большое вам спасибо! Долго отсутствовал, сейчас буду смотреть каждое новое для меня видео.

zabiyaka
Автор

Спасибо!
Я из тех кому все равно на фон, звук, одежду и прочее.
Содержание - Самое главное!
Спасибо за содержание!
P.S. Мне во всех ваших видео нравится антураж

egorsank
Автор

прикольный формат, но прошлый был, как-то, более по-домашнему, более уютно)

yanaj
Автор

потерялась ламповость видео. теперь сухой профессионализм.
двоякое чувство)))

leetovetz
Автор

За столом как то интересней и привычней. А еще на столе стоит великолепная кружка!

Vanderflit.
Автор

Очень крутой формат, намного лучше предыдущего.

ВладиславШестернин-бс
Автор

Классно получилось, спасибо Сергей!
P.S. в следующий раз напишите титрами когда можно открывать уши)))

eugenstakhursky
Автор

В видео было много слов, но, к сожалению, некоторые из них правильные, а некоторые - нет. В итоге складывается впечатление, что полиморфизма всего два, и из них один какой-то неправильный (ad-hoc).
Что лишний раз подтверждает тезис, что практика без теории __слепа__.

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

Полиморфная функция бывает двух видов.
Ad-hoc полиморфизм — когда функция ведет себя по разному для аргументов разных типов. Функция "нарисовать" — рисует по разному разные геометрические фигуры.
Параметрический полиморфизм — когда функция ведет себя одинаково для аргументов разных типов, нет информации о настоящем типе и значение любого типа может быть передано в качестве аргумента. Пример — функция "положить элемент в контейнер". Заметим, что subtype полиморфизм (который в ООП называют просто полиморфизмом, когда вместо ссылки на базовый класс можно передать ссылку на производный) __НЕ__ является параметрическим полиморфизмом, потому что тип известен (тип базового класса).

Иногда выделяют статический и динамический полиморфизм — когда тип разрешается во время компиляции, или во время выполнения.

Теперь можно рассмотреть частные случаи:

1. _Преобразование чисел_, когда функция принимает double, туда иногда можно передать целые числа и float, этот вид полиморфизма часто называют automatic coerce, в разных языках делается по-разному, скажем в OCaml его вообще нет и нужны явные преобразования.

2. _Перегрузка функций_, когда одно имя функции используется для аргументов разных типов и количества аргументов. Используется в постпроцедурных ОО языках, таких как С++, Java, C#. В функциональных языках отсутствует, поскольку ломает вывод типов (впрочем в Haskell нетрудно сделать аналог перегрузки).

3. _Параметрический полиморфизм_, когда функция получает тип (или несколько типов в качестве параметров), например `foo<T>(a: T): T` - функция имеет один параметр-тип и один полиморфный параметр, который связан с этим типом. Такой полиморфизм известен под именем generics, и присутствует под этим именем в Java, Kotlin, C#, Scala и может быть в будущем Go :-) Почему в Scala этот вид полиморфизма значительно мощнее? Потому что на параметры-типы можно накладывать очень детальные ограничения, например:
def lift[F[_]: Functor]: F[A] => F[B]
здесь на параметр F накладывается ограничение, что F - это тип с параметром, и подтип типа Functor (который тоже параметризован, но это можно узнать посмотрев его определение).
В Haskell (или ещё более далёком от мейнстрима Idris) ограничения на типы могут быть ещё более детальные, и сами параметры-типы можно связать ограничениями, и это всё позволяет отсеивать компилятором огромное количество ошибок.

4. Наконец _полиморфизм подтипа_ - это вид ad-hoc полиморфизма, когда первый неявный параметр this имеет тип базового класса, диспетчеризация происходит в рантайме, обычно с помощью VTable. С точки зрения теории довольно слабый вид полиморфизма, поскольку ограничение на тип лишь одно, типом базового класса снизу. Естественно, делает невозможным точный вывод типов, не позволяет диспетчеризоваться по нескольким типам параметров, и по типу возвращаемого значения, вынуждает делать нетипобезопасные преобразования (т.н. downcasting).

5. Также есть ещё row polymorphism, когда селектор поля, например .user в разных записях может выступать как самостоятельное значение, передаваться в параметры и использоваться в полиморфных контекстах, а будучи применённый к разным значениям, скажем account и book возвращает соответственно account.user и book.user. Чем-то напоминает структурные типы, но гибче.

6. Есть ещё много других, таких как family polimorphism, но это уже глубины теории типов, до практики они ещё не дошли.

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

linkernick
Автор

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

IlyaIstomin
Автор

Очень полезные и информативные ролики получаются у вас. Хотим больше "обучалок"

maximgribencicov
Автор

Новый формат супер! Все внимание фокусируется о том, что говорит диктор☝🏻 Возможно, для лучшего понимания полиморфизма можно было бы добавить несложные схемы или код, чтоб акустическся информация еще визуально подкреплялась. Сергей, спасибо Вам!

shane
Автор

Вы молодец. Достаточно давно слежу за вашим каналом. Даже 2 месяца был на проекте в вашей школе. Надеюсь, даже спустя неделю, вы прочитаете этот коммент. Хотелось бы и мне высказать свое мнение по поводу видео, хотя обычно комменты не оставляю.
С фоном лампово и по домашнему, без фона - динамически и по современному. Больше всего понравились тезисные подпись. С ними как-то проще воспринимается информация. Можно подписи оставить (пофиг на фон))

gilzaa
Автор

Смотрю уже 30 ролик, ничего не понимаю но очень интересно!

Salted_muffin