Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FP good style for JavaScript #1

Open
tshemsedinov opened this issue Sep 28, 2017 · 3 comments
Open

FP good style for JavaScript #1

tshemsedinov opened this issue Sep 28, 2017 · 3 comments

Comments

@tshemsedinov
Copy link
Member

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

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

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

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

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

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

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

mr-mig commented Sep 29, 2017

👍

@agil
Copy link
Member

agil commented Sep 29, 2017

👍

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

Примеры:

@mr-mig
Copy link

mr-mig commented Nov 4, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants