Python: Полиморфизм
Теория: Код, который убивает полиморфизм
В этом уроке мы разберем, как некоторые подходы могут подорвать идею полиморфизма в наших программах. Мы разберем следующие популярные способы нарушения полиморфизма: формирование объектов, проверка типов и слишком много условий.
Формирование объектов
Изучим функцию ниже. Можно ли считать ее полиморфной?
С одной стороны объект user передается в функцию извне. Это дает возможность подменить его, передав туда объект другого класса. Но внутри функции явно используется класс EmailSender, и подменить его невозможно без переписывания самого кода.
Такой код демонстрирует важную идею: полиморфизм возможен, когда объект передается в функцию извне, а не создается внутри нее.
Проверка типов
Рассмотрим еще один пример. Есть ли полиморфизм в следующем коде?
В этом примере объект передается извне, что может говорить о полиморфизме. Но внутри функции явно проверяется тип объекта. Это означает, что поведение определяется не объектом, а функцией.
Функция жестко связана с определенными типами, и при изменении этих типов ее придется переписать. Это не совсем полиморфизм, как мы его понимаем.
В подобной ситуации есть два подхода к решению:
- Перенести всю логику внутрь классов. Тогда код функции
say_hiбудет выглядеть так:return user.say_hi(). Но следует быть осторожным. С этим подходом легко получить «божественный объект», который управляет всем - Второй способ — введение нового интерфейса в виде методов
is_userиis_guest:
Хотя количество кода не уменьшилось, этот подход лучше поддерживает полиморфизм. Код теперь опирается на методы, а не на типы. И изменение структуры классов не затронет эту функцию, если сама логика останется прежней.
Выводы
Полиморфизм — это мощный инструмент, который делает наш код более гибким и расширяемым. Но его легко нарушить, применяя неправильные подходы. Избегая этих подходов, мы можем написать более чистый и модульный код, который легче понять и поддерживать.

.png)
