Узнайте все об IT
вместе с Павлом Волей
Кнопка закрыть топ-бар
ГлавнаяБлогФункциональное программирование: что это такое, преимущества и недостатки
Нейронные сети
6 966
Время чтения: 16 минут

Функциональное программирование: что это такое, преимущества и недостатки

Сохранить статью:
Сохранить статью:
В статье рассказывается:
  1. Что такое функциональные системы программирования
  2. Сравнение императивного и функционального программирования
  3. Преимущества и недостатки функционального программирования
  4. 5 принципов функционального программирования
  5. Языки функционального программирования
  6. Применение функционального программирования

Функциональное программирование на сегодняшний день является одним из приоритетных направлений развития кода. Оно кардинально отличается от императивной, объектно-ориентированной парадигмы. К примеру, если в императивном подходе используются инструкции, то в функциональном – функции, набор правил, которые необходимо выполнять без строгой последовательности действий.

Haskell, Erlang, Clojur – яркие представители ФП. На другом берегу такие мастодонты, как C++, Java. Конечно, принципы первой группы языков применимы далеко не везде, однако в своих сферах они практически незаменимы. О том, что такое функциональное программирование, вы узнаете из нашего материала.

Что такое функциональные системы программирования

Практически каждый программист первым делом изучал объектно-ориентированную методологию разработок. Обычно вхождение в эту специальность предполагает знакомство с языками Java или C++, а в лучшем случае Ruby, Python или C#. Такой разработчик уже точно будет иметь представление о классах, объектах и т.д. Но вот основы функционального программирования, скорее всего, ему еще не будут знакомы. Эта парадигма существенно отличается не только от объектно-ориентированного подхода, но и от других методологий (процедурная, прототипно-ориентированная и др.).

Функциональное программирование становится все более востребованным. Это обусловлено рядом факторов. Нельзя сказать, что это новая парадигма. Так, еще в девяностых годах появился язык программирования Haskell, который и сейчас активно используется для ФП. В эту же категорию могут быть отнесены также Erlang, Scala, Clojure. Все подобные языки программирования объединяет одно очень важное преимущество. С их помощью можно писать конкурентные программные продукты, поэтому при их использовании отпадают такие проблемы, как взаимные блокировки и потокобезопасность.

Что такое функциональные системы программирования
Что такое функциональные системы программирования

Суть функциональной парадигмы программирования заключается в том, что разработчик должен задавать не последовательность требуемых команд, а описать принцип их взаимодействия с подпрограммами. Это напоминает работу в ООП, но в этом случае реализация осуществляется на уровне всего программного продукта.

К примеру, в объектно-ориентированном программировании разработчик должен задать объекты и описать алгоритмы их взаимодействия друг с другом, но, при этом, есть возможность для написания кода, не связанного с ними. Такой код выглядит обособленным и оказывает влияние на работу всей программы. Он направляет некоторые объекты для взаимодействия между собой, осуществляет обработку определенных результатов и т.д.

Функциональная парадигма в этом плане продвинулась глубже. При таком программировании код описывает правила работы с данными. Разработчик лишь формирует необходимые условия, а код уже непосредственно определяет их практическое применение.

Сравнивая процедурное и функциональное программирование, можно отметить совпадения только в наличии команд, которые выполняет язык. Все остальные аспекты этих парадигм отличаются.

Понятие функционального программирования связано с парадигмами, при которых приложения разрабатываются путем последовательного использования функций. А при процедурном подходе применяются инструкции.

Сравнение императивного и функционального программирования

Можно решить, что термин «функциональный стиль программирования» говорит о функциях.

Но это не так. Функции представлены в различных парадигмах. Но в отношении функционального программирования отличие от императивного заключается в самом подходе к написанию приложений.

Для наглядности рассмотрим ситуацию с открытием кафе. Здесь предусмотрено наличие таких типов работников, как повара и администраторы.

Поварам необходимо предоставить пошаговую инструкцию по приготовлению каждого блюда. К примеру:

  1. Наполнить кастрюлю водой.
  2. Разместить кастрюлю на плите и установить определенную температуру нагрева.
  3. Посолить воду в кастрюле с использованием нужного количества соли.
  4. При приготовлении 10 порций, нужно использовать 1 свеклу, для 20 порций – 2 две свёклы и т.д.
  5. Почистить всю отобранную свеклу.
ТОП-30 IT-профессий
2022 года с доходом
от 200 000 ₽
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

Скачивайте и используйте уже сегодня:

