Корпорация Oracle ввела некоторые функциональные конструкции в Java SE 8, поэтому сегодня большинство интервьюеров заинтересованы в задавании вопросов о Функциональном программировании. Как разработчику на Java/Groovy/Scala или любому другому разработчику функционального программного обеспечения следует изучить следующие вопросы и ответы для успешного прохождения собеседований:
- Что такое Функциональное программирование?
- Каковы “Плюсы и Минусы” Функционального программирования?
- В чем разница между Функциональным программированием и Императивным программированием?
- В чем разница между Функциональным программированием и Объектно-ориентированным программированием?
- В чем разница между Функциональным программированием, Императивным программированием и Объектно-ориентированным программированием?
- Каковы основные преимущества Функционального программирования по сравнению с Императивным программированием или Объектно-ориентированным программированием?
- Когда следует использовать Функциональное программирование?
- Когда следует использовать Объектно-ориентированное программирование?
- Каковы недостатки ООП?
- Каковы недостатки ООП-Наследования?
… И многое другое
В этом посте мы собираемся обсудить следующие три популярные парадигмы программирования по очереди и также ответить на вышеперечисленные вопросы:
- Функциональное программирование (FP)
- Императивное программирование (IP)
- Объектно-ориентированное программирование (OOP)
Что такое Функциональное программирование?
Простыми словами, Функциональное программирование (ФП) – одна из популярных парадигм программирования, которая выполняет вычисления, подобные математическим функциям, без изменения состояния и изменения данных. В Функциональном программировании функции являются кандидатами первого класса. Мы пишем программы, определяя набор функций и неизменяемых данных. Примеры языков ФП: Scala, Haskell, Erlang и т. д. – популярные языки ФП. В Java SE 8 также есть некоторые функциональные конструкции (пожалуйста, обратитесь к постам о Java 8 для более подробной информации)
Каковы характеристики ФП?
Языки функционального программирования, такие как Scala, имеют следующие характеристики.
- 1. Состояние не существует.
Программы ФП не содержат состояния. Это означает, что все данные являются неизменяемыми, и функции не могут изменять состояние.
2. Низкая важность порядка выполнения
В ФП мы пишем программы с набором независимых функций. Функции содержат набор инструкций. В ФП порядок выполнения этих функций не имеет большого значения, потому что у них нет состояния, и все функции работают независимо. Даже если мы изменяем порядок выполнения, они по-прежнему производят те же результаты.
3. Бесстранное программирование
Все программы ФП используют неизменяемые данные и функции, которые не могут их изменять. Это означает, что языки ФП поддерживают модель бесстранного программирования.
4. Функции – объекты первого класса
В языках ФП функции являются объектами первого класса. Функции – это независимые единицы, и мы можем выполнять их в любом порядке.
5. Основные единицы манипулирования
В языках ФП основными единицами манипулирования являются функции и структуры данных, потому что все программы создаются с использованием этих единиц.
6. Модульное программирование
В языках ФП нам нужно писать меньшие и независимые блоки, называемые чистыми функциями, чтобы поддерживать модель бесстранного программирования. Это означает, что ФП поддерживает лучшую модульность, чем ООП.
7. Функции высшего порядка и ленивая оценка
Языки функционального программирования должны поддерживать функции высшего порядка и функции ленивой оценки.
8. Основные управляющие конструкции
Языки ФП не используют управляющие конструкции, такие как циклы For…Loop, Do…While Loop, While…Loop и также не используют условные операторы, такие как If…Else или Switch Statements. Все языки ФП пишут программы, используя следующие вещи:
- Функции
- Вызовы функций
- Вызовы функций с рекурсией
- Абстракция, Инкапсуляция, Наследование и Полиморфизм
Как и ООП, функциональные языки программирования поддерживают все 4 концепции: Абстракцию, Инкапсуляцию, Наследование и Полиморфизм. Функциональные языки поддерживают Наследование с помощью классов типов или неявных параметров. Они поддерживают Полиморфизм с помощью обобщений. Это также известно как параметрический полиморфизм.
В чем основное направление ФП?
В отличие от языков ООП, все программы на функциональных языках программирования в основном сосредоточены на “Что вы делаете” или “Что нужно сделать”. Они в основном сосредоточены на следующем:
- Какая информация требуется, то есть ввод.
- Какие преобразования необходимы, то есть фактическая логика.
Это означает, что ФП в основном сосредоточен на “Что нужно сделать”. Он не слишком сосредоточен на “Как это сделать”. Поэтому мы можем писать функциональные программы как описание области проблем. Поэтому, не только разработчики, но и другие люди могут легко понимать код ФП. Теперь мы обсудим “Преимущества и Недостатки” (Плюсы и Минусы) функционального программирования.
Преимущества функционального программирования:
Функциональные языки программирования обладают следующими преимуществами или плюсами:
- Безошибочный код
Поскольку ФП-языки не поддерживают состояние, они не вызывают побочных эффектов, что означает, что мы можем писать код без ошибок или без ошибок или менее подверженный ошибкам код.- Эффективное параллельное программирование
Поскольку у ФП-языков нет изменяемого состояния, они не вызывают проблем с изменением состояния. Это означает, что они используют только неизменяемые данные. Они используют независимые единицы для написания программ, которые являются “Функциями”. Мы можем писать очень эффективное параллельное или конкурентное программирование, потому что они работают независимо без изменения состояния.- Лучшая производительность
Поскольку ФП-программы состоят из всех независимых единиц, они могут выполняться параллельно или конкурентно. Из-за этой причины приложения ФП получают лучшую производительность.- Лучшая инкапсуляция
В отличие от ООП, ФП поддерживает лучшую инкапсуляцию с помощью Чистых функций. Чистые функции означают без побочных эффектов.- Поддержка вложенных функций
Вложенные функции означают составление функций внутри других функций для решения проблем. ФП поддерживает вложенные функции.- Увеличение повторного использования
Поскольку программы ФП состоят из независимых единиц, которые являются “Функциями”, мы можем легко их повторно использовать.- Лучшая модульность
На ФП-языках нам нужно писать меньшие и независимые единицы, называемые Чистые функции, чтобы поддерживать модель программирования без состояния. Это означает, что ФП поддерживает лучшую модульность, чем ООП.- Легкое ленивое вычисление
На ФП-языках очень легко писать Ленивое вычисление. Они поддерживают Ленивые Функциональные Конструкции, такие как Ленивые Списки, Ленивые Карты и т. д.- Увеличение читаемости и поддерживаемости
Функциональное программирование (ФП) также улучшает читаемость и поддерживаемость, потому что они работают независимо и не изменяют состояние.- Увеличение тестируемости
Поскольку мы пишем наши программы ФП с использованием независимых единиц, которые являются “Функциями”, мы можем легко тестировать их на уровне модуля.- Поддержка абстракции над поведением
В отличие от ООП, ФП поддерживает как “Абстракцию над данными”, так и “Абстракцию над поведением”. Потому что реальный мир содержит и то, и другое.- Поддержка для BigData
Поскольку ФП поддерживает параллельное программирование и лучшую производительность, ФП очень хорошо подходит для разработки приложений BigData.- Надежный и надежный код
Поскольку ФП использует неизменяемые данные, мы легко можем разрабатывать надежный и надежный код с использованием ФП.
Недостатки функционального программирования?
Помимо великих преимуществ, у языков функционального программирования также есть очень небольшие или минимальные или пренебрежимые недостатки. У них есть только следующие недостатки:
- Требует много памяти
ФП не имеет состояния. Они всегда создают новые объекты для выполнения действий, вместо того чтобы изменять существующие объекты. Из-за этого приложения ФП требуют много памяти.- Не сосредотачивается на подстановке Лискова
Каковы основные концепции функционального программирования?
Следующие концепции являются основными и важными концепциями функционального программирования.
- Функции первого класса.
- Ленивая оценка.
- Функции высшего порядка.
- Неизменяемость (неизменяемые данные).
- Модульность.
- Отсутствие побочных эффектов.
- Ленивая оценка.
- Рекурсивные вызовы функций.
Что такое императивное программирование?
Императивное программирование (ИП) – одна из популярных парадигм программирования, которая выполняет последовательность шагов/инструкций/операторов в определенном порядке. Примеры языков ИП: Java, C, C++ и т. д.
Основные характеристики императивного программирования?
Любой язык императивного программирования может содержать следующие характеристики:
- Последовательность операторов.
- Порядок выполнения операторов очень важен.
- Они содержат состояние.
- Они используют как неизменяемые, так и изменяемые данные.
- Они могут изменять состояние.
- У них могут быть побочные эффекты.
- Модель программирования с состоянием.
- Они непосредственно изменяют состояние программы.
- Они представляют состояние с помощью полей данных.
Что такое объектно-ориентированное программирование?
Объектно-ориентированное программирование – это еще один вид парадигмы программирования. Оно представляет все как объекты. Каждый объект содержит некоторые поля данных и методы. Все программы ООП содержат состояние. Они используют изменяемые данные и структуры данных. Как и в ФП, мы можем писать полные программы, используя неизменяемые данные, но это не является обязательным правилом. Объектно-ориентированное программирование (ООП) является надмножеством императивного программирования. Оно следует всем характеристикам ИП с некоторыми дополнительными возможностями. Эти дополнительные возможности:
- Все является объектом.
- Каждый объект содержит некоторые поля данных и методы.
- Концепции ООП: Абстракция, Инкапсуляция, Наследование и Полиморфизм
В отличие от функциональных языков программирования, языки ООП в основном сосредоточены на “Как это сделать”. Это означает, что как разработчики, мы фокусируемся на “Как ты это делаешь”. Более того, ООП объединяет как “Что ты делаешь”, так и “Как ты это делаешь”. Вот почему мы не можем написать краткий и более читабельный код. Только разработчики могут понять код, другие люди могут испытывать больше путаницы, пытаясь понять код приложения, они не могут его понять.
Недостатки объектно-ориентированного программирования (ООП)?
Несмотря на то, что ООП решает многие проблемы реального времени, у него все же есть следующие недостатки (по сравнению с ФП):
- Он не поддерживает полную переиспользуемость.
- Это не полностью Модульность.
- Это нарушает концепцию Инкапсуляции.
- У Наследования есть множество недостатков.
Основные недостатки Наследования:
- Нарушает принцип Инкапсуляции
- Когда уровни Наследования увеличиваются, очень сложно поддерживать и создавать объекты.
Когда использовать Функциональное программирование?
Мы должны использовать Функциональное программирование (FP) в следующих сценариях:
- Когда мы собираемся выполнять много различных операций над данными, которые зафиксированы.
- Другими словами, когда у нас есть несколько вещей с большим количеством операций.
Когда использовать Объектно-Ориентированное Программирование?
Мы должны использовать Объектно-Ориентированное Программирование (OOP) в следующих сценариях:
- Когда мы собираемся выполнять несколько операций над множеством различных вариантов с общим поведением.
- Иными словами, когда у нас больше вещей с меньшим количеством операций.
Примечание:- Здесь Вещи – это объекты реального мира, а операции – это действия в реальном мире. Например, на Java мы представляем эти объекты реального мира как “Классы”, а действия в реальном мире как Методы (Операции).
В чем разница между ФП и ООП(IP)?
Functional Programming | OOP |
---|---|
Does not exist State | Exists State |
Uses Immutable data | Uses Mutable data |
It follows Declarative Programming Model | It follows Imperative Programming Model |
Stateless Programming Model | Stateful Programming Model |
Main Fcous on: “What you are doing” | Main focus on “How you are doing” |
Good for Parallel (Concurrency) Programming | Poor for Parallel (Concurrency) Programming |
Good for BigData processing and analysis | NOT Good for BigData processing and analysis |
Supports pure Encaspulation | It breaks Encaspulation concept |
Functions with No-Side Effects | Methods with Side Effects |
Functions are first-class citizens | Objects are first-class citizens |
Primary Manipulation Unit is “Function” | Primary Manipulation Unit is Objects(Instances of Classes) |
Flow Controls: Function calls, Function Calls with Recursion | Flow Controls: Loops, Conditional Statements |
It uses “Recursion” concept to iterate Collection Data. | It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java |
Order of execution is less importance. | Order of execution is must and very important. |
Supports both “Abstraction over Data” and “Abstraction over Behavior”. | Supports only “Abstraction over Data”. |
We use FP when we have few Things with more operations. | We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java. |
Это все о трех популярных программных парадигмах. Примечание:- Я в основном из мира ООП, но начал работать с ФП всего год назад. Поэтому, если эксперты по функциональному программированию обнаружат какие-либо ошибки в этом сообщении, пожалуйста, предоставьте мне свои ценные замечания. Пожалуйста, оставьте комментарий, если вам понравилась моя статья или у вас есть какие-либо сомнения или предложения.