Функции высшего порядка в Javascript | Кодементор

Введение

В Javascript функции являются значениями (первоклассными гражданами). Это означает, что их можно присвоить переменной и/или передать как значение.

let random = function(){
  return Math.random()
}

let giveMeRandom = random 

Это единственное знание позволяет нам писать функциональное программирование на этом языке. В функциональном программировании мы активно используем функции высшего порядка.

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

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

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

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


const double = n => n * 2

[1, 2, 3, 4].map(double) 

Или с анонимной функцией:

[1, 2, 3, 4].map(function(n){
  return n * 2
}) 

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

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

let array = [1, 2, 3, 4]
let newArray = []

for(let i = 0; n < array.length; i++) {
  newArray[i] = array[i] * 2
}

newArray 

Сила композиции

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

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

Этот метод уменьшает количество ошибок и делает наш код более легким для чтения и понимания.

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

Пример

Давайте попробуем на примере. Предположим, у нас есть список оценок в классе. В нашем классе 5 девочек, 5 мальчиков, и каждый из них имеет оценку от 0 до 20.

var grades = [
  {name: 'John', grade: 8, sex: 'M'},
  {name: 'Sarah', grade: 12, sex: 'F'},
  {name: 'Bob', grade: 16, sex: 'M'},
  {name: 'Johnny', grade: 2, sex: 'M'},
  {name: 'Ethan', grade: 4, sex: 'M'},
  {name: 'Paula', grade: 18, sex: 'F'},
  {name: 'Donald', grade: 5, sex: 'M'},
  {name: 'Jennifer', grade: 13, sex: 'F'},
  {name: 'Courtney', grade: 15, sex: 'F'},
  {name: 'Jane', grade: 9, sex: 'F'}
]

Я хочу знать несколько вещей об этом:

  • Средняя оценка этого класса
  • Средняя оценка мальчиков
  • Средняя оценка девочек
  • Высшая нота среди мальчиков
  • Высшая нота среди девушек

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

let isBoy = student => student.sex === 'M'

let isGirl = student => student.sex === 'F'

let getBoys = grades => (
  grades.filter(isBoy)
)

let getGirls = grades => (
  grades.filter(isGirl)
)

let average = grades => (
  grades.reduce((acc, curr) => (
    acc + curr.grade
  ), 0) / grades.length
)

let maxGrade = grades => (
  Math.max(...grades.map(student => student.grade))
)

let minGrade = grades => (
  Math.min(...grades.map(student => student.grade))
)

Я написал 7 функций, и у каждой из них есть одно задание, и только одно задание.

isBoy а также девушка несут ответственность за проверку того, является ли один ученик мальчиком или девочкой.

GetBoys а также GetGirls несут ответственность за получение всех мальчиков или девочек из класса.

maxGrade а также minGrade несут ответственность за получение наибольшей и самой низкой оценки по некоторым данным.

Окончательно, средний отвечает за расчет средней оценки некоторых данных.

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

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


let classroomAverage = average(grades) 
let boysAverage = average(getBoys(grades)) 
let girlsAverage = average(getGirls(grades)) 
let highestGrade = maxGrade(grades) 
let lowestGrade = minGrade(grades) 
let highestBoysGrade = maxGrade(getBoys(grades)) 
let lowestBoysGrade = minGrade(getBoys(grades)) 
let highestGirlsGrade = maxGrade(getGirls(grades)) 
let lowestGirlsGrade = minGrade(getGirls(grades)) 

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

А поскольку каждая функция отвечает только за одну вещь, это значительно упрощает отладку и тестирование нашего кода.

Правила композиции!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *