Skip to content

[Tutorial] CRC y DFTBLWB

Camilo edited this page May 21, 2024 · 2 revisions

Constructors - Reducers - Converters (CRC)

Bruce Tate ha definido un concepto llamado CRC que básicamente permite separar las funciones en tres responsabilidades: construir, reducir y convertir.

El objetivo es permitir utilizar los Pipes (|>) lo mayor posible, evitando el uso de with. Se evita el uso de with ya que eso obliga a romper la cadena de pipeline. Si es necesario utilizar with se recomienda envolverlo en una función que permita continuar con la cadena.

iex(17)> input \
  |> constructor \
  |> reducer(item) \
  |> reducer(item) \
  |> reducer(item) \
  |> converter -> # beautiful output

Ejemplos de envoltura de funciones dentro de un pipeline.

def md5(str) do
    str
    |> (fn(s) -> :erlang.md5(s) end).()
    |> Base.encode16(case: :lower)
end

Constructor

Permite crear un acumulador para ser enviado a los distintos reductores (Reducers) y finalmente ser procesados por el conversor (Converter).

En Phoenix esto sería la función mount.

Ejemplos de acumuladores: assigns, changeset.

Los acumuladores tradicionalmente serían un struct o map con los campos necesarios para transmitir la información entre los reductores.

Reductor (Reducer)

Toma un acumulador en su primer parámetro, le realiza distintas operaciones y devuelve una versión modificada del acumulador.

En Phoenix esto sería la función handle_event

Conversor (Converter)

Toma un acumulador y lo convierte a un formato amigable al usuario. Normalmente sería la última función en el pipeline de funciones.

En Phoenix esto sería la función render.

El acumulador es transformado a un formato final, por ejemplo un string o número que será mostrado como resultado.

Do Fun Things with Big Loud Worker bees