peg-java v2.3.3
peg-java
Calcula Inestabilidad y Grado de abstracción para determinado proyecto en Java y reporta lo hallado.
Importante: A la hora de calcular la inestabilidad de un proyecto entero ES NECESARIO considerar tipos externos para el cálculo de acoplamiento a menos que sea entre módulos de un mismo proyecto que no es el foco de esta herramienta.
Requerimientos
- Node v18.15.x LTS
Utilización
$ npm install -g peg-java
$ peg-java COMMAND
running command...
$ peg-java (--version)
peg-java/2.3.3 linux-x64 node-v18.15.0
$ peg-java --help [COMMAND]
USAGE
$ peg-java COMMAND
...
Ejecutar en desarrollo:
./bin/dev COMMAND
Ejecutar en producción:
./bin/run COMMAND
Mostrar debug (aplica a los anteriores):
DEBUG=peg-java:* peg-java COMMAND
Ejecutar pruebas:
npm run test
Comandos
peg-java DIRECTORY
Analiza el directorio entregado cómo argumento
USAGE
$ peg-java DIRECTORY [--noDistance | [--noAbstraction | --noInstability] | ]
ARGUMENTS
DIRECTORY Ruta directorio de proyecto. (Absoluta o relativa)
FLAGS
--noAbstraction Omite el cálculo de abstracción
--noDistance Omite el cálculo de distancia
--noInstability Omite el cálculo de inestabilidad
DESCRIPTION
Analiza el directorio entregado cómo argumento
Recorre el directorio del proyecto Maven/Gradle y parsea los archivos .java, genera
un gráfico abstracción/inestabilidad El directorio `test` y clases que contengan la
palabra `Test` son omitidas.
EXAMPLES
$ peg-java ../opencsv-source/
Analizando proyecto en: ../opencsv-source/
Archivos java: 150
Total Acoplamiento: 106 Ca - 217 Ce
Inestabilidad: 0.6718
Abstracción: 0.2632
Distancia: 0.065
Gráfico generado en: distance-chart.png
See code: dist/commands/index.ts
peg-java help [COMMANDS]
Display help for peg-java.
USAGE
$ peg-java help [COMMANDS] [-n]
ARGUMENTS
COMMANDS Command to show help for.
FLAGS
-n, --nested-commands Include all nested commands in the output.
DESCRIPTION
Display help for peg-java.
See code: @oclif/plugin-help
Descripción y referencias
Este programa calcula la abstracción e inestabilidad con el fin de ayudar a comprender la arquitectura de un Software, se puede encontrar material de referencia a continuación:
- https://medium.com/javarevisited/abstractness-vs-instability-neo4j-case-study-c453f46a6ea5 (Artículo de referencia para cálculo de mismas métricas para paquetes de un proyecto)
- https://www.jarchitect.com/Metrics (Herramienta)
- https://ieeexplore.ieee.org/document/491650 (Artículo sobre acoplamiento en POO)
- https://scitools.com/ (Understand, Herramienta FOSS para análisis de código)
Arquitectura
Changelog: Release 2
Estilo arquitectónico microkernel
Cómo parte del proceso actualizar la arquitectura del proyecto se decidió utilizar el estilo arquitectónico microkernel, el cual permite separar la lógica de negocio de la lógica de la aplicación, esto permite que la lógica de negocio sea independiente de la plataforma y pueda ser reutilizada en otras aplicaciones. El enfoque principal de esta entrega es la modularidad y la extensibilidad, por lo que se considera que este estilo arquitectónico es el más adecuado para el proyecto.
src/commands
: Contiene los comandos de la aplicación, estos son los encargados de recibir los argumentos y opciones de la línea de comandos y delegar la ejecución a los servicios correspondientes. Es el equivalente a un cliente que accede a mecanismos en la arquitectura microkernel a través de capabilidades para comunicarse con unservice
oPlugin
.src/service
: Servicios que contienen la lógica de negocio de la aplicación, estos son los encargados de realizar los cálculos y generar las métricas solicitadas. Es el equivalente a unPlugin
en la arquitectura microkernel. Contiene servicios que extienden dePlugin
cómo un tipo genérico de servicio.src/core
: Corresponde a el kernel o core de peg-java, a través depeg-java.ts
actualiza la estadística del proyecto analizado, recibe las notificaciones generadas por los servicios, utiliza el SingletonProjectStats
y lo actualiza por medio de los eventos recibidos.
Patrones de diseño
- Singleton: Se utiliza para mantener la estadística del proyecto analizado, esta estadística es actualizada por los servicios y es utilizada por el comando
peg-java
para mostrar los resultados. (src/model/project-stat.ts
) - Observer: Se utiliza para notificar a los servicios cuando se ha analizado un archivo, esto permite que los servicios puedan actualizar la estadística del proyecto.
src/core/peg-java.ts
: Observer (Suscriptor), es notificado por los servicios cuando se ha analizado un archivo u obtenido una métrica.src/model/plugin.ts
: Subject (Publicador), clase abstracta que funciona cómo base para crearPlugins
, notifica al kernel cuando se ha analizado un archivo u obtenido una métrica y lo asigna enProjectStat
.
Diagrama
El siguiente diagrama representa las principales dependencias en el proyecto que permiten el funcionamiento descrito en la arquitectura.
Contribuir
peg-java fué hecho por @jmainhard cómo parte de una evaluación académica. Para contribuir se considera:
- UXD en Español (En medida de lo posible)
- Código en Inglés