Я хотел бы начать играть с ClojureScript, но я озадачен некоторыми моментами. Моя проблема в том, что это хороший способ справиться с изменениями состояния, возникающими в результате взаимодействия с пользователем, когда вы пытаетесь работать функционально.
Позвольте мне привести пару примеров. Я имею в виду приложения, которые запускаются в браузере, но я думаю, что проблема более общая. Конечно, что-то изменится - по крайней мере, DOM. Но я хотел бы узнать, как организовать оставшуюся часть кода для работы с неизменяемыми структурами данных.
1) Скажем, я хочу прикрепить некоторые события к некоторому объекту DOM. Это не сложно сделать в основном функциональным способом: когда вы создаете узел, вы присоединяете к нему хэш-карту с различными обработчиками событий. Но рассмотрим случай, когда вы используете делегирование событий. Затем, когда вы создаете новый узел, вы можете присоединить обработчик событий к некоторому родительскому узлу, который, вероятно, уже существует. Таким образом, вам придется изменить хэш, связанный с уже существующим узлом.
2) Скажите, что я проектирую модуль автозаполнения для поля ввода. Каждый раз, когда пользователь нажимает клавишу, я могу позвонить на сервер, чтобы получить предложения. Это легко. Но теперь предположим, что я хочу немного его оптимизировать. Если я знаю, что все результаты совпадают, foo
нет смысла снова запрашивать совпадения всех результатов foobar
; Я могу просто отфильтровать первое. Поэтому мне нужно построить какой-то кеш. Этот кэш будет обновляться каждый раз, когда пользователь вводит новое слово, которое не является надмножеством ранее введенных слов. Опять же: как мне смоделировать кеш? Наиболее разумный способ, по-видимому, заключается в отображении хеш-таблицы в слова, но она должна быть изменчивой.
Можете ли вы предложить некоторые шаблоны, которые облегчили бы включение изменений из-за взаимодействия с пользователем в функциональный дизайн?