Функциональное программирование или ООП: какую парадигму использовать?

Функциональное программирование или ООП Изучение

Традиционные языки программирования, такие как C, FORTRAN, Pascall, основаны на процедурном программировании. Эта парадигма программирования использует вызовы процедур, где каждая процедура (например, функция или подпрограмма) представляет собой набор вычислительных шагов, которым необходимо следовать. Он доступен и прост для понимания, но когда код становится длиннее или сложнее, внесение изменений в одну функцию может вызвать каскад ошибок, отслеживание которых может стать головной болью. Чтобы избежать этого спагетти-кода, компьютерные архитекторы сформулировали две относительно новые парадигмы программирования: объектно-ориентированное программирование (ООП) и функциональное программирование.

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

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

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

First-class citizens

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

  • хранится в переменной
  • передается как аргумент
  • возвращается из функции

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

Pure functions

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

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

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

Читайте также:  Что такое маскирование данных (Data Masking)? Типы, методы и передовой опыт

Функции высшего порядка и рекурсия

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

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

Хвостовой вызов относится к вызову функции в конце функции. Вызов хвоста может привести к рекурсивному циклу, когда функция вызывает сама себя. Многие компиляторы выполняют оптимизацию хвостовых вызовов (также известную как устранение хвостовых вызовов ), делая рекурсию такой же быстрой, как итерационные циклы.

Ключевые причины предпочтения рекурсии по сравнению с обычными примитивными циклами:

  • простота кода
  • избегайте изменяемых объектов, чтобы сделать код более надежным

Immutability

Неизменяемость — это постоянство переменной после присвоения ей данных.

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

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

Что такое объектно-ориентированное программирование?

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

Термин состояние в ООП относится к любым заданным значениям плюс изменения, внесенные в них в ходе выполнения программы.

Объектно-ориентированное программирование группирует связанные функции и их переменные в объекты. В объекте функции называются методами, а переменные — свойствами.

Например, на этом рисунке показано, как ООП может представлять автомобиль в виде группы свойств и методов.

Например, на этом рисунке показано, как ООП может представлять

Четыре столпа объектно-ориентированного программирования

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

  • Инкапсуляция : группировка связанных переменных и функций в объекты. Создание объекта основано на схеме или шаблоне, называемом классом.

Группировка функций и переменных позволяет вызывать функции с небольшим количеством параметров или без них, поскольку переменные включены как часть объекта.

  • Абстракция: скрытие некоторых свойств и методов объекта от постороннего наблюдения.

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

  • Наследование : объект может наследовать некоторые свойства и методы другого объекта.

В Java это наследование обозначается ключевым словом extend. Родительский класс, из которого расширяется другой класс, называется суперклассом или базовым классом. Например, классы Toyotaи Fordмогут быть расширениями Carкласса. Принимая во внимание, Ford Mustangчто это расширение Fordкласса. В этом случае общий код для обоих Toyotaи Fordможет быть написан один раз в их суперклассе Car.

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

  • Полиморфизм : буквально означает «множество форм» и относится к объектам, которые по-разному реагируют на одну и ту же функцию.

Полиморфизм основан на отношениях объекта с другими объектами и на том, как члены суперкласса расширяются в его производных классах. Это снова уменьшает избыточность и увеличивает возможность повторного использования. Полиморфизм — сложная концепция; если вы хотите узнать больше, мы рекомендуем вам ознакомиться с курсом: Learn Object-Oriented Programming in Java.

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

Когда использовать объектно-ориентированное или функциональное программирование

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

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

В настоящее время ООП является парадигмой, используемой большинством разработчиков, в основном из-за ее доступности. Функциональное программирование отлично подходит для серверной части приложений, обработки данных и сканирования веб-страниц. Например, вся фильтрация спама Facebook была построена с использованием функционального программирования на Haskell. По большей части нет четкого ответа на вопрос, какая парадигма будет лучше всего служить вам в вашем образовании и карьере в области разработки программного обеспечения. Хорошие инженеры-программисты используют методы и привычки, которые могут быть предписаны как для объектно-ориентированного, так и для функционального программирования.

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

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

Заключение

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

Оцените статью
bestprogrammer.ru
Добавить комментарий