Gostaria de começar a brincar com o ClojureScript, mas estou intrigado com alguns pontos. Meu problema é o que é uma boa maneira de lidar com alterações de estado provenientes da interação do usuário, quando você tenta trabalhar funcionalmente.
Deixe-me dar alguns exemplos. Penso em aplicativos que são executados no navegador, mas acho que o problema é mais geral. Claro que algo estará mudando - pelo menos o DOM. Mas eu gostaria de descobrir como organizar o restante do código para trabalhar com estruturas de dados imutáveis.
1) Digamos que desejo anexar alguns eventos a algum objeto DOM. Isso não é difícil de ser feito de uma maneira principalmente funcional: ao criar o nó, você anexa um mapa de hash aos vários manipuladores de eventos. Mas considere o caso em que você está usando a delegação de eventos. Quando você cria um novo nó, pode anexar um manipulador de eventos a algum nó pai que provavelmente já existe. Portanto, você teria que alterar o hash associado ao nó já existente.
2) Digamos que estou projetando um módulo de preenchimento automático para um campo de entrada. Sempre que o usuário pressiona uma tecla, posso fazer uma ligação para um servidor para obter as sugestões. Isso é facil. Mas agora suponha que eu queira otimizar um pouco. Se conheço todos os resultados correspondentes, foo
não há motivo para solicitar novamente todos os resultados correspondentes foobar
; Eu posso apenas filtrar o primeiro. Então, eu preciso construir algum tipo de cache. Esse cache será atualizado sempre que o usuário inserir uma nova palavra que não seja um superconjunto das palavras inseridas anteriormente. Novamente: como eu modelo o cache? A maneira mais razoável parece ser um mapa de hash que mapeie as palavras para os resultados, mas deve ser mutável.
Você pode sugerir alguns padrões que facilitariam a incorporação de alterações devido à interação do usuário em um design funcional?
fonte
Respostas:
Conforme mencionado nos comentários, você deve procurar "Programação Reativa Funcional" e também ler algumas das postagens em http://prog21.dadgum.com/archives.html . Mais especificamente, você provavelmente deve ler " Não se apaixone por sua tecnologia ", " Escreva código como você aprendeu a programar ", " Programação funcional não funciona (e o que fazer sobre isso) " e talvez um alguns outros.
Evitar completamente a mutabilidade e os efeitos colaterais é praticamente impossível. Até os programadores Haskell de vez em quando se
unsafePerformIO
valem do paradigma puramente funcional, livre de efeitos colaterais e tipicamente estaticamente, para fazer certas coisas. Se você está embarcando neste projeto como um exercício puramente acadêmico, vá em frente e evite mutabilidade e efeitos colaterais o máximo possível, mas se você estiver tentando criar um produto utilizável dentro de um prazo, nenhum padrão o salvará.fonte