Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Guia para os devs Elixir/Phoenix - Beta Version

23_05_17_guia_para_os_devs_elixirphoenix_beta_version_aigg.livemd

Guia para os devs Elixir/Phoenix - Beta Version

Mix.install([
  {:ecto, "~> 3.8"},
  {:ecto_sql, "~> 3.8"}
])

Convenções da Idopter Labs

Conteúdo

  • Guia de Code Style
  • Estrutura básica dos projetos na Arquitetura Phoenix
  • Nomenclaturas
  • Funções no Repo
  • Uso do “alias”

Guia de Code Style

A principal referência em estilo de código em Elixir, mantido pela comunidade e recomendado para os desenvolvedores na Idopter Labs está compartilhado no repositório abaixo:

Elixir Style Guide

Estrutura básica dos projetos Phoenix

Arquitetura a ser seguida no Phoenix:

Exemplo:

Nomemclaturas - Funções no Repo

Iniciar com query quando o retorno é do tipo Ecto.Query

Exemplo:

defmodule Example.Repo.User do
  import Ecto.Query

  def query_user(user_id) do
    from(
      user in User,
      where: user.id == ^user_id
    )
  end
end

iniciar com get_ quando retorna o struct Repo.one()

Exemplo:

defmodule Example.Repo.User do
  import Ecto.Query

  alias Example.Repo

  def get(user_id) do
    Repo.one(
      from(
        user in User,
        where: user.id == ^user_id
      )
    )
  end
end

iniciar com list_ quando retornar um list Repo.all()

Exemplo:

defmodule Example.Repo.User do
  alias Example.Data

  def list() do
    Repo.all(Data.User)
  end
end

quando tiver uma Ecto.Query repetida, com uma mesma definição de from(...), recomenda-se extrair a repetição para uma outra function iniciando com from_

Exemplo:

defmodule Example.Repo.User do
  import Ecto.Query

  def query_all_users_by_client(client_id) do
    from(
      [users, clients] in from_users_with_clients(),
      where: clients.id == ^client_id
    )
  end

  def query_active_users_by_client(client_id) do
    from(
      [users, clients] in from_users_with_clients(),
      where: users.active == true,
      where: clients.id == ^client_id
    )
  end

  def from_users_with_clients() do
    from(
      users in User,
      join: clients in Client,
      on: clients.id == users.client_id
    )
  end
end

Uso do “alias”

Evitar o uso do “as: “, para isso declare o alias até a camada, ou referência de domínio, mas evitando estender a referência para mais de duas chamadas.

Exemplos
Evitar:

alias Example.Repo.Users, as: UsersRepo
alias Example.Repo.Posts, as: PostsRepo

Motivo:

Causa estranheza e uma certa redundancia e isso pode escalar muito, principalmente nos módulos de contexts onde fica a regra de negócio
Prefira:

alias Example.Repo

Dessa forma fica mais explícito a camada/domínidio do código como por exemplo

  • Repo.Users.get(user_id)
  • Repo.Posts.get(post_id)