В чем ключевые различия между функциональным и объектно-ориентированным программированием?

«В чем ключевые различия между функциональным и объектно-ориентированным программированием?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Функциональное программирование (FP) и объектно-ориентированное программирование (OOP) — это две разные парадигмы с различными подходами к структурированию кода и управлению данными.

Основные принципы

  • FP основано на чистых функциях (без побочных эффектов), неизменяемости данных и композиции функций.
  • OOP основано на объектах, объединяющих данные и поведение, и использует инкапсуляцию, наследование и полиморфизм.

Примеры

FP (Java с Stream API):

List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> doubled = numbers.stream()
    .map(n -> n * 2)          // Чистая функция
    .collect(Collectors.toList());

OOP (Java):

class Animal {
    void makeSound() { System.out.println("Some sound"); }
}
class Dog extends Animal {    // Наследование
    @Override
    void makeSound() { System.out.println("Bark!"); } // Полиморфизм
}

Ключевые различия

Аспект Функциональное программирование Объектно-ориентированное программирование
Основная единица Функция Объект (класс)
Состояние Неизменяемое, избегается Изменяемое, инкапсулировано в объектах
Поток управления Композиция функций и рекурсия Циклы и вызовы методов объектов
Акцент На что сделать (преобразования данных) На как сделать (взаимодействие объектов)
Параллелизм Проще из-за неизменяемости Сложнее, требует синхронизации состояния

Практический выбор: FP часто лучше подходит для задач обработки данных и конвейеров преобразований, в то время как OOP удобен для моделирования сложных предметных областей с состоянием и поведением.