Kotlin DSL | Experimentación y conclusiones
Observación del potencial, experimentación y posibles errores no tomados en cuenta
Puedes ir a cualquier artículo de esta serie haciendo clic en alguno de los siguientes enlaces:
Kotlin DSL
- Introducción
- Conocimiento base para construir DSLs con Kotlin — Parte 1
- Conocimiento base para construir DSLs con Kotlin — Parte 2
- Código Base: Proyecto Shapes-DSL
- Construcción del DSL: 1 — Organización de paquetes y el objeto ‘Panel’
- Construcción del DSL: 2 — El objeto ‘Cuadrado’
- Construcción del DSL: 3 — Los objetos ‘Triángulo’ y ‘Rombo’
- Construcción del DSL: 4 — Espacios en blanco y el objeto ‘Figura Compuesta’
- Construcción del DSL: 5 — Operadores ‘plus’ y ‘minus’ y funciones ‘inline’
- Construcción del DSL: 6 — La anotación @DslMarker
- Experimentación y conclusiones
En el artículo anterior finalizamos la creación del DSL añadiendo restricciones de acceso a los receptores implícitos dentro de las funciones de orden superior. En este artículo jugaremos un poco con el DSL y sacaremos algunas conclusiones.
Como ya mencioné en el artículo de introducción de esta serie, un DSL interno se construye sobre un GPL y puede convivir con dicho lenguaje sin ningún problema. Esto nos permite aplicar instrucciones en dicho lenguaje dentro del DSL sin que genere errores. Por ejemplo, podríamos crear figuras de tipo ‘Triángulo’ usando un ciclo o bucle de la siguiente manera:
La ejecución del código anterior arroja el siguiente resultado:
Incluso podrías guardar las figuras en una lista y luego combinarlas todas con la operación intersección:
Dado que se agregan figuras de manera aleatoria y que el orden de la combinación también se hace de manera aleatoria, en cada ejecución se obtendrá una salida diferente. Una de estas salidas es la siguiente:
Al parecer todo funciona perfectamente, sin embargo, quiero que hagamos una prueba más antes de finalizar. Esta vez vamos a crear una figura compuesta creando las figuras involucradas directamente dentro del bloque del lambda de la función composed
:
Al ejecutar el código anterior obtenemos la siguiente salida:
Como puedes observar, las figuras creadas dentro del bloque de código del lambda de la función composed
son a la vez incluidas dentro del Panel, aunque claramente esa no es nuestra intención. Este es un problema que tiene el DSL pero que puede ser fácilmente corregido modificando el lambda de la función composed
. Te dejo como ejercicio la modificación del DSL para que al ejecutar el código anterior se obtenga la siguiente salida:
💬 Puedes encontrar la solución en la rama
dsl-enhanced
dentro del proyecto Shapes-DSL.
Estoy seguro de que cuando iniciaste esta serie y mirabas la imagen de la portada la dejabas pasar y continuabas con la lectura sin darle importancia al código plasmado en ella, pero conforme ibas avanzando en la serie hasta este punto, tu percepción fue cambiando de manera que ahora no puedes mirar la imagen sin pensar en el código que hay por debajo y que permite expresar esas instrucciones de la manera en que lo hace.
Con el conocimiento que has adquirido, ahora puedes crear un DSL cuando lo creas conveniente, ya sea porque quieres crear una librería, porque estés trabajando en un módulo complicado, o porque simplemente quieras simplificar el código que consideres verboso o difícil de leer.
Aprovecha la potencia de Kotlin y crea código elegante que permita que la lectura, el mantenimiento y la escalabilidad de un sistema sea más simple y que ahorre tiempo, todos los desarrolladores de tu equipo e incluso tú mismo estarán agradecidos.
- Puedes acceder al código fuente del proyecto Shapes-DSL desde mi cuenta de GitHub en el siguiente enlace: https://github.com/pencelab/Shapes-DSL