HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Начнем знакомство с полиморфизмом подтипов с задачки. Представьте себе функцию, которая проверяет, есть ли комментарии у статьи или топика (вопросы пользователей Хекслета под уроками и проектами). Статья в коде представлена объектом класса<em>Article</em>, а топик -<em>Topic</em>.</p>
1 <p>Начнем знакомство с полиморфизмом подтипов с задачки. Представьте себе функцию, которая проверяет, есть ли комментарии у статьи или топика (вопросы пользователей Хекслета под уроками и проектами). Статья в коде представлена объектом класса<em>Article</em>, а топик -<em>Topic</em>.</p>
2 <p>С подобным кодом мы уже сталкивались ранее. Каждый новый тип потребует от нас добавления кода в эту условную конструкцию. Его можно заменить на диспетчеризацию по ключу, но особенно лучше не станет. Все равно придется описывать поведение для каждого класса в дополнение к тому, что поведение и так описано внутри каждого класса. Но можно сделать кое-что лучше. Достаточно согласовать интерфейс всех типов и договориться о том, что метод для извлечения комментариев будет называться getComments(). Тогда код станет таким:</p>
2 <p>С подобным кодом мы уже сталкивались ранее. Каждый новый тип потребует от нас добавления кода в эту условную конструкцию. Его можно заменить на диспетчеризацию по ключу, но особенно лучше не станет. Все равно придется описывать поведение для каждого класса в дополнение к тому, что поведение и так описано внутри каждого класса. Но можно сделать кое-что лучше. Достаточно согласовать интерфейс всех типов и договориться о том, что метод для извлечения комментариев будет называться getComments(). Тогда код станет таким:</p>
3 <p>Теперь функцию hasComments(commentable) можно вызывать с любым объектом, имеющим метод getComments() с необходимой сигнатурой. Эта функция не поменяется даже при добавлении нового класса, содержащего такой же метод.</p>
3 <p>Теперь функцию hasComments(commentable) можно вызывать с любым объектом, имеющим метод getComments() с необходимой сигнатурой. Эта функция не поменяется даже при добавлении нового класса, содержащего такой же метод.</p>
4 <p>Способность функции обрабатывать объекты разных типов одинаковым образом - называется полиморфизмом подтипов, а сама функция - полиморфной функцией.</p>
4 <p>Способность функции обрабатывать объекты разных типов одинаковым образом - называется полиморфизмом подтипов, а сама функция - полиморфной функцией.</p>
5 <p><em>Как видно из кода выше, для реализации такого полиморфизма, в JavaScript не нужно наследование и интерфейсы. В мире такой подход называют "утиной типизацией". Если что-то ходит как утка и крякает как утка, то это утка.</em></p>
5 <p><em>Как видно из кода выше, для реализации такого полиморфизма, в JavaScript не нужно наследование и интерфейсы. В мире такой подход называют "утиной типизацией". Если что-то ходит как утка и крякает как утка, то это утка.</em></p>
6 <p>Технически, самое простое и понятное, что делает полиморфизм подтипов (для клиентского кода) - убирает условные конструкции. Любую условную конструкцию можно заменить полиморфизмом и любую полиморфную функцию можно заменить на if. Другими словами, полиморфизм подтипов не является неотъемлемой частью разработки, код можно писать и без него. С другой стороны, иногда встречаются ситуации, в которых он здорово помогает, но не сказать, что это происходит постоянно.</p>
6 <p>Технически, самое простое и понятное, что делает полиморфизм подтипов (для клиентского кода) - убирает условные конструкции. Любую условную конструкцию можно заменить полиморфизмом и любую полиморфную функцию можно заменить на if. Другими словами, полиморфизм подтипов не является неотъемлемой частью разработки, код можно писать и без него. С другой стороны, иногда встречаются ситуации, в которых он здорово помогает, но не сказать, что это происходит постоянно.</p>
7 <p>В чем разница между параметрическим полиморфизмом и полиморфизмом подтипов? В первом случае реализуется общий алгоритм для контейнера (например массива), который содержит значение или значения типа<em>T</em>. Этот алгоритм не зависит от<em>T</em>и для любых<em>T</em>выполняется идентично. Во втором - алгоритм построен вокруг самого объекта и использует его методы. В полиморфизме подтипов полиморфная функция работает только с теми объектами, которые имеют необходимые для реализации алгоритма методы.</p>
7 <p>В чем разница между параметрическим полиморфизмом и полиморфизмом подтипов? В первом случае реализуется общий алгоритм для контейнера (например массива), который содержит значение или значения типа<em>T</em>. Этот алгоритм не зависит от<em>T</em>и для любых<em>T</em>выполняется идентично. Во втором - алгоритм построен вокруг самого объекта и использует его методы. В полиморфизме подтипов полиморфная функция работает только с теми объектами, которые имеют необходимые для реализации алгоритма методы.</p>