Introdução ao Elixir - Seu Primeiro App - Blackjack (21)

Apresentação

Antes de construirmos nosso game de Blackjack, vale a pena dar uma contextualizada no Elixir. Não vai demorar mais do que 3 minutos, eu prometo.

O que é Elixir?

Linguagem de programação funcional, imutável, dinâmica, escalável, tolerante a erros, etc. Mas o que diabos isso significa?

O resumo da opera é que o Elixir traz um avanço na programação concorrente, possibilitando explorar não só vários núcleos e threads do processador, mas também expandir sua aplicação para várias máquinas, quando preciso, de maneira fácil.

Elixir foi construído em cima de uma antiga linguagem feita pela Ericson, chamada de Erlang, feita sob medida para lidar com centrais telefônica que tratavam milhares de ligações simultaneamente. Por isso, Elixir também tem grande capacidade de lidar com múltiplas tarefas ao mesmo tempo.

Quem usa?

Os usos mais notáveis são do Whatsapp e do Pinterest. O primeiro conseguiu conectar 2 milhões de usuários numa única máquina rodando o Elixir. Já o Pinterest substituiu a parte de notificações do seu sistema feita inicialmente em Java por uma nova em Elixir. Os resultados foram muitos servidores economizados e um código fonte cerca de 20% do anterior.

Phoenix - O Framework da Conectividade

O Phoenix é um framework para desenvolvimento web de alta produtividade e que explora todo o poder do Elixir. Ele está se tornando conhecido por ser o framework da conectividade, isto porque torna fácil, nada custosa, a conexão entre os users. Se tornando perfeito para features de realtime, como chat, atualização em tempo real das páginas (por exemplo inserção de um novo comentário), etc. É o framework que orgulhosamente utilizamos para construir este site, também.

Instalando Elixir e Erlang

Para continuar você precisa ter o Elixir em sua máquina, se não tiver, corre no elixir-lang.org/install.html para baixar e instalar o Elixir no seu sistema. Não tem segredo.

Depois que você tiver instalado o Elixir, vá ao terminal e digite elixir -v. Você deve ver um output parecido com o de baixo.

$ elixir -v
Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Elixir 1.10.2 (compiled with Erlang/OTP 21)

Se não apareceu a versão, há algo errado com sua instalação.

Como vai funcionar nosso game?

Nós vamos implementar uma versão simplificada do Blackjack, ou como chamamos aqui no Brasil, o famoso jogo de baralho "21". Se você (estranhamente) nunca jogou, sugiro que dê uma lida lá na página do jogo na Wikipédia.

Para os ávidos jogadores de Blackjack, aviso que essa versão que vamos implementar não terá double down, nem split, etc. Afinal, o intuito aqui é explorar o Elixir e não implementar um verdadeiro cassino.

Funcionamento básico

Nosso jogo vai funcionar no terminal. Haverá um dealer (computador) e um player humano (você).

Exemplo de rodada

Vamos ver um exemplo de rodada.

$ iex> Blackjack.start
$ iex> Your Deck: [{10, :hearts}, {8, :diamonds}]
$ iex> You got: 18 points.
$ iex> Press "1" to hit more cards or "0" to stand.
$ iex> 0
$ iex> Ok. Your final deck is: 
$ [{10, :hearts}, {8, :diamonds}]
$ iex> Dealer's Deck: [{10, :diamonds}, {1, :spades}]
$ iex> Dealer got 21 points.
$ iex> Dealer wins.

Tá preparado para começar? Vamos lá.

Criando o Projeto

Ta na hora de botar a mão na massa. Vamos fazer nosso super e empolgante projeto: Blackjack, ou como mais conhecido aqui no Brasil, "21".

Pelo terminal, navegue até o diretório que onde você quer que fique o projeto e digite o comando abaixo:

$ mix new blackjack

Com ele, o Mix vai criar um diretório com o mesmo nome do projeto e colocar alguns arquivos base, comuns em todos projetos de Elixir, eliminando aí algum boilerplate e dando um bom esqueleto para começarmos a trabalhar.

blackjack
├── .formatter.exs
├── .gitignore
├── lib
│   └── blackjack.ex
├── mix.exs
├── README.md
└── test
    ├── blackjack_test.exs
    └── test_helper.exs

O que é Mix?

Junto com a instalação do Elixir vem o Mix, uma ferramenta indispensável que nos ajuda a gerenciar nossos projetos. Com ela podemos fazer várias coisas, por exemplo:

Se você conhece Ruby, você pode pensar no Mix como sendo uma espécie fusão do Bundler com o Rake.

Se você mexe com NodeJS, pode pensar no Mix como um similar do NPM ou Yarn.