В последнее время все большую популярность среди разработчиков занимают функциональные языки программирования. На самом деле, большинство современных языков поддерживают функциональный стиль, но также существуют и исключительно функциональные языки. Давай кратко познакомимся с основными особенностями и чем этот стиль отличается от привычного большинству императивного.
Основная причина, по которой большинство разработчиков работают с императивными языками предельно проста – в большинстве российских школ на уроках информатики для обучения программированию используется язык Pascal. А то, что попадается человеку первым кажется ему более привычным. Это особенность человеческого мозга и восприятия действительности.
Императивный стиль нацелен на то, чтобы пошагово описать порядок действий, которые необходимо выполнить для получения ожидаемого результата.
Функциональный стиль описывает с помощью функций ожидаемый результат, который можно получить в результате выполнения других функций.
В данном случае мы описываем анонимную агрегатную функцию, которая будет выполнять суммирование всех элементов массива, что нам и было необходимо сделать. На самом деле, это можно было сократить до еще более короткой команды, но это уже совсем другая история.
И да, если ты не узнал, то я использую язык программирования C#, который в основном работает с императивным стилем, но также поддерживает и функциональный.
При выполнении разработки в функциональном стиле (хотя на самом деле это хорошая практика и для императивного), важно использовать чистые функции.
Чистой функцией называется такая функция, которая никогда не меняет возвращаемый результат, если на вход были поданы идентичные параметры, а также не оставляет побочных эффектов. Под побочными эффектами понимается влияние на внешние данные, например изменение глобальных переменных или запись данных в файл.
В примере, рассмотренном выше – функция суммирования является чистой, так как она принимает в себя аргументы по значению, а как следствие не может их изменить внутри себя, и просто возвращает результат вычисления. Но, если бы она не возвращала значение, а изменяла бы глобальную переменную результата, то она бы уже была нечистой.
Также стоит сказать о функциях высшего порядка. Под функциями высшего порядка понимают такие функции, которые могут принимать в качестве аргументов другие функции.
В данном случае мы видим функцию Aggregate, которая принимает в качестве аргумента другую анонимную функцию (x, y) => x + y. Таким образом мы задаем правила обработки всех элементов коллекции и на выходе получаем готовый результат.
Эти два понятия являются основополагающими в функциональном программировании и определяют весь дальнейший стиль написания кода. Из основных преимуществ функционального стиля можно выделить следующие качества:
Повышенная надежность – работа выполняется только с локальными данными и не нужно следить за побочными эффектами
Удобство тестирования – нет побочных эффектов – нет проблем с плавающими багами.
Удобство распараллеливания – опять-таки из-за отсутствия побочных эффектов можно легко разделить процесс вычисления на отдельные потоки.
Из минусов можно отметить необходимость дополнительно выделяемой памяти для создания автономных аргументов.
Многие разработчики считают, что именно за функциональным стилем будущее, но на мой взгляд – это личное дело каждого. Стиль написания кода, как и выбираемый язык программирования – это всего лишь инструмент решения поставленной задачи, и просто в некоторых случаях одно подходит лучше, чем другое. А как думаешь ты?
Большое спасибо за прочтение! Пожалуйста, поставь лайк и подпишись на канал, чтобы не пропустить свежие статьи. Этим ты очень поможешь развитию блога!
Также рекомендую прочитать статью Какие 5 привычек необходимых хорошему разработчику