sexta-feira, 2 de outubro de 2009

Aprendendo Clojure, Part-I Paradigma Funcional!



Programação funcional é um desses termos infelizes na programação de abuso e envolta em confusão, mas que realmente não deve ser assim tão misterioso. Melhor entendida como uma alternativa ao paradigma de programação imperativa, programação funcional é caracterizada por:


  • Funções sem efeitos colaterais

O termo "funcional" vem da matemática, onde uma função só retorna um valor , baseado em zero ou mais valores de entrada e não produz efeitos colaterais, nem muda o seu comportamento com base em quaisquer outros valores que não os passados para ela. Uma função "pura" retorna a mesma coisa toda vez que é chamada com o mesmo conjunto de valores.

Esta não é a forma de trabalho funciona em imperativo (sem programação) funcional. No código imperativo, muitas vezes funções:

1. produzem efeitos colaterais (como escrever para um arquivo ou algum dispositivo de I / O)
2. transformam suas entradas e variáveis globais
3. modificação seu comportamento baseado em estado fora da função

Funções puras têm duas grandes vantagens:

1. Funções que evitam mutação de dados locais e evitam a leitura ou a mutação de dados globais são mais fáceis de entender e mais favorável às provas de regularidade ou simplesmente, testes!.
2. Funções que evitam a leitura e a escrita de estado compartilhado podem ser executados simultaneamente sem as preocupações habituais de simultaneidade(concorrencia).

Agora, a objeção óbvia a escrever todas as nossas funções para executar sem efeitos colaterais é que precisamos de efeitos colaterais para os nossos programas para finalmente fazer alguma coisa útil. Como diz o ditado, um programa sem efeitos colaterais não faz nada mais do que deixar o seu CPU quente. O ideal na programação funcional, então, é simplesmente isolar as mudanças de estado, e não eliminá-los totalmente. Em uma linguagens puramente funcionais, como Haskell, pureza funcional é forçado pelo compilador de tal forma que todos os possíveis efeitos colaterais devem ser expressamente circunscritos no código. Uma língua impuramente funcional, como Clojure, não faz essa exigencia: Clojure ajuda a estruturar o seu código de forma funcional, mas delega a você para a responsabilidade de manter os efeitos colaterais de seu código puramente funcional.

  • Os dados imutáveis

Se as funções evitamr a mutação do estado, e se estiverem a fim de evitar confiar em estado de mutação, faz sentido então de simplesmente fazer o máximo de dados possível imutável: se os dados não podem mudar, não há perigo de que talvez tenha mudado. Em Clojure, os tipos de coleção padrão são imutáveis e, de fato, mesmo as variáveis locais são imutáveis: uma vez definido, o valor vinculado a um local não muda.

Você provavelmente está pensando que isso não soa pratico nem utilizavel, mas é surpreendente a quantidade de trabalho pode ser feito sem dados mutáveis. É verdade que os programas do mundo real não pode ter dados totalmente imutáveis, mas muito mais dados podem ser imutáveis do que é comumente aceito pelos programadores acostumados apenas a programação imperativa.

  • Funções de primeira classe

Na programação funcional, as funções são de "primeira classe", ou seja, as funções são, elas próprias valores que podem ser passados como argumentos ou armazenados em variáveis. Muitas linguagens dinâmicas - Javascript, Ruby, Python, etc - têm funções de primeira classe, mas essas linguagens não são geralmente consideradas funcionais.

  • A função de fluxo de controle baseado

Em uma linguagem imperativa, o fluxo de controle é feito através de construções especiais, por exemplo, if-else, ou for/while. Em linguagens funcionais, mecanismos de controle de fluxo são ou funções ou, pelo menos,têm função semelhante na medida em que retornam valores. Por exemplo, se em Clojure você executar um dos dois ramos e retornar o valor para a função que chamou esta função. Essas construções permitem expressões que de outra forma exigirião mutação de variáveis.

Marcadores:

0 Comentários:

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial