Композиция функций в JS — это процесс, при котором выполнение одной функции передается в качестве аргумента другой функции. Фактически композиция помогает объединить более мелкие функции в единую.
С одной стороны, может показаться, что композиция функций в JS идет вразрез с основным принципом программирования. Основной принцип — разбивать сложные задачи на более мелкие и простые, потому что мелкими и простыми намного легче управлять.
Композиция функций в JavaScript не идет вразрез с основным принципом программирования. Да, она создает ложные функции, объединяя более мелкие, но это необходимо для чистоты кода и правильного функционирования программы. От проблем в коде никто не застрахован, тем более в нашем современном оцифрованном мире. Например:
В 2013 году разработчики компании Toyota допустили колоссальные ошибки в программном обеспечении машин. Из-за этих ошибок компании пришлось возвращать серию выпущенных автомобилей, так как их программное обеспечение не обеспечивало полноценный функционал и приводило к автомобильным авариям.
В 2014 разработчики Вооруженных Сил США допустили оплошность в программном обеспечении радаров. Таким образом, радар не мог полноценно отслеживать летящие ракеты. Он обнаруживал их, когда было уже слишком поздно что-то предпринимать. Вооружение отправили на доработку.
В 2015 году разработчики компании Боинг допустили ошибку в программном обеспечении самолетов. Летчикам приходилось «перезагружать» программное обеспечение самолетов через каждые 1500 летных часов, иначе ПО давало сбой. Никто не пострадал, ошибку вовремя заметили и ПО доработали.
Все это к тому, что ошибиться может каждый программист, для этого не важен уровень и статус. При чем здесь композиция функций JS? При том, что, изучив ее особенности, можно писать код с меньшим количеством ошибок.
Композиция функций в JS
Если вы активно программируете на JavaScript, тогда вы уже использовали композицию, сами того не осознавая. Композиция — это комбинирование. Современное программирование редко когда обходится без комбинирования функций. Когда это делается неосознанно, тогда результат выглядит так, будто его сделали на «скотч». Если делать все осознанно, тогда получаются мощные и функциональные конструкции.
Композиция функций в JavaScript — основа функционального программирования. Типичное описание композиции будет таким: «Используем функцию «f», которая принимает «х» и возвращает «х+3», также мы используем функцию «g», которая тоже принимает «х», но возвращает «х*4» — объединение этих функций и есть композиция». Вот как это выглядит в коде:
const f = x => x+3;
const g = x => x*4;
console.log(f(g(6)))// результат будет «27»
Фактически мы взяли функцию «f» и вложили в нее функцию «g». Функции «g» мы передали аргумент «6». В результате выполнения мы в консоли увидим число «27», потому что «6*4=24», потом результат «24» передается в функцию «f», где мы имеем вычисление «24+3=27».
Это простой пример композиции, можно даже считать его шаблоном. В реальном программировании композиция функций выглядит несколько сложнее.
Композиция функций JS: более сложные примеры
Пропишем функцию «mySelect». Она будет получать значение из некоего объекта «myObj», но перед этим она должна будет получить значение «key», а потом вернуть нам значение из «myObj» по этому «key». На словах все звучит довольно запутанно, однако, взглянув на код, вы поймете, о чем речь.
Код функции «mySelect» будет таким:
const mySelect = key => myObj => myObj[key];
Давайте увидим нашу функцию в работе. Для этого мы создадим еще одну функцию «getFirstName», у которой будет аргумент «firstName» и список «worker», который будет массивом объектов со свойством «firstName». Вот как это выглядит в коде:
const mySelect = key => myObj => myObj[key];
const getFirstName = mySelect("firstName");
const worker = [
{firstName:'Дормидонт'},
{firstName:'Платон'},
{firstName:'Федор'},
{firstName:'Анфиса'},
{firstName:'Анастасия'},
];
console.log(mySelect(getFirstName)(worker)); //Результат вывода будет ["Дормидонт", "Платон", "Федор", "Анфиса", "Анастасия"]
Заключение
Композиция функций JS — это основа функционального программирования на JavaScript. Композиция функций также применяется в других языках программирования, поддерживающих принцип функционального программирования, например, Haskell или Python. Другие языки, поддерживающие объектно-ориентированное программирование, используют похожие конструкции в коде, но не с функциями, а классами или объектами. Важно понять, что композиция — это структура программирования, от которой никуда не деться, и неважно, на каком языке программирования вы разрабатываете собственную программу.
JavaScript