Статьи

Функциональный JavaScript для ленивых разработчиков (Like Me)


Функциональный JavaScript для ленивых разработчиков

Функциональный JavaScript, средство для ленивых

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

Но я быстро понял, что компьютеры очень буквальны. Если я не скажу им точно, что я ожидал в явных и недвусмысленных терминах, используя язык, который они понимают, они редко вернут мне то, что я имел в виду. И, будучи ленивым, я не хотел работать усерднее, чем нужно, чтобы выразить свои намерения.

Затем я увидел, как JavaScript перешел от нескольких обязательных однострочников к большим и запутанным объектно-ориентированным приложениям, и, казалось, не было конца этой сложности.

Я начал искать способы сделать кодирование проще и веселее. И этот поиск привел меня непосредственно к функциональному программированию.

Новые способы взглянуть на проблемы

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

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

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

На протяжении всего пути я обнаружил некоторые удивительные вещи в функциональном программировании на JavaScript, которые я углублюсь сегодня.

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

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

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

Чистые функции без побочных эффектов

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

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

Состав и Разложение

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

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

Встраивание в существующий JavaScript

Поскольку JavaScript превратился из простых однострочников в браузерах в сложную экосистему для поддержки приложений, синтаксис языка также изменился. С ECMAScript 5 массивы стали функторами, изначально поддерживая метод Map для применения функции ко всем элементам массива и возврата нового массива. Массивы также теперь имеют собственные методы для функциональных методов, таких как сокращение и фильтрация .

Новые функции в ECMAScript 2015 и более поздних версиях включают удобство функций стрелок, которые упрощают и делают интуитивно понятным написание кода с анонимными встроенными функциями. Операторы деструктуризации и распространения также облегчают работу с массивами, которые могут содержать неизвестное количество элементов во время их вызова. И генераторы дают нам естественный доступ к некоторым волшебствам ленивых вычислений , как это делали наши друзья, использующие Haskell и Ruby в течение многих лет.

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

Новый способ научиться функциональному программированию

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

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

Функциональные обзоры программирования на JavaScript

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

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

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

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

Признать, когда лучше использовать технику над другим.

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

  1. Что такое функциональное программирование?
  2. Работа с рекурсией
  3. Понимание карри
  4. Карта, уменьшение и фильтрация
  5. Функциональные композиции
  6. Что мы узнали

greg-rakozy-38802 2