(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end
(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end
(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end frete
(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end desconto no valor total
(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end contextos diferentes
(Enum.member?([3, 4], assinatura.id)) do 0 else 10.0 * Localizacao.calcular(cep) end end def aplicar_desconto(total, assinatura) do if (Enum.member?([3, 4], assinatura.id)) do total * 0.9 else total end end end que compartilham a mesma condicional
#{usuario.sobrenome}") pedido.items |> Enum.filter(&(&1.status == 3)) |> Enum.map(fn item -> IO.puts("Item: #{item.nome}") IO.puts("Preço: #{item.preco}") IO.puts("Quantidade: #{item.quantidade}") total = item.preco * item.quantidade IO.puts("Total: #{total}") end) end end dados da empresa
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end nesse exemplo, todos os dados vêm de ItemPedido ItemPedido poderia encapsular essa regra
if (cartao.status == 3) do gateway = Cartao.buscar_gateway_pagamento(cartao) Gateway.cobrar(gateway, cartao, total) end end end provavelmente essa regra deveria estar encapsulada
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end mais de uma razão para mudar
function. If `key` is present in `map` then the existing value is passed to `fun` and its result is used as the updated value of `key`. If `key` is not present in `map`, `default` is inserted as the value of `key`. The default value will not be passed through the update function. ## Examples iex> Map.update(%{a: 1}, :a, 13, fn existing_value -> existing_value * 2 end) %{a: 2} iex> Map.update(%{a: 1}, :b, 11, fn existing_value -> existing_value * 2 end) %{a: 1, b: 11} """ @spec update(map, key, default :: value, (existing_value :: value -> updated_value :: value)) :: map def update(map, key, default, fun) when is_function(fun, 1) do # ...
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
ItemPedido.buscar_item(id) total = (item.preco + item.impostos) * item.quantidade desconto = ItemPedido.buscar_desconto(item) unless is_nil(desconto) do total - total * desconto else total end end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end defmodule Login do # ... def logar_via_google(dados_google) do # ... end def logar_via_apple(dados_apple) do # ... end end novo módulo
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end
end def logar_via_apple(dados_apple) do # ... end def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end defmodule Assinatura do def cobrar_assinatura(assinatura) do # ... end def calcular_desconto_assinatura(assinatura) do # ... end end novo módulo
do :pdf -> PDF.criar(conteudo) :texto -> Texto.gerar(conteudo, margin: false) _ -> nil end |> Email.enviar(usuario.email, conteudo) end end podemos definir uma interface
para uma função (Move statements into Function) Mover instruções para os pontos de chamada (Move Statements to Callers) Substituir código internalizado por chamada de função (Replace Inline Code with Function Call) Deslocar instruções (Slide Statements) Dividir laço (Split Loop) Substituir laço por pipeline (Replace Loop with Pipeline) Separar variável (Split Variable) Substituir variável derivada por consulta (Replace Derived Variable with Query) Mudar referência para valor (Change Reference to Value) Mudar valor para referência (Change Value to Reference) Decompor condicional (Decompose Conditional) Consolidar expressão condicional (Consolidate Conditional Expression) Substituir condicional aninhada por cláusulas de guarda (Replace Nested Conditional with Guard Clauses)
Separar consulta de modificador (Separate Query from Modifier) Parametrizar função (Parameterize Function) Remover argumento de flag (Remove Flag Argument) Preservar objeto inteiro (Preserve Whole Object) Substituir parâmetro por consulta (Replace Parameter with Query) Substituir consulta por parâmetro (Replace Query with Parameter) Remover método de escrita (Remove Setting Method) Substituir construtor por função de factory (Replace Constructor with Factory Function) Substituir função por comando (Replace Function with Command) Substituir comando por função (Replace Command with Function) Subir método (Pull Up Method) Subir campo (Pull Up Field) Subir corpo do construtor (Pull Up Constructor Body)
with Delegate) Substituir superclasse por delegação (Replace Superclass with Delegate) Descer método (Push Down Method) Descer campo (Push Down Field) Substituir código de tipos por subclasses (Replace Type Code with Subclasses)
Lessons Learned from a Year on Exercism.Io - Devon Estes https://youtu.be/tJJMrtJEK1A Refactoring Techniques for Elixir, Ecto, and Phoenix - Gary Rennie https://youtu.be/V21DAKtY31Q Using Credo to improve your Elixir code - Vitali Tatarintev https://whatdidilearn.info/2018/05/27/using-credo-to-improve-your-elixir-code.html Protocols Are Powerful but Beware - Timmon Verlaan https://timmo.immo/blog/protocols-beware Polymorphism in Elixir - Mustafa Turan https://medium.com/elixirlabs/polymorphism-in-elixir-cd0c765b6929
Jenga Driven Development - João Britto https://pt-br.eventials.com/locaweb/evitando-o-jenga-driven-development-com-joao-britto/ How Elixir made me a better Java programmer - Juliana Helena https://youtu.be/O86LQ58PvKU Arquitetura Hexagonal: mantendo sua aplicação saudável por Camila Campos https://youtu.be/mYWG8Qv8W5k Encontrando equilíbrio do DDD enquanto sua aplicação cresce - Carol Karklis https://pt.slideshare.net/CarolinaKarklisPacke/encontrando-equilbrio-do-ddd-enquanto-sua -aplicao-cresce