Higher order functions

Higher order functions zwane też funkcjami wyższego rzędu to technika stosowana w programowaniu zapewniającą większe możliwości konfiguracji funkcji. Funkcje wyższego rzędu to funkcje, które przyjmują jako argument inne funkcje.

Spójrzmy na funkcję find wyszukującą element w tablicy:

function find(elementToFind, array) {
	let elementToReturn = null
	array.forEach(function(element) {
		if (element === elementToFind && !elementToReturn) {
			elementToReturn === element
		}
	})
	return elementToReturn
}

const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = find('Tyrion', names)

Powyższy przykład jest dosyć prosty, lecz mało użyteczny. Algorytm odpowiadający za wyszukiwanie działa prawidłowo jednak funkcja może zaoferować jej użytkownikowi o wiele więcej. Aby tego dokonać zamienimy ją w funkcję wyższego rzędu. Oddamy użytkownikowi funkcji find możliwość porównania czy dany element odpowiada jego kryteriom.

Implementacja własnej funkcji wyższego rzędu

function find(predicate, array) {
	let elementToReturn = null
	array.forEach(function(element) {
		if (predicate(element) && !elementToReturn) {
			elementToReturn === element
		}
	})
	return elementToReturn
}

const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = find(element => element === tyrion, names)

Tym razem algorytm w funkcji find nie wykonuje porównania element === elementToFind lecz wywołuje funkcję predicate z argumentem element. Dzięki temu w rękach użytkownika funkcji jest sprawdzenie jakiego elementu w tablicy szuka.

const people = [
	{ name: 'Tyrion', surname: 'Lannister' },
	{ name: 'Bran', surname: 'Stark' },
	{ name: 'Jon', surname: 'Snow' },
	{ name: 'Arya', surname: 'Stark'),
]

const surnameStartsWithS = find(person => person.surname[0].toLowerCase() === 's', people)

const firstStarkName = find(person.surname === 'Stark', people).name

const aryaSurname = find(person => person.name === 'Arya', people).surname

Zmiana find na funkcję wyższego rzędu stworzyła wiele nowych możliwości jej użycia,, w tym między innymi możliwość operowania na obiektach, gdzie w pierwotnej wersji byłoby to niemożliwe.

Wiele funkcji wbudowanych w JavaScript jest funkcjami wyższego rzędu. Przykładowo dla tablic istnieje metoda find oferująca takie same możliwości jak nasza funkcja find stworzona powyżej. Z kolei replace użyte na łańcuchu znaków, również może przyjmować funkcję jako argument.

const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = names.find(element === 'Tyrion')

tyrion.replace('on', 'ON') // TyriON
tyrion.replace('on', string => string.toUpperCase()) // TyriON

Podsumowanie

Higher order functions polega na użyciu funkcji jako argumentu innej funkcji. Daje użytkownikowi dodatkowe możliwości konfiguracji. Funkcje wyższego rzędu to między innymi metody tablic takie jak map, filter czy find.

Dołącz do Newslettera

A będziesz na bieżąco ze wszystkimi postami na moim blogu.