Александр Сагун
Александр Сагун
Исполнительный
директор Geekbrains
pdf иконка

Топ-30 самых востребованных и высокооплачиваемых профессий 2022

Поможет разобраться в актуальной ситуации на рынке труда

doc иконка

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

pdf иконка

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

pdf 3,7mb
doc 1,7mb
Уже скачали 12476 pdf иконка

Задача повара четко выполнять шаги инструкции в заданной очередности. Недопустимо вначале посолить, а потом набрать воды или взять 20 свекл на 10 порций. Весь порядок и характер действий повара определяет инструкция, которая составлена «программистом» процесса. Такая методика присуща императивному программированию. Другими словами, происходит управление исполнителем, которые претворяет в жизнь наши задания.

Инструкция для администратора отличается от той, которая составлена для повара. В этом случае формируется специальный свод правил:

  • В кафе посетители не могут приносить свои продукты. При выявлении таких фактов администратор должен сделать гостям замечание в установленной форме.
  • В кафе следует поддерживать чистоту, а при необходимости вызвать уборщика.
  • При возникновении очереди, открыть еще одну кассу.

В данном случае мы также имеем дело с командами, но администратор выполняет их не в конкретной очередности, а на свое усмотрение, исходя из необходимости. Таким образом, задача этого сотрудника состоит в выполнении своих функций, исходя из прописанных правил. Эта методика и является примером функциональной парадигмы.

Преимущества и недостатки функционального программирования

Особенности функционального программирования обеспечивают более высокую чистоту кода и его простую читаемость. Благодаря таким принципам составления программ, появляется возможность предотвратить ненужные абстракции с непредсказуемыми действиями. Таким образом, можно обеспечить высокую предсказуемость работы программы и сократить численность потенциальных ошибок.

Преимущества и недостатки функционального программирования
Преимущества и недостатки функционального программирования

Методы функционального программирования неэффективны для разработки алгоритмов, которые построены на графах. Это связано с более медленной работой приложения. Можно сказать, что парадигмы функционального программирования не ориентированы на использование для решений, которые на протяжении многих лет базировались на императивных принципах.

Основной момент заключается в том, что языки функционального программирования не имеют действенного неупорядоченного словаря множества. Если сравнивать с хэш-таблицами, то словари языков, построенных на функциях, работают не так эффективно, что может стать преградой для работы ряда предложений. Но, такие минусы имеют отношение только к императивным языкам.

5 принципов функционального программирования

Теперь поговорим о преимуществах. Основное — это возможности функционального программирования по максимуму использовать ресурсы процессора. Это обусловлено конкурентным поведением и определяется принципами, которые, впрочем, не все можно назвать обязательными. Есть много языков, в которых такие принципы поддерживаются не в полном объеме. Это обусловлено их теоретическим характером. Принципы функционального программирования устанавливаются, чтобы максимально точно дать определение функциональной парадигмы. Основные 5 выглядят следующим образом:

Применяются исключительно чистые функции

Это базовый принцип функционального программирования. Чистыми считаются функции, которые соответствуют 2-м условиям:

  • Функции, которые вызывает одинаковым аргументом, обязательно должны возвращать одно и то же значение.
  • В процессе выполнения функции не должны иметь место побочные эффекты.
Только до 7.07
Как за 3 часа
разбираться в IT
лучше, чем 90%
новичков и выйти на
доход в 200 000 ₽?
Приглашаем вас на бесплатный онлайн-интенсив «Путь в IT»! За несколько часов эксперты GeekBrains разберутся, как устроена сфера информационных технологий, как в нее попасть и развиваться.
Александр Волчек CEO GeekBrains

Интенсив «Путь в IT» поможет:

  • За 3 часа разбираться в IT лучше, чем 90% новичков.
  • Понять, что действительно ждет IT-индустрию в ближайшие 10 лет.
  • Узнать как по шагам c нуля выйти на доход в 200 000 ₽ в IT.
При регистрации вы получите в подарок:
pdf иконка

«Колесо компетенций»

Тест, в котором вы оцениваете свои качества и узнаете, какая профессия в IT подходит именно вам

doc иконка

«Критические ошибки, которые могут разрушить карьеру»

Собрали 7 типичных ошибок, четвертую должен знать каждый!

pdf иконка

Тест "Есть ли у вас синдром самозванца?"

Мини-тест из 11 вопросов поможет вам увидеть своего внутреннего критика

pdf иконка

Гайд по профессиям в IT

5 профессий с данными о навыках и средней заработной плате

