Использование функций высшего порядка для обработки данных в функциональном программировании | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 15 февраля, печатный экземпляр отправим 19 февраля.

Опубликовать статью в журнале

Автор:

Научный руководитель:

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №6 (557) февраль 2025 г.

Дата публикации: 02.02.2025

Статья просмотрена: 4 раза

Библиографическое описание:

Маметджумаева, Гулалек. Использование функций высшего порядка для обработки данных в функциональном программировании / Гулалек Маметджумаева. — Текст : непосредственный // Молодой ученый. — 2025. — № 6 (557). — URL: https://moluch.ru/archive/557/122433/ (дата обращения: 07.02.2025).

Препринт статьи



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

Ключевые слова: функции, высший порядок, функциональное программирование, код.

В последние годы наблюдается рост применения функционального программирования на практике, поскольку значительное количество языков программирования включили в себя функциональные возможности. Все больше компаний нуждаются в специалистах с навыками функционального программирования в связи с выраженными преимуществами данного подхода. Функциональное программирование основывается на математических концепциях и рассматривает вычисления как оценку математических функций [1]. В этом подходе функции рассматриваются как первоклассные объекты: их можно передавать как аргументы, возвращать из других функций, а также хранить в структурах данных. Это создаёт основу для написания кода, который легко масштабируется и поддерживается. Противостояние изменяющемуся состоянию, без попыток управлять им, является основополагающим принципом функционального программирования [2].

Согласно Эрику Норманду, функциональное программирование — это обширная и многогранная область различных методик и принципов. При этом в основе лежит различие между действиями, вычислениями и данными [3]. Кереки Ф. определяет функциональное программирование как подход, основанный получении необходимого результата путем оценки выражений, построенных из функций, составленных воедино [4]. Данной парадигме свойственно передача функций по принципу «от одного к другому» (например, передача параметров другим функциям или возврат функций в результате вычисления), отказ от циклов (вместо них используется рекурсия) и исключение побочных эффектов (например, модификации объектов или глобальных переменных).

Функциональное программирование отличается от императивного подхода своей лаконичностью и простотой. Функции могут передаваться в качестве аргумента другим функциям или возвращаться в результате их вызовов. В данном подходе отсутствует оператор присвоения, объекты такого языка не могут быть изменены или удалены, возможно только создание новых объектов путем декомпозиции и синтеза существующих объектов [5]. Функциональное программирование может привести к созданию кода, который станет более модульным, пригодным для повторного использования и менее подверженным ошибкам [6]. В качестве примеров языков, в которых применяется функциональное программирование можно привести Scala, JavaScript, Python, PHP, C++, Java [7].

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

Функция высшего порядка — функция, которая принимает функции как параметры, или возвращает функцию в качестве результата [8]. Функции имеют возможность принимать в качестве аргументов другие функции, тем самым формируя цепи функциональных преобразований, где функции могут быть переданы и манипулируемы подобно другим объектам языка [9]. Эти свойства открывают множество возможностей: от упрощения повторяющихся операций до построения гибких и адаптируемых архитектур. Благодаря неизменяемости данных и отсутствию побочных эффектов, программы становятся более предсказуемыми, что упрощает их отладку и поддержку. Функции высшего порядка позволяют выразить сложные операции более компактно и с минимальным повторением кода [10]. Например, map, filter и reduce в JavaScript представляют собой функции высшего порядка, которые позволяют легко и лаконично обрабатывать данные. При обработке списка товаров вместо традиционного цикла достаточно внести функцию, описывающую, что именно нужно сделать.

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

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

— обработка массивов, списков, деревьев и других структур при работе с коллекциями данных;

— обобщение повторяющихся операций в процессе создания абстракций;

— построение цепочек преобразований данных;

— обработка событий и промисов при асинхронном программировании.

Следует отметить, что функции высшего порядка способствуют созданию кода, который проще тестировать, масштабировать и производить рефакторинг. Рефакторинг — это процесс улучшения структуры кода без изменения его функциональности. Например, представим код, который содержит повторяющиеся участки логики: если использовать функции высшего порядка, такие как map, filter или reduce, можно свести эту избыточность к минимуму. Это не только делает код компактным, но и улучшает его читаемость. Рассмотрим пример на рис.1.

Пример рефакторинга

Рис. 1. Пример рефакторинга

Этот простой пример демонстрирует, как map устраняет необходимость в цикле и переменных, делая код более лаконичным. Рассмотрим еще один пример на JavaScript. Допустим, дан массив чисел, и необходимо получить массив квадратов только нечётных чисел. В императивном подходе это выглядело бы как на рис. 2.

Пример императивного подхода

Рис. 2. Пример императивного подхода

С помощью функций высшего порядка тот же результат можно достичь значительно проще. Результат рефакторинга представлен на рис. 3.

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

Рис. 3. Пример с применением функций высшего порядка

Этот код не только короче, но и читается как простое описание задачи: «Отфильтровать нечётные числа и возвести их в квадрат». В императивном подходе фильтрация и вычисление квадратов чисел сделаны вручную в одном цикле, в результате рефакторинга каждая операция вынесена в отдельные функции. Следовательно, использование функций высшего порядка уменьшает дублирование кода на 60 %, избавляясь от ручного управления итерациями. Также, следует отметить, что количество строк кода сократилось до 3, делая его более компактным и структурным.

