Chciałbym zacząć bawić się w ClojureScript, ale zastanawiam się nad niektórymi punktami. Moim problemem jest to, co jest dobrym sposobem radzenia sobie ze zmianami stanu wynikającymi z interakcji użytkownika, gdy próbujesz funkcjonalnie pracować.
Podam kilka przykładów. Mam na myśli aplikacje działające w przeglądarce, ale myślę, że problem jest bardziej ogólny. Oczywiście coś się zmieni - przynajmniej DOM. Chciałbym jednak dowiedzieć się, jak zorganizować resztę kodu do pracy z niezmiennymi strukturami danych.
1) Powiedzmy, że chcę dołączyć pewne zdarzenia do jakiegoś obiektu DOM. Nie jest to trudne w przeważnie funkcjonalny sposób: kiedy tworzysz węzeł, dołączasz do niego mapę skrótu z różnymi modułami obsługi zdarzeń. Ale rozważ przypadek, w którym używasz delegowania zdarzeń. Następnie, gdy tworzysz nowy węzeł, możesz dołączyć moduł obsługi zdarzeń do jakiegoś węzła nadrzędnego, który prawdopodobnie już istnieje. Musisz więc zmienić skrót powiązany z już istniejącym węzłem.
2) Powiedzmy, że projektuję moduł autouzupełniania dla pola wejściowego. Za każdym razem, gdy użytkownik naciska klawisz, mogę zadzwonić do serwera, aby uzyskać sugestie. To jest łatwe. Ale teraz załóżmy, że chcę to trochę zoptymalizować. Jeśli znam wszystkie pasujące wyniki, foo
nie ma sensu pytać ponownie o wszystkie pasujące wyniki foobar
; Mogę po prostu odfiltrować to pierwsze. Muszę więc zbudować pamięć podręczną. Ta pamięć podręczna będzie aktualizowana za każdym razem, gdy użytkownik wstawi nowe słowo, które nie jest nadzbiorem wcześniej wprowadzonych słów. Znowu: jak modelować pamięć podręczną? Najbardziej rozsądnym sposobem wydaje się być mapa haszująca odwzorowująca słowa na wyniki, ale powinna być zmienna.
Czy możesz zasugerować pewne wzorce, które ułatwiłyby uwzględnienie zmian wynikających z interakcji użytkownika w funkcjonalnym projekcie?