Use o código e tenha 10% de desconto!

Programação Funcional Uma introdução em Clojure

Gregório Melo

Prefácio

Poucos anos atrás, eu me vi entrando no mundo do Clojure para resolver o problema de processar muitos dados diferentes ao mesmo tempo e fazer o merge deles em uma estrutura de dados só. Naquela época, era difícil encontrar coisas de Clojure em português e/ou com tanta qualidade quanto o livro do Gregório. Minha trajetória foi divertida, mas a partir de hoje vou certamente passar a indicar este livro como o primeiro contato com Clojure.

Quando o Gregório pediu para eu ler o livro e dar um feedback, tive de apagar minhas opiniões centenas de vezes, pois parecia que ele já tinha previsto o que eu ia falar. Foi uma dinâmica incrível ler pensando que seria legal adicionar algo, e encontrá-lo lá, no próximo capítulo. Creio que o livro tem todo o conteúdo que eu gostaria de ver em um livro de Clojure.

Agora, se você já sabe um pouco de Clojure, vá para a segunda e terceira partes e tente aplicar as ideias do livro em seu projeto ou dia a dia. Espero que você goste deste livro tanto quanto eu!

- Julia Naomi Boeira

Este livro é para você

O intuito deste livro é ser um material introdutório à Programação Funcional. Mesmo sendo introdutório, ele não tem a intenção de ser o seu primeiro livro de programação. Portanto, saber programar um pouquinho será muito útil. Se você já escreveu algumas linhas de código na sua vida, este livro pode ser para você.

Aqui você aprenderá novos conceitos que vão ajudá-lo a escrever melhores programas de computador. Estes conceitos serão aprendidos ao longo do livro e, assim que apresentados, já podem ser aplicados no seu trabalho ou estudo. Tenho a expectativa de que, enquanto lê este livro, você procure aplicar tudo o que aprender, e demonstre para sua equipe as vantagens do que viu aqui. E, ainda, quando concluir a leitura, que você veja o tanto que terá se desenvolvido na escrita de software.

Veremos um bocado de código em Clojure. Se você tem a mente aberta para uma nova linguagem de programação e acredita que uma sintaxe e paradigma novos o levarão a novos horizontes, este livro é para você.

Por ser introdutório, não abordaremos conceitos como monads e applicatives, que têm assustado muita gente ao entrar neste mundo (inclusive eu mesmo), nem equações matemáticas.

Como este livro está organizado

Nossa jornada será muito interessante. Introduziremos princípios da Programação Funcional, e aos poucos veremos algumas comparações com linguagens historicamente consideradas orientadas a objeto (como Java e Ruby).

Na primeira parte do livro, veremos um pouco de Clojure, o suficiente para que nos familiarizemos com a linguagem. Isto deve facilitar a compreensão dos exemplos e conceitos de Programação Funcional, apresentados na parte seguinte, que é onde vamos conhecer e nos aprofundar em seus princípios. Algumas ideias muito bacanas aparecerão, trazendo um vocabulário novo para nós, como "preguiça".

Na parte 3, veremos como construir aplicações em Clojure. Utilizando o domínio e as funções da parte 2, produziremos um serviço para processar requisições HTTP, fazendo uso de uma abordagem de desenvolvimento guiada por testes. E tudo isso acompanhado de muitos exemplos de código.

Sobre o autor

Natural de João Pessoa, Paraíba, Gregório Melo é desenvolvedor de software na ThoughtWorks Brasil. Estudou Desenvolvimento de Sistemas para Internet no IFPB e iniciou a carreira na área de desenvolvimento de software estagiando em uma grande empresa nacional de varejo, gerando Strings imensas a partir de um formulário gigante para criação de cartões de crédito.

Em 2011, mudou-se para Porto Alegre, onde teve seus primeiros contatos com Programação Funcional. Após um período de contatos esporádicos com linguagens funcionais, foi durante um engajamento profissional em Xi'an, na China, que Programação Funcional virou presença constante no seu dia a dia. O foco, na época, era Scala. Hoje, dedica-se a Clojure, sem querer discutir qual das duas é melhor. Foi gerente do escritório da ThoughtWorks em São Paulo entre junho de 2016 e dezembro de 2017, e hoje é, de novo, consultor de desenvolvimento na mesma.

