Abstractions icon indicating copy to clipboard operation
Abstractions copied to clipboard

FP good style for JavaScript

Open tshemsedinov opened this issue 8 years ago • 3 comments

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

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

Большое спасибо Алексею @mr-mig, Эльдару @edjafarov, Ингвару @RReverser, Алексею @agil и Никите @galkin за критический подход и советы. Надеюсь на вашу поддержку в этом деле и прошу делать issue или RP в случае выявления проблем в примерах кода. Если хотите, я буду уведомлять о тех кусках концептуального кода, которые требуют обсуждения, нажмите :+1: если так.

Какую я ставлю перед собой задачу именно в этом репозитории:

  • написать одну и ту же задачу в абстракциях разных парадигм и иметь возможность сравнивать их на кратком примере кода в одну страницу (не целый проект)
  • показать несколько хороших стилей, чтоб можно было демонстрировать ох особенности и показывать где какой лучше подходит
  • показать плохие примеры кода, продемонстрировать проблемы, к которым они приводят и научить студентов различать эстетику и стиль кода

Сразу отвечу на несколько вопросов:

  1. @mr-mig и @edjafarov, я согласен по поводу именования, и улучшу его еще в ближайшее время
  2. @agil про порядок compose ты прав, но тут удобно писать в прямом порядке, это нагляднее, я не так хорошо знаком с библиотеками фп и не видел где обратный compose называется pipe, если ты имеешь ссылку или уверен, что это общепринятое название, то я заменю
  3. @RReverser, я понимаю, что смешивать разные уровни абстракции в одном коде это смертный грех, но примеры должны быть краткими, компактными и иллюстративными, поэтому я помещаю их в один файл, группирую в блоки и даю пояснения во время лекции, что эти фрагменты вообще должны быть в разных файлах
  4. Промисы и async/await я тут не использую по двум причинам:
  • это учебный код и перегружать его концепциями нельзя, при этом я согласен, что не должно быть бессмысленного учебного кода, но все же, есть своя специфика, сначала студент осваивает один прием, потом другой, а потом объединяет их (как, например, ФП + асинхронное программирование), а сразу их съесть за один раз сложно
  • промисам я предпочитаю функции асинхронной композиции, которые и работают быстрее и совместимы с контрактами callback-last / error-first, см. metasync и мои доклады по этой теме
  1. Конечно нужно рассмотреть это в разрезе DSL языка, но я еще не успел написать примеры, которые продемонстрируют этот аспект, скоро.

tshemsedinov avatar Sep 28 '17 13:09 tshemsedinov

:+1:

mr-mig avatar Sep 29 '17 05:09 mr-mig

:+1:

  1. насколько я понимаю это стандарт, пришедший еще из λ-исчисления. По сути это просто аппликация(вызов) функций одна к другой (f . g . z) x = f(g(z(x))) = compose(f, g, z)(x).

Примеры:

  • в lodash/fp https://github.com/lodash/lodash/wiki/FP-Guide (смотри compose = flowRight, pipe = flow)
  • в ramdajs http://ramdajs.com/0.19.0/docs/#compose http://ramdajs.com/0.19.0/docs/#pipe
  • в хаскель http://learnyouahaskell.com/higher-order-functions#composition
  • в python https://docs.python.org/3.1/howto/functional.html#the-functional-module
  • несколько статей с реализацией compose и pipe https://medium.com/@dtipson/creating-an-es6ish-compose-in-javascript-ac580b95104a https://medium.com/javascript-scene/master-the-javascript-interview-what-is-function-composition-20dfb109a1a0 вообще очень рекомендую по функциональному программированию в js Eric Elliott

agil avatar Sep 29 '17 11:09 agil

Еще пара рекомендаций по функциональному ЖС:

  • https://github.com/getify/Functional-Light-JS
  • https://github.com/MostlyAdequate/mostly-adequate-guide
  • https://leanpub.com/javascriptallongesix/read

mr-mig avatar Nov 04 '17 12:11 mr-mig