web

Generador de diagramas de clase UML con JavaScript

Introducción

En una de las materias que estoy cursando (o que cursé, dependiendo del momento en el que esto se publique) tuve que presentar todas esas cosas aburridas que conlleva el desarrollo de software.

Me refiero a los diagramas, casos de uso, clases, interfaces y todas esas cosas que al final (desde mi punto de vista) no sirven para nada y solamente hacen perder tiempo.

Los diagramas de clases UML

Pero bueno, centrémonos en la creación de los diagramas de clases que son más o menos como la imagen de abajo, representan una clase con sus propiedades y métodos.

Diagrama de clase UML de una mascota

No sé si son así pero espero que den una idea de lo que hablo. Pues bien, esa imagen que se ve ahí fue creada con el generador de diagramas de clases que hoy vengo a presentar.

La motivación

Como el programador perezoso que soy, decidí hacer algo rápido que me permitiera crear mis diagramas y modificarlos a mi gusto y todo ello sin tener que usar un programa como DIA o esos programas que son justamente para eso.

Sé que hay software especializado, pero hay que dar muchos clicks y todas esas cosas aburridas. ¿Y qué pasa si vas a modificar uno? además, hay que presionar como 3 botones para agregar un dato.

Así que decidí usar JavaScript con Canvas, usando Bulma CSS para el estilo y localStorage para que mis diagramas se quedaran guardados de manera local; usando al simple pero poderoso Vue.js.

El resultado fue este:

Sé que todavía faltan muchas cosas por agregar y pulir, pero para ser la primera versión no está mal.

Código fuente y demostración de la app

Es una aplicación web, la cual puedes probar en mi sección de apps. El código fuente puede ser visto en GitHub y está liberado bajo la licencia MIT o como se diga.

La parte técnica

Calculando longitud de la imagen

Todo el código que genera la imagen está en el script. Ahí defino unas constantes para el grosor de las líneas. Dependiendo de las palabras introducidas se calcula cuál es la más larga y se multiplica por la longitud de los pixeles para sacar el ancho del rectángulo.

Este método no es el más preciso, porque no todas las letras miden lo mismo; pero funciona en la mayoría de casos.

Los ids

Para generar el id de cada diagrama utilicé una función que encontré por ahí; la cual devuelve un id único. Esto es para asignar un nuevo id a cada diagrama.

Persistencia de datos

Cada diagrama en realidad es un objeto de JavaScript que se convierte a imagen; pero para guardarlo lo codifico de manera que se represente como  JSON debido a las limitaciones de localStorage.

Como necesitaba obtener todos los diagramas, utilicé Object.keys para saber cuáles objetos de localStorage estaban almacenados.

Mapeo el arreglo y pongo únicamente el id y título en un arreglo; cuando se hace click entonces se carga el diagrama.

Cuándo actualizar la imagen

Se actualiza la imagen en el evento blur de los controles de entrada de datos. Así se da la impresión de que los datos aparecen cada que el usuario hace un cambio.

También se podría hacer que se generase en el evento keyup pero afectaría el rendimiento.

Descargar imagen del diagrama de clase generado

Para descargar el canvas se crea un enlace invisible y se hace click sobre él, de esta manera se obliga a descargar la imagen. El título de la imagen depende del diagrama.

El prefijo

Cuando ya había subido la app surgieron errores y es que nunca contemplé que no solamente mi app almacenaba datos en localStorage; también otras cosas como Google.

Esto es debido a que los datos se comparten en todo el dominio, así que la solución fue agregar un prefijo a todas las entradas y luego filtrar los datos de localStorage al recuperarlos.

Lo que estoy diciendo se ve claramente en este commit.

Conclusión

Con JavaScript, pereza y un poco de tiempo se pueden crear cosas maravillosas. Cuando digo pereza me refiero a pereza futura de hacer las cosas manuales; no a pereza de no querer hacer nada.

Espero darle seguimiento más tarde, depende de su uso y del tiempo libre que tenga.

Ya que estamos en esto, te invito a ver un generador de código de CodeIgniter hecho con PHP.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.