Adora jogar futebol, mesmo com um talento um tanto quanto questionável, e talvez passe mais tempo do que deveria jogando videogames.

Sobre o livro

Por que ler este livro?

Se você se interessa em aprender a escrever programas melhores, Programação Funcional tem muito a lhe ajudar. Com ela, você pode produzir códigos mais robustos, menos suscetíveis a erros e expandir sua forma de pensar. Por exemplo, a imutabilidade, um conceito que veremos ao longo do livro, minimiza a possibilidade de encontrarmos defeitos oriundos da manipulação de estado em lugares desconhecidos. Você verá os principais conceitos que trazem à tona as vantagens da programação funcional.

Uma grande razão para aprender Programação Funcional é fazer uso dos benefícios do paralelismo, e veremos como fazer isso mais à frente. Escrever código paralelizável em uma linguagem de paradigma funcional é muito fácil. A ausência de efeitos colaterais (ou o estímulo para que eles sejam contidos e limitados) nas funções de um programa permite que estas funções sejam executadas sem uma ordem definida e em paralelo. Isso nos faz tirar proveito da nova aplicação da Lei de Moore, que agora não mais se refere à quantidade de transistores, mas sim de núcleos na máquina (http://www.gotw.ca/publications/concurrency-ddj.htm). Assim, nossa vida fica mais simples com a linguagem de programação nos ajudando. Você vai perceber como é fácil escrever código para rodar em múltiplas threads!

Ainda, para algumas pessoas, as origens na matemática fazem da Programação Funcional um paradigma mais simples de ser compreendido do que a Orientação a Objetos. Para estas pessoas, será muito natural a ideia de que, sempre que você chamar uma função com um mesmo parâmetro, o resultado será o mesmo, sem que nada mais no universo do programa seja alterado. Claro que isso não é exclusivo da Programação Funcional, já que podemos alcançar o mesmo resultado em outros paradigmas, mas a Programação Funcional vai ajudá-lo a pensar sempre em construir funções sem efeitos colaterais.

Por fim, talvez você queira entender um pouco mais sobre como escrever melhor código na plataforma que você utiliza atualmente. As ideias que foram citadas nos parágrafos anteriores podem ajudar seus programas a serem mais robustos. Você pode fazer com que seu código em JavaScript fique mais idiomático, e, de brinde, você vai entender melhor o processo de escrita de código para frameworks JavaScript como o D3, Ramda, Lodash, ou tantos outros. Seu código em Java 8, por exemplo, pode ficar muito mais sucinto e com melhor desempenho, tendo mais facilidade no uso do paralelismo provido pela máquina virtual.

Por que Clojure?

Existem muitas linguagens de programação que trazem consigo os princípios de Programação Funcional. Muitas delas têm conseguido uma boa adoção no mercado, como Scala, Clojure e Elixir. E linguagens cujas origens estão atreladas à Orientação a Objetos, como Java, C#, Ruby e Python, já há algum tempo possuem recursos encontrados em Linguagens Funcionais.

Então, por que Clojure? Além de ser a minha linguagem favorita do momento, ela possui recursos interessantes para nos ajudar a manter o foco nos aspectos inerentes à linguagem e à Programação Funcional: a sintaxe, que é simples e muito diferente das linguagens mais populares, e um sistema dinâmico de tipos, o que vai nos permitir evitar pensar em Orientação a Objetos por um tempo.

Clojure é um dialeto de Lisp (https://pt.wikipedia.org/wiki/Lisp). Lisp é uma linguagem que trouxe a ideia de que é possível utilizar apenas funções matemáticas para representar estruturas de dados básicas, aliado ao conceito de código como dado (do inglês Homoiconicity). Lisp tem muita história na computação, principalmente no mundo das linguagens funcionais e no campo da inteligência artificial. Sendo Clojure um dialeto de Lisp, ela traz uma sintaxe bem diferente das linguagens derivadas de Algol (como C e afins). Você vai perceber que, além de diferente do tradicional, a sintaxe é extremamente simples, com poucos símbolos ou palavras-chaves reservadas.

Clojure, principalmente, roda na máquina virtual Java, o que permite que programas escritos nesta linguagem usem bibliotecas escritas em Java. A ferramenta de automação de tarefas e gerenciamento de dependências, Leiningen, é bastante flexível e completa, e provê suporte ao repositório de bibliotecas do Maven. Ela também roda em outras plataformas, sendo JavaScript a mais notória (através do ClojureScript, que compila seu código Clojure para JavaScript), e no motor do Unity (para desenvolvimento de jogos) com o Arcadia (http://arcadia-unity.github.io/).

Existe uma comunidade muito legal por trás da linguagem, além de casos de sucesso de adoção de Clojure, que lhe dão um respaldo muito forte.

Fui convincente o bastante?

Sumário

    Parte 1: O suficiente de Clojure para começarmos a brincadeira
  • 1 Primeiros contatos com Clojure
    • 1.1 As primeiras linhas de código
    • 1.2 Nossas próprias funções
    • 1.3 O que é a verdade? Sobre os condicionais
    • 1.4 Conclusão
  • 2 Resolvendo o FizzBuzz
    • 2.1 Conclusão
  • 3 Estruturas de dados em Clojure
    • 3.1 Listas
    • 3.2 Vetores
    • 3.3 Sets
    • 3.4 Conclusão
  • 4 Controle financeiro e novas estruturas de dados
    • 4.1 Keywords
    • 4.2 Mapas
    • 4.3 Conclusão

    Parte 2: Embarque no mundo da Programação Funcional
  • 5 Programação Funcional, o começo
    • 5.1 Funções: primeira classe e grandeza superior
    • 5.2 Funções de grandeza superior e nossas finanças
    • 5.3 Conclusão
  • 6 Composição de funções e aplicação parcial de funções
    • 6.1 Composição de funções
    • 6.2 Aplicação parcial
    • 6.3 Conclusão
  • 7 Pureza e imutabilidade
    • 7.1 Pureza
    • 7.2 Imutabilidade
    • 7.3 Imutabilidade no nosso domínio
    • 7.4 Recursão
    • 7.5 Conclusão
  • 8 Preguiça
    • 8.1 Sequências preguiçosas e listas infinitas de transações
    • 8.2 A macro lazy-seq
    • 8.3 Conclusão

    Parte 3: Programação Funcional na prática
  • 9 Criando uma aplicação com Leiningen
    • 9.1 O conversor de moedas
    • 9.2 Interoperabilidade com Java
    • 9.3 Dependências
    • 9.4 Consultando o serviço
    • 9.5 Interpretando JSON
    • 9.6 Conclusão
  • 10 Controle financeiro pessoal via HTTP
    • 10.1 O esqueleto com o Leiningen
    • 10.2 Testes
    • 10.3 Conclusão
  • 11 Evolução da API: saldo inicial
    • 11.1 Começando com testes de aceitação
    • 11.2 JSON como formato de representação de dados
    • 11.3 O toque final
    • 11.4 Conclusão
  • 12 Uma API mais rica com transações
    • 12.1 Criando transações
    • 12.2 Conclusão
  • 13 Extrato das transações e seus filtros
    • 13.1 Receitas ou despesas?
    • 13.2 Conclusão
  • 14 Considerações finais
    • 14.1 Ferramentas para o dia a dia da programação
    • 14.2 Oportunidades de refatoração
    • 14.3 Funcionalidade a implementar
    • 14.4 Outras formas de testes
    • 14.5 Ports & Adapters (hexagonal) e funcional
    • 14.6 Despedida

Dados do produto

Número de páginas:
214
ISBN:
978-85-7254-001-8
Data publicação:
03/2019

Compartilhe!

Compartilhe no Facebook Compartilhe no Twitter