Д. Тернер, Аддисон-Уэсли, 1990
Со временем программное обеспечение увеличилось в сложности, и важность модульности для обеспечения качества становится все более очевидной и облегчить обслуживание кода, потому что небольшой модуль легче разрабатывать, повторно использовать и тестировать; однако модульность создает новую потребность, которая заключается в улучшении “glue code”, состоящего из код, используемый для объединения различных модулей. Основные преимущества функционального программирования направлены на улучшение модульности, облегчая повторное использование и тестирование каждого модуля благодаря ссылочной прозрачности и более эффективно объединяя их с реализацией функций более высокого порядка и ленивой оценки.
Примеры кода написаны на JAVA с использованием библиотеки VAVR , который реализует большую часть функций функционального программирования.
Справочная прозрачность
В функциональном программировании функции разделяют свое определение с математическими функциями, одной из основных особенностей которых является то, что для данного входного параметра он всегда возвращает одно и то же значение другими словами они устраняют побочные эффекты, присутствующие в других парадигмах программирования. Это приводит к тому, что вызов функции может быть заменен его значением без последствий для порядок выполнения или какой-либо другой неявный фактор контекста выполнения, это заставляет создавать модули легче понимать, повторно использовать и тестировать.
Функции более высокого порядка
Функции более высокого порядка-это те, которые получают или возвращают одну или несколько функций, что позволяет повторно использовать код и обобщение некоторых поведений для разных типов данных, которые должны переписывать только базовые функции, определяющие их конкретное поведение, а также более короткий и простой для понимания “glue code”. Основным примером функций более высокого порядка является функция foldLeft, которая позволяет объединить все элементы списка в один элемент результат многократного применения любой функции, которая получает в качестве параметра объекты типа элементов списка.
public static void main(String[] args) { Listlist = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9); Integer r = list.foldLeft(0, Integer::sum); // 45 } //codigo de la funcion foldLeft tomado del código fuente de vavr default U foldLeft(U zero, BiFunction super U, ? super T, ? extends U> f) { Objects.requireNonNull(f, "f is null"); U xs = zero; for (T x : this) { xs = f.apply(xs, x); } return xs; }
Ленивая Оценка
Одним из преимуществ отсутствия побочных эффектов является то, что программисты могут использовать ленивую оценку без необходимости предвидеть множество возможных сценариев, это определение значений в результате функции, которые не будут рассчитаны до что выполнение программы не требуйте этого, что позволяет создавать поведение, такое как массивы теоретически бесконечной длины, в большинстве случаев называемые потоками. Примером использования ленивой оценки является вычисление квадратного корня числа с использованием бесконечной последовательности кандидатов, которые оцениваются пока не найдете тот, который соответствует требуемой точности.
public static Function1siguienteCandidato(Double n){ /** * Formula para calcular la sucesión de candidatos a para la raíz cuadrada de n según el método de Newton-Raphson */ return Function1.of((anterior) -> (anterior + (n / anterior)) / 2d); } public static Double calcularRaizCuadrada(Double n){ Stream s = Stream.iterate(1d, siguienteCandidato(n)); Double epsilon = 0.0001d; // Se utiliza para especificar la precisión return s.takeUntil(candidato -> Math.abs((candidato * candidato) - n) < epsilon).last(); } public static void main(String[] args) { System.out.println(calcularRaizCuadrada(25d)); // 5.000023178253949 }
В приведенном выше примере также можно наблюдать второй случай функций более высокого порядка, представленный следующим порядком, состоящим из функции, возвращающей другую функцию.
Оригинал: “https://dev.to/gustavo94/repasando-artculos-why-functional-programming-matters—1l7i”