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:
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)