|
| 1 | + |
| 2 | +== El Lenguaje Elixir |
| 3 | + |
| 4 | +Se recomienda seguir el laboratorio web de Elixir |
| 5 | +https://markm208.github.io/exbook/chapter1/01/index.html |
| 6 | + |
| 7 | +y los capítulos del libro https://joyofelixir.com/ |
| 8 | + |
| 9 | +=== Valores |
| 10 | + |
| 11 | +[,elixir] |
| 12 | +---- |
| 13 | +booleano = true |
| 14 | +numero = 123_456 |
| 15 | +string = "Mi Cadena de Caracteres" <> "Concatenada" |
| 16 | +atomo = :un_atomo |
| 17 | +funcion = fn _ -> "Hola" end |
| 18 | +mapa = %{valor: "hola"} |
| 19 | +lista = [1, "dos", :tres] |
| 20 | +IO.inspect("Imprimir en Terminal") |
| 21 | +# Comentario |
| 22 | +---- |
| 23 | + |
| 24 | +=== Módulos |
| 25 | + |
| 26 | +Los módulos son definidos de la siguiente forma |
| 27 | + |
| 28 | +[,elixir] |
| 29 | +---- |
| 30 | +defmodule MiModulo do |
| 31 | +
|
| 32 | + @constante "Esta constante no puede ser reasignada" |
| 33 | +
|
| 34 | + def mi_funcion_publica() do |
| 35 | + "Función Pública" |
| 36 | + end |
| 37 | +
|
| 38 | + defp mi_funcion_privada() do |
| 39 | + "Función Privada" |
| 40 | + end |
| 41 | +end |
| 42 | +---- |
| 43 | + |
| 44 | +=== Pattern Matching |
| 45 | + |
| 46 | +Esta técnica propia de los lenguajes funcionales, se utiliza para buscar patrones y decidir qué hacer en cada momento. |
| 47 | +Debemos pensar en el operador `=` no como un signo igual típico de otros lenguajes, |
| 48 | +sino como el que nos encontramos en una función matemática |
| 49 | +del tipo `x = a + 1`. Es decir que estamos diciendo que `x` y `a + 1` |
| 50 | +tienen el mismo valor. |
| 51 | + |
| 52 | +[,elixir] |
| 53 | +---- |
| 54 | +# a = 1 |
| 55 | +# b = "elixir" |
| 56 | +# c = "ninjas" |
| 57 | +{a, b, c} = {1, "elixir", "ninjas"} |
| 58 | +---- |
| 59 | + |
| 60 | +*Enlaces* |
| 61 | + |
| 62 | +* https://joyofelixir.com/6-pattern-matching |
| 63 | +* https://www.youtube.com/watch?v=rz14ierM9Q4 |
| 64 | +* https://charlascylon.com/2016-02-24-Elixir-y-el-pattern-matching |
| 65 | +* https://elixirschool.com/es/lessons/basics/pattern_matching |
| 66 | + |
| 67 | +=== Pipe |
| 68 | + |
| 69 | +La programación puede ser desordenada. De hecho tan desordenada que las llamadas de función pueden estar tan contenidas que sean difícil de entender. |
| 70 | + |
| 71 | +Por ejemplo, toma en consideración las siguientes funciones anidadas: |
| 72 | + |
| 73 | +[,c] |
| 74 | +---- |
| 75 | +foo(bar(baz(nueva_function(otra_function())))) |
| 76 | +---- |
| 77 | + |
| 78 | +Aquí, pasamos el valor de `otra_function/1` a `nueva_function/1`, y de `nueva_function/1` a `baz/1`, `baz/1` a `bar/1`, y finalmente el resultado de `bar/1` a `foo/1`. |
| 79 | +Elixir adopta un enfoque pragmático a este caos sintáctico al darnos el operador pipe. |
| 80 | +El operador pipe que luce así `|>` toma el resultado de una expresión, y se lo pasa a la siguiente. |
| 81 | +Vamos a echar otro vistazo al código anterior reescrito con el operador pipe. |
| 82 | + |
| 83 | +[,elixir] |
| 84 | +---- |
| 85 | +otra_function() |
| 86 | +|> nueva_function() |
| 87 | +|> baz() |
| 88 | +|> bar() |
| 89 | +|> foo() |
| 90 | +---- |
| 91 | + |
| 92 | +El operador lleva el resultado de la izquierda, y lo pasa a la derecha. |
| 93 | + |
| 94 | +*Enlaces* |
| 95 | + |
| 96 | +* https://elixirschool.com/es/lessons/basics/pipe_operator |
| 97 | + |
| 98 | +=== Dependencias |
| 99 | + |
| 100 | +Para instalar las dependencias debemos utilizar el comando |
| 101 | + |
| 102 | +[,shell] |
| 103 | +---- |
| 104 | +$ mix deps.get |
| 105 | +---- |
| 106 | + |
| 107 | +Las dependencias están definidas en el archivo `mix.exs` |
| 108 | + |
| 109 | +[,elixir] |
| 110 | +---- |
| 111 | + # Run "mix help deps" to learn about dependencies |
| 112 | + defp deps do |
| 113 | + [ |
| 114 | + # {:dep_from_hexpm, "~> 0.3.0"}, |
| 115 | + # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}, |
| 116 | + ] |
| 117 | + end |
| 118 | +---- |
| 119 | + |
| 120 | +=== Formateo |
| 121 | + |
| 122 | +Para formatear automáticamente nuestro código |
| 123 | +se utiliza el comando |
| 124 | + |
| 125 | +[,shell] |
| 126 | +---- |
| 127 | +$ mix format |
| 128 | +---- |
| 129 | + |
| 130 | +Esto permite estandarizar |
| 131 | +el estilo del código y no tener problemas al momento |
| 132 | +de programar en equipo. |
| 133 | + |
| 134 | +=== Pruebas (Testing) |
| 135 | + |
| 136 | +Para realizar pruebas se utiliza el comando |
| 137 | + |
| 138 | +[,shell] |
| 139 | +---- |
| 140 | +$ mix test |
| 141 | +---- |
| 142 | + |
| 143 | +=== Pruebas Unitarias |
| 144 | + |
| 145 | +Las pruebas unitarias consisten en aislar una parte del código y comprobar que funciona a la perfección. Son pequeños tests que validan el comportamiento de un objeto y la lógica. |
| 146 | +El unit testing suele realizarse durante la fase de desarrollo de aplicaciones de software o móviles. Normalmente las llevan a cabo los desarrolladores, aunque en la práctica, también pueden realizarlas los responsables de QA. |
| 147 | +Hay una especie de mito respecto a las pruebas unitarias. Algunos desarrolladores están convencidos de que son una pérdida de tiempo y las evitan buscando ahorrar tiempo. |
| 148 | +Nada más alejado de la realidad. |
| 149 | +Con ellas se detectan antes errores que, sin las pruebas unitarias, no se podrían detectar hasta fases más avanzadas como las pruebas de sistema, de integración e incluso en la beta. |
| 150 | +Realizar pruebas unitarias con regularidad supone, al final, un ahorro de tiempo y dinero. |
| 151 | + |
| 152 | +*Enlaces* |
| 153 | + |
| 154 | +* https://www.yeeply.com/blog/que-son-pruebas-unitarias/ |
| 155 | + |
| 156 | +=== Phoenix Framework |
| 157 | + |
| 158 | +Si bien es posible crear backends con _Elixir_ completamente |
| 159 | +utilizando `mix` y `plug`. El framework más recomendado es https://www.phoenixframework.org/[*Phoenix*]. |
| 160 | + |
| 161 | +Phoenix es un framework de desarrollo web escrito en Elixir que implementa el patrón Model View Controller (MVC) del lado del servidor. |
| 162 | +Muchos de sus componentes y conceptos nos resultarán familiares a aquellos que tengamos experiencia en otros frameworks web como Ruby on Rails o Python con Django. |
| 163 | + |
| 164 | +Phoenix ofrece lo mejor de ambos mundos: alta productividad de los desarrolladores y alto rendimiento de las aplicaciones. |
| 165 | +También tiene algunos giros nuevos e interesantes, como canales para implementar funciones en tiempo real y plantillas precompiladas para una velocidad increíble. |
| 166 | + |
| 167 | +*Enlaces* |
| 168 | + |
| 169 | +* https://www.phoenixframework.org/ |
| 170 | +* https://elixir-lang.org/learning.html |
| 171 | + |
| 172 | +=== ¿Por qué utilizar Phoenix frente a las alternativas? |
| 173 | + |
| 174 | +Hoy en día existen diversas alternativas para elaborar soluciones |
| 175 | +de backend. Entre las más populares encontramos a |
| 176 | +https://github.com/nitrogen[Nitrogen con Erlang], PHP con Laravel, Python con Django, Ruby con Rails, |
| 177 | +Java con Springboot y muchas otras con Javascript. |
| 178 | + |
| 179 | +Si bien un proyecto puede ser exitoso, robusto y bien estructurado |
| 180 | +con cualquier tecnología. Lo ideal es siempre utilizar |
| 181 | +tecnologías que sean altamente cohesionadas y faciliten elaborar sistemas bien estructurados |
| 182 | +desde un comienzo, que cuenten con las protecciones necesarias de seguridad. Con estándares y documentación amplia que |
| 183 | +faciliten el aprendizaje de nuevos desarrolladores. |
| 184 | + |
| 185 | +_Phoenix_ cuenta con los más de treinta años de la máquina virtual de _Erlang_ para su robustez y altos estándares de seguridad, |
| 186 | +además de la sintaxis amigable y moderna del lenguaje de programación _Elixir_. |
| 187 | + |
| 188 | +Debido a la alta concurrencia de las necesidades actuales (con millones de dispositivos conectados a la vez), utilizar |
| 189 | +tecnologías que solucionen estos problemas de fábrica es un gran acierto. |
| 190 | + |
| 191 | +El autor _Sasa Juric_ en su charla "El alma de Elixir". Nos muestra por qué razón |
| 192 | +es una buena idea utilizar soluciones basadas en la máquina virtual de _Erlang_, |
| 193 | +ya que nos permite reducir enormemente la cantidad de dependencias de la solución, |
| 194 | +utilizando componentes que vienen de fábrica para resolver problemas comunes en sistemas |
| 195 | +distribuidos. |
| 196 | + |
| 197 | +image::erlang.png[] |
| 198 | + |
| 199 | +El simplificar nuestra estructura de servidores al utilizar una base sólida como la _BEAM_, |
| 200 | +nos da una reducción de la entropía (menor cantidad de componentes) y una reducción de costos significativa. |
| 201 | + |
| 202 | +Un ejemplo es el caso de la empresa *Pinterest* donde uno de |
| 203 | +los sistemas que se ejecutaba en 200 servidores _Python_ ahora se ejecuta en cuatro servidores Elixir. |
| 204 | +El efecto combinado de una mejor arquitectura y Elixir ahorró a _Pinterest_ más de $2 millones por año en costos de servidor. |
| 205 | +Además, el rendimiento y la confiabilidad de los sistemas aumentaron a pesar de funcionar con mucho menos hardware. |
| 206 | +Cuando el sistema de notificaciones se ejecutaba en Java, |
| 207 | +estaba en 30 instancias _c32.xl_. |
| 208 | +Cuando se cambió a Elixir, podía ejecutarse en 15. |
| 209 | +A pesar de ejecutarse en menos hardware, los tiempos de respuesta se redujeron significativamente, al igual que los errores. |
| 210 | + |
| 211 | +Un lenguaje que permite a las empresas ahorrar dinero mientras mejora la confiabilidad y el rendimiento parece una fantasía. Elixir puede demostrar este increíble resultado porque el lenguaje está construido sobre Erlang, una plataforma diseñada para software concurrente que debe permanecer en línea. -Los sitios de comercio y los productos SaaS son solo algunos ejemplos, la mayoría del software empresarial actual tiene este requisito. La historia de Elixir mejorando un producto mientras reduce costos se repite. |
| 212 | + |
| 213 | +*Enlaces* |
| 214 | + |
| 215 | +* https://www.youtube.com/watch?v=JvBT4XBdoUE |
| 216 | +* https://paraxial.io/blog/elixir-savings |
| 217 | +* https://www.youtube.com/watch?v=xrIjfIjssLE |
0 commit comments