DEV Community

Cover image for Embarcando no Elixir, Mix e Ecto.
Starch1
Starch1

Posted on

Embarcando no Elixir, Mix e Ecto.

Escrevo este artigo supondo que você, leitor tem noções básicas de programação. Pretendo manter a leitura simples , mas se sua primeira linguagem de programação for Elixir, talvez fique confuso.

Elixir

Elixir é uma linguagem de programação funcional que roda em cima da máquina virtual do ERlang a BEAM.
Elixir é mundialmente usado principalmente em outros países e grandes produtos como Brex, Discord, Pinterest e vários outros, mas é um orgulho nacional.

O diferencial do Elixir é que seu código é executado em processos isolados, esse isolamento permite que o retorno de cada processo possa ser coletado de forma independente, utilizando da melhor forma os recursos da maquina.

Tipos de dados em Elixir

Em Elixir existem tipos de dados que são utilizados para representar diferentes tipos de informações, como:

int Inteiros que podem ser positivos ou negativos
float Pontos flutuantes que representam números decimais.
string Que representam uma sequencia de caracteres escritos entre aspas duplas
boolean Representa valores verdadeiros ou falsos / true false
atom Que são constantes onde o próprio valor é equivalente ao próprio nome, por exemplo :true, :heyThere, :barco

Sintaxe e Módulos

Vamos começar um Hello World pra dar boa sorte.

defmodule helloModule do
    def hello do
    IO.puts("Hello World") #Output => Hello World
    end
end
Enter fullscreen mode Exit fullscreen mode

Aqui já é possível notar algumas 'peculiaridades do Elixir' que são os módulos.
Módulos no Elixir são unidades de organização de código e são usados pra agrupar funcionalidades relacionadas. Módulos também podem conter valores, constantes e até outros módulos.
Você também pode criar uma função sem encapsular com um módulo, mas em Elixir é uma prática recomendada encapsular funções em módulos para organizar e estruturar seu código de forma mais clara e modular.
Módulos em Elixir também são átomos

iex> is_atom(helloModule) #Output => true
Enter fullscreen mode Exit fullscreen mode

Como citei, em Elixir é possível criar módulos dentro de módulos, mas por convenção, é recomendado criar apenas um módulo por arquivo. (A não ser que situação peça o contrário)

Além disso também temos duas extensões principais dentro do Elixir, sendo .ex e .exs.
os arquivos .ex são usados para código compilado que faz parte do aplicativo ou biblioteca, enquanto os arquivos .exs são usados para scripts Elixir executados diretamente pelo interpretador, principalmente para tarefas de automação, experimentação e prototipagem.

Supervisão e Supervisores

Os conceitos de supervisão e supervisores vem do sistema ERlang. Em Elixir os supervisores são responsáveis pelo monitoramento do ciclo de vida de um processo filho e reinicialização dos mesmos quando necessário.
O supervisor garante que, se o processo falhar, ele seja reiniciado de acordo com a estratégia definida. Isso ajuda a criar sistemas tolerantes a falhas.

Existe alguns tipos de supervisores:

  • Supervisor Simples: Tipo mais básico, supervisiona processos e os reinicia se falharem.
  • Supervisor Dinâmico: Com este é possível adicionar e remover processos filhos dinamicamente durante a execução do sistema.
  • Supervisor de Tarefa: Este supervisor supervisiona tarefas assíncronas, como operações de E/S .(Entrada e Saída)
  • Supervisor de Grupo: Permite agrupar processos filhos para gerenciar em conjunto.

Exemplo de um supervisor:

defmodule GenericSupervisor do
    use Supervisor
    def start_link do
        Supervisor.start_link(__MODULE, [])
    end
    def init([]) do
    children = [
        worker(GenericWorker), []]
        Supervisor.init(children, strategy: :one_for_one)
    end
end
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo o GenericSupervisor supervisiona um único processo que, se falhar, será reiniciado, de acordo com a estratégia :one_for_one

Mix

Mix é uma para ajudar no desenvolvimento de aplicações Elixir. Ela é responsável por criar, compilar e gerenciar projetos, bem como tarefas de automação e teste.

Com Mix, você pode facilmente iniciar um novo projeto Elixir usando o comando mix new projeto. Isso criará uma estrutura de diretórios padrão para o seu projeto, com arquivos de configuração, testes e o esqueleto básico do código.

├── README.md
├── lib
│   └── projeto.ex
├── mix.exs
└── test
    ├── projeto_test.exs
    └── test_helper.exs
Enter fullscreen mode Exit fullscreen mode
Estrutura de um projeto Mix

lib É neste diretório onde fica o código fonte do seu projeto e os arquivos .ex aqui dentro serão compilados.

mix.exs Este é o arquivo de configuração principal do seu projeto. É aqui onde você define metadados do projeto, dependências, tarefas personalizadas e outras configurações.

test Neste diretório ficam os arquivos de testes do seu projeto. Os arquivos de teste são escritos usando o ExUnit e têm a extensão .exs

Além disso, Mix é usado para compilar e executar seu código. Por exemplo, você pode usar mix compile para compilar seu projeto e mix run para executá-lo.

Mix também suporta a criação de tarefas personalizadas, que podem ser usadas para automatizar tarefas comuns de desenvolvimento, como a execução de testes ou a geração de documentação.

Ecto

Ecto é uma biblioteca de persistência de dados para o Elixir, projetada para trabalhar com bancos de dados relacionais. Ela fornece uma maneira limpa e elegante de interagir com o banco de dados, usando uma abordagem baseada em modelos e consultas.

(Persistência de dados é o conceito de armazenar informações de forma duradoura, de modo que elas possam ser recuperadas e utilizadas posteriormente, mesmo após o encerramento da aplicação que as gerou )

Com Ecto, você pode definir modelos para representar suas tabelas de banco de dados e usar esses modelos para criar, atualizar, excluir e consultar registros no banco de dados.

Além disso, Ecto fornece um mecanismo de migração que permite gerenciar o esquema do banco de dados ao longo do tempo. Com migrações, você pode criar e modificar tabelas, índices e restrições de chave estrangeira de forma controlada e reversível.

Ecto também suporta consultas usando a linguagem de consulta Ecto.Query. Com Ecto.Query, você pode construir consultas SQL de forma programática, tornando mais fácil e seguro gerar consultas dinâmicas com base em variáveis de entrada.

Ecto também oferece suporte a transações, permitindo que você execute várias operações de banco de dados como uma única unidade atômica. Isso garante que todas as operações sejam bem-sucedidas ou que nenhuma delas seja aplicada, mantendo a consistência dos dados.

Se você se interessou por Elixir, considere checar a incrível documentação.
https://elixir-lang.org/docs.html
E o tutorial em PT-BR, claro
https://elixirschool.com/pt

Top comments (0)