Cuando trabajamos con Elixir, es habitual encontrarnos con módulos cuyos nombres son largos y están compuestos por varias partes separadas por puntos, como empresa.empleado o incluso cadenas más extensas como empresa.módulos.tipos.empleado. Esto puede hacer que nuestro código se vuelva repetitivo y menos legible, especialmente cuando necesitamos referenciar estas estructuras o funciones en múltiples ocasiones, por ejemplo, en patrones de coincidencia o guardas.
Para evitar tener que escribir constantemente estos nombres completos, Elixir nos ofrece mecanismos que nos permiten simplificar y hacer nuestro código más conciso. Uno de ellos es la palabra clave alias. Con alias podemos crear un nombre alternativo, más corto, para un módulo, de modo que en lugar de escribir empresa.empleado repetidamente, simplemente escribamos empleado.
La sintaxis para crear un alias es sencilla. Por ejemplo, si queremos que empleado sea un alias para empresa.empleado, escribimos:
alias empresa.empleado, as: empleado
A partir de ese momento, dentro del bloque donde declaramos el alias, podemos usar empleado en lugar del nombre completo. Es importante destacar que los alias son locales al bloque donde se definen, es decir, afectan al bloque do-end en el que están declarados y a todo lo que haya dentro de él. Esto nos permite tener alias diferentes en distintos ámbitos sin que entren en conflicto.
Aunque podríamos renombrar un módulo con un alias muy distinto, como MPL, no es recomendable porque puede generar confusión y dificultar el mantenimiento del código. Lo ideal es que el alias sea claro y representativo del módulo original.
Además de alias, Elixir nos ofrece la palabra clave import, que nos permite traer funciones de otros módulos para usarlas directamente sin necesidad de anteponer el nombre del módulo. Por ejemplo, si importamos el módulo json, podemos llamar a sus funciones como encode en lugar de json.encode.
La forma básica de usar import es:
import Json
Con esto, todas las funciones públicas de Json estarán disponibles en nuestro módulo como si fueran propias. Sin embargo, hay que tener cuidado con esta práctica, ya que puede generar conflictos si diferentes módulos tienen funciones con el mismo nombre y aridad.
Un ejemplo clásico es la función length/1, que existe tanto en el módulo Kernel como en el módulo String, pero con comportamientos distintos. Si importamos ambos módulos sin restricciones, Elixir no sabrá a cuál función length nos referimos y nos dará un error de llamada ambigua.
Para evitar estos conflictos, es recomendable limitar qué funciones importamos usando la opción only. Por ejemplo, si solo queremos importar la función encode/1 del módulo Json, podemos hacerlo así:
import Json, only: [encode: 1]
También podemos importar varias funciones especificándolas en la lista:
import Json, only: [encode: 1, decode: 1]
De esta forma, mantenemos nuestro espacio de nombres limpio y evitamos problemas de ambigüedad.
En resumen, alias nos ayuda a acortar nombres de módulos para mejorar la legibilidad y evitar escribir cadenas largas repetidamente, mientras que import nos permite usar funciones de otros módulos como si fueran propias, siempre con precaución para no generar conflictos. Ambos mecanismos son herramientas poderosas para escribir código Elixir más limpio y conciso.