Функции высшего порядка особенно полезны в обработке больших наборов данных. Например, при работе с потоками данных или массивами функции высшего порядка (фильтрация, преобразование и агрегация) помогают написать код с минимальным количеством строк кода. Представьте себе большой массив данных, содержащий информацию о транзакциях, и необходимость выделить только те транзакции, которые превышают определённую сумму. В функциональном программировании это можно сделать буквально в одной строке, представленной на рис. 4.

Работа с массивами в функциональном программировании

Рис. 4. Работа с массивами в функциональном программировании

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

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

Рис. 5. Пример применения функций высшего порядка

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

Пример императивного подхода

Рис. 6. Пример императивного подхода

Необходимо использовать функцию filter для исключения четных чисел из массива, функцию map для возведения нечетных чисел в квадрат и функцию reduce для подсчёта их суммы. Таким образом, на рис. 7 в цепочке функций каждая из них выполняет определённую задачу упрощая код.

Пример рефакторинга

Рис. 7. Пример рефакторинга

До рефакторинга в коде выполняются 3 операции в цикле, после 2 операции, что сокращает число итераций на 33 %. Таким образом, наглядно преимущества использования функций высшего порядка при рефакторинге можно представить как на рис. 8.

Оценка изменений кода до и после рефакторинга

Рис. 8. Оценка изменений кода до и после рефакторинга

Рефакторинг кода с использованием функций высшего порядка для обработки данных позволил ускорить исполнения кода на 30 % и за счёт универсальности сократил общее количество строк кода на 40 %. Читаемость кода улучшилась за счет снижения цикломатической сложности кода на 50 % и сокращения количества повторов кода на 24 %.

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

— использовать их для упрощения кода и избежания дублирования;

— обращать внимание на производительность, избегая излишних промежуточных операций;

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

— минимизировать побочные эффекты, используя чистые функции;

— использовать каррирование для избегания перегруженности кода;

— следить за производительностью в больших массивах данных;

— делить обработку данных на последовательные этапы;

— по возможности, использовать иммутабельные структуры данных;

— создавать композицию функций для упрощения логики;

— следите за типами входных данных.

Руководствуясь данными правилами, был разработан ИИ — помощник программиста, который предназначен осуществлять рефакторинг кода используя функции высшего порядка и принципы функционального программирования. Цель ИИ — помощника заключается в совершенствование кода за счет использования функций высшего порядка.

Для разработки ИИ — помощника был сформирован подробный и структурный промт, требующий анализ исходного кода, рефакторинга с использованием функций высшего порядка, подробные пояснения к коду. В качестве плагинов использованы GPT-4V и Code Interpreter, что позволяет боту не только давать рекомендации, но и тестировать код в реальном времени. Архитектура ИИ-помощника представлена на рисунке 9.

Архитектура ИИ-помощника

Рис. 9. Архитектура ИИ-помощника

После разработки промта и плагинов было выполнено тестирование бота на различных сценариях, включающих в себя преобразование сложных циклов, асинхронных операций и работы с деревьями и графами. Результаты показали, что он эффективно выявляет возможности для улучшения, сокращает дублирование кода, повышает читаемость и объясняет принятые решения. Доступ к данному помощнику можно получить в программе Telegram по ссылке @Mametjumayevabot.

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

Литература:

1. Бабаев Б., Чарыева А., Чолуков Х. Парадигмы программирования: функциональное, объектно-ориентированное //Вестник науки. — 2024. — Т. 3. — №. 10 (79). — С. 877–880.

2. Jack Widman. Learning Functional Programming // Sebastopol: O’Reilly Media, Inc., 2022–138 c.

3. Eric Normand. grokking Simplicity taming complex software with functional thinking // Shelter Island, NY: Manning Publications Co., 2021–593 c.

4. Federico Kereki. Mastering JavaScript Functional Programming // Birmingham: Packt Publishing, 2023–614 c.

5. Functional and procedural programming in Mathematica. V. Aladjev, M. Shishakov, V. Vaganov.– USA: KDP Press, 352 p., 2020.

6. Фахриддинов Ж. Ш. Функциональное программирование //Educational Research in Universal Sciences. — 2023. — Т. 2. — №. 14 SPECIAL. — С. 933–936.

7. Харламова, Н. С. Функциональное программирование и его применение в задачах анализа данных / Н. С. Харламова // Вестник молодых ученых Самарского государственного экономического университета. — 2024. — № 1(49). — С. 141–142.

8. Анисимов А. и др. Функциональное программирование. Теоретические и практические основы для разных языков. Учебник для вузов. — 2024.

9. Антипов, Д. А. интерпретатор функционального языка программирования с поддержкой метапрограммирования / Д. А. Антипов // Программная инженерия: современные тенденции развития и применения (ПИ-2024): сборник материалов VIII Всероссийской научно-практической конференции с международным участием, Курск, 17 октября 2024 года. — Курск: ЗАО «Университетская книга», 2024. — С. 6–13.

10. Узких, Г. Ю. Функциональное программирование и его влияние на качество кода и обслуживаемость / Г. Ю. Узких // Вестник науки. — 2023. — Т. 4, № 8(65). — С. 316–318.



Задать вопрос