Шаблони інтерфейсу користувача у функціональних мовах


11

Мені хотілося б почати хитрувати з ClojureScript, але я спантеличений деякими моментами. Моя проблема полягає в тому, що є хорошим способом боротьби зі змінами стану, що виникають в результаті взаємодії з користувачем, коли ви намагаєтесь працювати функціонально.

Дозвольте навести пару прикладів. Я маю на увазі програми, які працюють у браузері, але я вважаю, що питання є більш загальним. Звичайно, щось зміниться - як мінімум, DOM. Але я хотів би дізнатися, як організувати решту коду для роботи з незмінними структурами даних.

1) Скажіть, що я хочу приєднати деякі події до якогось об'єкта DOM. Це не важко зробити в основному функціональним способом: коли ви створюєте вузол, додаєте до нього хеш-карту з різними обробниками подій. Але розглянемо випадок, коли ви використовуєте делегування подій. Потім, коли ви створюєте новий вузол, ви можете приєднати обробник подій до якогось батьківського вузла, який, ймовірно, вже існує. Тож вам доведеться змінити хеш, пов'язаний з уже існуючим вузлом.

2) Скажіть, я проектую модуль автозаповнення для поля введення. Щоразу, коли користувач натискає клавішу, я можу зателефонувати на сервер, щоб отримати пропозиції. Це легко. Але тепер припустимо, я хочу трохи її оптимізувати. Якщо я знаю, що всі результати відповідають foo, немає сенсу знову запитувати про відповідність усіх результатів foobar; Я можу просто відфільтрувати колишнє. Тому мені потрібно побудувати якийсь кеш. Цей кеш оновлюватиметься кожного разу, коли користувач вставить нове слово, яке не є набором раніше введених слів. Знову: як я моделюю кеш? Найбільш розумним способом, здається, є хеш-карта зіставлення слів за результатами, але він повинен бути змінним.

Чи можете ви запропонувати деякі зразки, які полегшили б включити зміни у взаємодію користувачів з функціональним дизайном?


4
Пошук "Функціональне реактивне програмування".
dan_waterworth

Це не зовсім те саме, але із шаблонами XSLT (без побічних ефектів), які відповідають DOM подіям, ініційованим користувачем, ми стикаємося з подібною проблемою в Saxon-CE. Мені подобається бачити, що користувач викликає зміну стану, а не XSLT, так що це нормально. Ключ полягає в тому, щоб код, який управляє взаємодією з користувачем, і наступні зміни стану були дуже відокремленими від решти.
pgfearo

@pgfearo Чи є у вас поради щодо того, як організувати код, щоб взаємодія користувачів залишалася досить відокремленою від решти?
Андреа

Не існує хорошого способу впоратися зі змінами стану, коли ви працюєте функціонально, оскільки функціональне програмування без стану.
Старий Про

3
@ Старий Pro: Це не зовсім правильно. Хоча у функціональному програмуванні ви визначаєте обчислення, використовуючи функціональну програму замість побічного ефекту, зрештою вам доведеться десь зберегти результат обчислення. Основна увага FP полягає у обмеженні використання стану до мінімуму, тоді як в імперативному програмуванні стан поступово (за побічними ефектами) є основним інструментом для визначення обчислень.
Джорджіо

Відповіді:


3

Як зазначено в коментарях, ви повинні знайти "Функціональне реактивне програмування", а також прочитати деякі публікації на веб-сторінці http://prog21.dadgum.com/archives.html . Більш конкретно, вам, мабуть, слід прочитати " Не закохуйся у свою технологію ", " Написати код так, як ти щойно навчився програмувати ", " Функціональне програмування не працює (і що з цим робити) ", а може бути і кілька інших.

Повністю уникнути мутаційності та побічних ефектів практично неможливо. Навіть програмісти Haskell час від часу використовуватимуть unsafePerformIOдля виходу з чисто функціональної, без побічних ефектів, статично типізованої парадигми для виконання певних дій. Якщо ви починаєте цей проект як суто академічне вправу, то йдіть прямо вперед і уникайте максимально можливих змін і побічних ефектів, але якщо ви намагаєтеся створити корисний продукт в термін, то жодна схема не врятує вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.