Хотите сделать первый шаг и погрузиться в мир информационных технологий? Регистрируйтесь и смотрите интенсив:
Только до 7 июля
Осталось 17 мест

В соответствии с первым условием, к примеру, при вызове функции (подпрограммы) sum(2, 3), мы понимаем, что всегда в результате получим 5. Но, если идет обращение к подпрограмме rand() или к переменным, которые не определены функцией, то условие чистоты не соблюдается, а это является недопустимым моментом для рассматриваемой парадигмы.

Условие номер два в отношении недопустимости побочных эффектов является более обширным. Что такое побочный эффект? В контексте данной парадигмы это изменение какого-либо элемента, не связанного с функцией, исполняемой в конкретный момент. Примерами таких эффектов, которые приводят к нарушению условия чистоты, могут служить: вызовы переменной вне функции, вывод в консоль, вызов исключения, чтение файловых данных.

На первый взгляд такое ограничение кажется очень строгим, но при наличии уверенности в том, что обращение к функции не спровоцирует «внешних» изменений, подпрограмму можно применять во всех сценариях. Эта особенность обеспечивает конкурентность программирования многопоточных программ.

В данной парадигме предусматривается применение функций первого класса и высшего порядка

Такой же принцип, помимо языков функционального программирования, действует в Javascript, PHP и в ряде других систем. Но для ФП он является обязательным.

Чтобы функция могла считаться первоклассной, должна присутствовать возможность для ее объявления в виде переменной. Благодаря такому условию можно управлять подпрограммой так же, как и обычными типами данных, а, при этом, и исполнять ее.

Неизменность переменных
Неизменность переменных

Подпрограммы высшего порядка допускают принятие в качестве аргумента других функций. При этом, они могут и возвращать функцию. Яркими примерами подобных подпрограмм можно назвать map и filter.

Неизменность переменных

Этот принцип достаточно прост. Используя функциональную модель программирования, нельзя менять переменную после инициализации. Можно создавать новую, но изменение существующей недопустимо. Благодаря этому принципу мы получаем уверенность, что переменные не будут изменены.

Относительная прозрачность подпрограмм

Этот принцип объяснить намного сложнее. Наиболее соответствующее истине определение выглядит так: функция считается относительно прозрачной, при условии, что при замене вызова функции на возвращаемое значение, состояние не изменится. Для наглядности приведем пример.

Допустим, мы имеем Java-функцию, суммирующую 3 и 5:

public int addNumbers(){

return 3 + 5;

}

addNumbers() // 8

8            // 8

Таким образом, вызов данной подпрограммы можно заменить на 8 — значит, а значит функция относительно прозрачна. Вот пример непрозрачной функции:

public void printText(){

System.out.println(«Hello World»);

}

printText()   // Returns nothing, but prints «Hello World»

В этом случае подпрограмма не осуществляет возврат, а просто выводит текст на монитор. При замене вызова функции на «ничто» состояние консоли будет другим. Такая подпрограмма не считается относительно прозрачной.

ФП базируется на лямбда-исчислении

Функциональный подход в программировании в большей степени базируется на математической системе, которая носит название лямбда-исчисление. Такая система баз имеет два важных принципа, которые определяют понятие функционального программирования:

  • Все функции в лямбда-исчислении могут выступать анонимными, так единственным важным элементом их заголовка выступает список аргументов.
  • В ходе вызова функций запускается процесс картирования. Это значит, что если вызываются функции с рядом аргументов, то вначале выполняется первый из них, а затем происходит возврат уже нового объекта, содержащего на один аргумент меньше. Далее происходит немедленный вызов уже обновленной функции. Такая процедура будет длиться, пока не будут обработаны все аргументы и не произойдет возврат итогового результата. Возможность такого варианта прохождения процесса обеспечивается чистотой функции.
Лямбда-исчисление – более обширная система, но в этом материале мы уделили внимание только основным ее свойствам, имеющим отношение к функциональному программированию.

Языки функционального программирования

Элементы функционального программирования могут поддерживаться далеко не всеми языками. Есть примеры систем, которые разрабатывались специально для такой парадигмы (Haskel), а существуют и такие языки, которые могут применяться, как в объективно-ориентированных, так и в функциональных методиках (JavaScript). Встречаются также языки, которые совершенно невозможно использовать для ФП.

