В чем разница объектно ориентированного и функционального программирования
Что проверяют
Можете ли вы объяснить парадигмы без лозунгов и сказать, как они уживаются в одном языке. В Python это ежедневный выбор, а не теория.
Как отвечать
Объектно-ориентированный подход собирает данные и поведение вместе: объект хранит состояние и меняет его своими методами. Функциональный отделяет данные от операций: функции принимают значения и возвращают новые, не меняя входные и не трогая внешнее состояние.
Ключевые понятия каждого стоит назвать своими словами: инкапсуляция, наследование и полиморфизм у первого; чистые функции, неизменяемость, функции высшего порядка и композиция у второго.
Практическая разница, ради которой вопрос и задают:
- тестируемость: чистая функция проверяется входом и выходом, без подготовки окружения. Объект с состоянием требует сборки этого состояния;
- конкурентность: неизменяемые данные не требуют блокировок, разделяемое изменяемое состояние требует;
- моделирование предметной области: сущность с жизненным циклом (заказ, пользователь, соединение) естественно ложится на объект;
- читаемость: цепочка преобразований данных короче и понятнее в функциональном стиле, чем набор классов вокруг неё.
В Python обе парадигмы уживаются, и здоровый код обычно смешанный: классы для сущностей и границ (репозиторий, клиент API, модель домена), функции для преобразований данных. Инструменты функционального стиля здесь свои: включения списков, генераторы, functools.reduce и partial, dataclass(frozen=True) для неизменяемых значений, декораторы как функции высшего порядка.
Где спотыкаются
Противопоставляют парадигмы как несовместимые и заявляют, что одна лучше.
Называют функциональным любой код с map и lambda, забывая про побочные эффекты, которые там остались.
Строят класс ради одной функции: в Python это лишний слой, где хватило бы модуля с функциями.