Padrões de interface do usuário em linguagens funcionais

11

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, foonã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?

Andrea
fonte
4
Pesquisa "Programação Reativa Funcional".
22412 dan_waterworth
Isso não é exatamente a mesma coisa, mas com modelos XSLT (livres de efeitos colaterais) que correspondem a eventos DOM iniciados por um usuário, enfrentamos um problema semelhante no Saxon-CE. A maneira que eu gosto de ver é que o usuário está provocando a mudança de estado, não o XSLT, então está tudo bem. A chave é garantir que o código que gerencia a interação do usuário e as alterações subseqüentes no estado sejam muito separadas do restante.
Pgfearo 22/03/12
@pgfearo Você tem algum conselho sobre como organizar o código para que a interação do usuário seja mantida separada o suficiente do resto?
23312 Andrea Andrea
Não há uma boa maneira de lidar com alterações de estado quando você estiver trabalhando funcionalmente, pois a programação funcional é sem estado.
Old Pro
3
@ Old Pro: Isso não está totalmente correto. Enquanto na programação funcional você define uma computação usando o aplicativo de funções em vez do efeito colateral, eventualmente você precisa salvar o resultado da computação em algum lugar. O foco do FP está em restringir o uso do estado ao mínimo, enquanto na programação imperativa a transformação gradual do estado (por efeitos colaterais) é a ferramenta básica para definir uma computação.
Giorgio

Respostas:

3

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 unsafePerformIOvalem 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á.

davidk01
fonte