Какие ограничения при использовании только объектно ориентированного программирования без функционального
Что проверяют
Умеете ли вы выбирать инструмент под задачу, а не противопоставлять парадигмы. Python мультипарадигменный, и вопрос на самом деле о том, где классы лишние и что даёт функциональный стиль. Следом часто просят пример из вашего кода, где функция оказалась лучше класса, или наоборот.
Как отвечать
Сначала поправьте постановку: ООП не запрещает чистые функции и неизменяемые объекты. Ограничения появляются, когда всё обязательно делают классами с изменяемым состоянием:
- лишние классы: стратегия, команда или обработчик в виде класса с одним методом там, где хватило бы функции. В Python функции это объекты первого класса, их передают и хранят как любые значения, а параметры фиксируют через
functools.partial; - общее изменяемое состояние: объект меняется из разных мест, поведение зависит от истории вызовов, в многопоточном коде нужна синхронизация;
- тестирование: для метода с состоянием нужно собрать объект и подменить зависимости моками, чистую функцию проверяют парой вход и выход;
- композиция: конвейер из генераторов и
itertoolsсобирается проще, чем цепочка объектов с промежуточным состоянием; - проблема выражения: в ООП легко добавить новый тип, но трудно добавить новую операцию над всеми типами, это обходят паттерном Visitor. В Python ту же задачу проще решает
functools.singledispatchилиmatch.
Инструменты, которые стоит назвать: @dataclass(frozen=True) и NamedTuple для неизменяемых данных, functools.cache для мемоизации чистых функций, генераторы и comprehensions вместо ручных циклов с накоплением.
Хороший итог: функциональное ядро и императивная оболочка. Бизнес-логика собрана из чистых функций, а ввод-вывод, база и сеть вынесены на края, в классы и сервисы.
Где спотыкаются
Утверждают, что ООП исключает чистые функции. Это вопрос дисциплины, а не парадигмы.
Уходят в другую крайность и предлагают писать на Python чисто функционально. У языка нет оптимизации хвостовой рекурсии, лимит глубины по умолчанию 1000, а lambda ограничена одним выражением.
Отвечают общими словами без примера. Покажите конкретный класс из практики, который вы заменили функцией, и что от этого стало проще.