Я хотел бы начать играть с ClojureScript, но я озадачен некоторыми моментами. Моя проблема в том, что это хороший способ справиться с изменениями состояния, возникающими в результате взаимодействия с пользователем, когда вы пытаетесь работать функционально.
Позвольте мне привести пару примеров. Я имею в виду приложения, которые запускаются в браузере, но я думаю, что проблема более общая. Конечно, что-то изменится - по крайней мере, DOM. Но я хотел бы узнать, как организовать оставшуюся часть кода для работы с неизменяемыми структурами данных.
1) Скажем, я хочу прикрепить некоторые события к некоторому объекту DOM. Это не сложно сделать в основном функциональным способом: когда вы создаете узел, вы присоединяете к нему хэш-карту с различными обработчиками событий. Но рассмотрим случай, когда вы используете делегирование событий. Затем, когда вы создаете новый узел, вы можете присоединить обработчик событий к некоторому родительскому узлу, который, вероятно, уже существует. Таким образом, вам придется изменить хэш, связанный с уже существующим узлом.
2) Скажите, что я проектирую модуль автозаполнения для поля ввода. Каждый раз, когда пользователь нажимает клавишу, я могу позвонить на сервер, чтобы получить предложения. Это легко. Но теперь предположим, что я хочу немного его оптимизировать. Если я знаю, что все результаты совпадают, foo
нет смысла снова запрашивать совпадения всех результатов foobar
; Я могу просто отфильтровать первое. Поэтому мне нужно построить какой-то кеш. Этот кэш будет обновляться каждый раз, когда пользователь вводит новое слово, которое не является надмножеством ранее введенных слов. Опять же: как мне смоделировать кеш? Наиболее разумный способ, по-видимому, заключается в отображении хеш-таблицы в слова, но она должна быть изменчивой.
Можете ли вы предложить некоторые шаблоны, которые облегчили бы включение изменений из-за взаимодействия с пользователем в функциональный дизайн?
источник
Ответы:
Как упоминалось в комментариях, вам следует поискать «Функциональное реактивное программирование», а также прочитать некоторые посты по адресу http://prog21.dadgum.com/archives.html . В частности, вам следует прочитать « Не влюбляйтесь в свою технологию », « Пишите код, как вы только что узнали, как программировать », « Функциональное программирование не работает (и что с этим делать) », и, возможно, несколько других.
Полностью избежать изменчивости и побочных эффектов практически невозможно. Даже программисты на Haskell время от времени используют
unsafePerformIO
для выхода из чисто функциональной парадигмы статический тип без побочных эффектов. Если вы начинаете этот проект как чисто академическое упражнение, тогда идите вперёд и по возможности избегайте изменчивости и побочных эффектов, но если вы пытаетесь создать пригодный для использования продукт в сжатые сроки, то никакой шаблон вас не спасет.источник