Kotlin DSL | Introducción

Glenn Sandoval
Kotlin en Android
Published in
6 min readMay 19, 2021

Introducción al Lenguaje Específico de Dominio con Kotlin

En esta serie de artículos te mostraré qué es un DSL y cómo podemos aprovechar el potencial de Kotlin para crear un DSL que nos permita escribir código más intuitivo. A la vez descubrirás el mecanismo que hay detrás de muchas de las librerías que utilizamos en nuestros proyectos.

Si eres desarrollador de software alguna vez habrás tenido que trabajar con hojas de estilo (CSS), sentencias SQL, HTML, o incluso si estás aquí probablemente eres desarrollador de aplicaciones móviles para Android y habrás tenido que configurar tus proyectos con Gradle. La característica común de todos los lenguajes/tecnologías mencionados anteriormente es que utilizan un lenguaje específico para resolver un problema particular. Esto los clasifica como lenguajes específicos de dominio — Domain-Specific Language o DSL por sus siglas en Inglés — , que a diferencia de los lenguajes de propósito general — General Purpose (programming) Language o GPL por sus siglas en Inglés — tales como Java, Python, Kotlin, etc.; son excelentes resolviendo ese problema particular debido a que su código se hace mas legible e intuitivo siendo así más fácil de escribir, mantener e incluso algunas veces se encuentra optimizado para realizar esa tarea específica, como es el caso de SQL.

¿Cómo podemos saber si determinado lenguaje es un DSL o un GPL?

Si el lenguaje/tecnología que estás utilizando te funciona solamente para resolver un problema particular y siempre bajo el mismo contexto, entonces estás en presencia de un DSL.

Tomemos el caso de SQL mencionado anteriormente. Con SQL solamente podrás realizar operaciones en una base de datos permitiéndote hacer uso de su motor para realizar búsquedas de una manera más eficiente. Sin embargo, si intentas programar una aplicación móvil con SQL o crear una página web, simplemente te será imposible. Otro caso es HTML el cual solamente te permitirá estructurar páginas web, y aunque éstas puedan ser desplegadas en diferentes dispositivos, con HTML no podrías programar un driver, crear una librería, ni hacer cualquiera otra cosa que no sea estructurar una página web.

Hasta ahora parece que un DSL es un lenguaje totalmente independiente que nos permite resolver un problema particular, sin embargo, es posible tener un DSL dentro de un GPL y muchas de la librerías que utilizamos en nuestros proyectos son justamente esa clase de DSL. Un DSL no necesariamente debe ser un lenguaje aislado e independiente, sino que podemos encontrar un DSL dedicado a realizar alguna tarea específica dentro del conjunto de tareas que realiza alguna aplicación que hayamos creado, conviviendo con el resto de código. A este tipo de DSL se le conoce como DSL interno.

Cabe mencionar que un DSL interno convive con el resto del código sin generar ningún conflicto porque en realidad está construido sobre ese mismo lenguaje. De hecho dentro del DSL interno se podrían escribir instrucciones de código en el lenguaje sobre el que está montado y funcionarían sin ningún problema.

Un ejemplo muy claro de DSL interno en Kotlin es el código que escribes para la inyección de dependencias con la librería Koin:

🔗 Este ejemplo de código ha sido tomado de la web oficial de Koin

Otro ejemplo de DSL interno es el código que escribes para crear microservicios o aplicaciones web con el framework Ktor:

🔗 Este ejemplo de código ha sido tomado de la web oficial de Ktor

Notarás un patrón en la estructura y la sintaxis de ambos ejemplos de código. Básicamente en lugar de seguir la estructura secuencial de siempre en la que se instancia un objeto y luego se modifican sus atributos mediante llamadas a sus correspondientes setters, lo hace todo bajo estructuras de llaves anidadas en las que se instancian otros objetos y/o se establecen sus atributos de tal manera que la composición de cada objeto y su intervención en cada contexto se puede comprender a simple vista.

Si eres desarrollador de aplicaciones móviles para Android y cumples con tus obligaciones de desarrollador manteniéndote actualizado, entonces conocerás el kit de herramientas Compose que forma parte de Jetpack y que por cierto explota las características que tiene Kotlin haciendo uso de su propio DSL para algunas API como LazyRow y LazyColumn según se destaca en su documentación oficial.

🔗 Este ejemplo de código ha sido tomado de la documentación oficial de Jetpack Compose

Declarar una interfaz gráfica, de manera tan clara y versátil en comparación con los layouts en XML, sin duda alguna revolucionará el desarrollo de aplicaciones móviles para Android tan pronto la primera versión estable de Compose sea liberada. Dicha claridad y versatilidad se obtiene gracias al potencial que tiene Kotlin como lenguaje de programación de paradigma híbrido que nos posibilita la creación de nuestros propios DSLs.

¿Qué se necesita para crear un DSL con Kotlin?

Ya te comenté algunas de las ventajas que nos ofrece un DSL, sin embargo, la creación de un DSL viene con un costo un poco elevado dado que es necesario tener un dominio de Kotlin que va más allá de su faceta respecto a la programación orientada a objetos y explota mucho más su faceta respecto a la programación funcional.

Asumiendo que ya tienes las bases de conocimiento respecto a la programación orientada a objetos, para crear un DSL con Kotlin es necesario que adicionalmente tengas como mínimo un conocimiento de lo siguiente:

Además para construir un DSL más idiomático e incluso más eficiente se podría aprovechar también lo siguiente:

Una vez que aprendas a aplicar las características anteriores podrás crear un DSL para que a partir de un código que luce así…

Ejemplo #1

…lo “transformes” en código que luce así…

Ejemplo #2

…obteniendo con ambos códigos el siguiente resultado:

Resultado

Si bien ambos ejemplos son entendibles debido a la simplicidad del código base, debes tomar en cuenta que el código con el que lidiamos día a día los desarrolladores en proyectos reales requiere de configuraciones más extensas y creación de objetos mucho más complejos, con lo cual la sintaxis del Ejemplo #1 se vuelve cada vez más difícil de seguir conforme la cantidad de código aumenta, mientras que la sintaxis del Ejemplo #2 será mucho más fácil de entender y de darle seguimiento.

La idea de esta serie de artículos es que además de tener una idea del mecanismo que hay por debajo de muchas librerías también puedas crear un DSL desde cero, o bien, que puedas construir uno sobre cualquier código que quieras mejorar y que no te sea posible modificar, es decir, crear lo que en la jerga de la programación llamamos azúcar sintáctico.

Por el momento esto es todo. En el siguiente artículo explicaré cada una de las características anteriormente mencionadas para que puedas continuar con los siguientes artículos en los que te voy a proveer con el código necesario partiendo del Ejemplo #1 ya listo, para luego ir creando paso a paso el DSL sobre ese mismo código. De esta manera te será posible llegar a obtener una sintaxis como la del código mostrado en el Ejemplo #2 sin tocar ni una sola línea del código base.

Continúa en el siguiente artículo con Conocimiento base para construir DSLs con Kotlin — Parte 1

--

--

Glenn Sandoval
Kotlin en Android

I’m a software developer who loves learning and making new things all the time. I especially like mobile technology.