Приведем примеры функциональных языков программирования:

  • Haskell – самый распространенный язык для функционального программирования. Эта система отличается качественно реализованной защитой памяти, выделением мусора, улучшенной скоростью работы, обеспечиваемой ранней компиляцией машинного кода. Ее обширная статическая типизация обеспечивает возможность доступа к особым алгебраическим и полиморфным типам. Эта особенность повышает эффективность разработки программ и улучшает читаемость кода.
  • Erlang, так же, как и созданный на его основе Elixir считаются лучшими языками ФП для параллельных систем. По популярности они уступают Haskell, но часто применяются для бэкенд-программирования. Не так давно к Erlang наблюдается повышенный интерес со стороны разработчиков некоторых масштабируемых мессенджеров (к примеру, WhatsApp и Discord).
  • Clojure – язык, который имеет диалект Lisp, ориентированный на функциональное программирование и способный работать на виртуальной машине Java (JVM). Он может поддерживать изменяемые и неизменяемые структуры данных. Следует отметить, что Clojure менее строг по своим требованиям в отношении работы с функциями. Те разработчики, которым понравился Lisp, будут с удовольствием работать и с Clojure.
  • F# — хоть и находится в другой языковой группе, но сильно напоминает Haskell. У него не так много расширенных возможностей, а также слабо реализована поддержка объектно-ориентированных элементов.

Языки, имеющие функциональные возможности:

  • Scala – система, поддерживающая объектно-ориентированные и функциональные языки программирования. Она отличается наличием жесткой статической типизации, что напоминает Haskell. Благодаря такой особенности, Scala позволяет писать строгие функциональные программы. Целью разработки этого языка было решение критических проблем системы Java. В связи с этим его часто используют в Java-разработчике, если хотят попробовать себя в функциональном программировании.
  • JavaScript изначально не был ориентирован на функциональное программирование, но и этому направлению также уделяется особое внимание, что обусловлено асинхронной природой языка. Эта система способна поддерживать такие важные функциональные аспекты, как лямбда-исчисления и деструктуризация. Благодаря таким особенностям, JS может считаться ведущей системой для ФП.
  • Python, PHP, C++: эти мульти-парадигмальные языки тоже поддерживают функциональное программирование, но уже в меньшей степени, чем Scala и JavaScript.
  • Java: этот язык относится к языкам общего назначения, но приоритет в нем отдается ООП, основанному на классах. Несмотря на то, что добавление лямбда выражений в некотором смысле помогает реализовывать более функциональный стиль, в конечном итоге Java остается языком ООП. Он позволяет заниматься функциональным программированием, но при этом в нем недостает ключевых элементов, которые бы оправдывали его освоение именно с этой целью.

Применение функционального программирования

Сейчас очень интересное время для тех, кто занимается разработкой программных продуктов. Облачные вычисления, а, следовательно, и неограниченные объемы компьютерных мощностей теперь стали доступны всем. Но, вместе с тем, появились и более высокие требования в отношении масштабируемости, производительности и параллелизма.

Применение функционального программирования
Применение функционального программирования

ООП уже не может справляться с новыми вызовами и в особенности с соблюдением принципов конкурентности и параллелизма. Стремление внедрить такие критерии в существующие объективно-ориентированные языки приводит к появлению усложнению работы с ними и падению производительности.

В то же время, функциональное программирование позволяет решать такие задачи как обеспечение неизменяемости состояния, замыкания и работа с функциями высокого порядка, которые прекрасно подходят для разработки высоконагруженных и распределенных программных продуктов.

Подтверждением этого могут служить новости, поступающие от тех, кто работает над такими стартами, как WhatsApp и Discord:

  • Поддержку 900 млн. пользователей WhatsApp осуществляют всего 50 специалистов, работающих на Erlang.
  • В Discord каждую минуту обеспечивается свыше 1 млн. запросов, применяя Elixir.

Функциональное программирование обеспечивает возможность указанным сервисам эффективно справляться с мощным ростом пользователей. Так как ФП становится все более популярным, то и подобные примеры будут появляться более массово.

На основании вышесказанного, можно сделать вывод, что основы функционального программирования должен знать каждый, кто занимается разработками программных продуктов. Это позволит работать над приложениями следующих поколений, способными в будущем обслуживать огромное количество пользователей.

Оцените статью
Рейтинг: 3.5
( голосов 4 )
Поделиться статьей
Добавить комментарий

Забрать
гарантированный
подарок
Скачать файл

Получите бесплатно подборку файлов от GeekBrains:

Осталось 17 мест

Поздравляем!
Вы выиграли:

2-х дневный интенсив "Путь в IT"

Не пропустите сообщение!
Мы скоро свяжемся с вами!

Редирект для продолжения диалога Скачать файл
×
Максим Федотов
Максим Федотов печатает ...