Skip to content

Commit 6e43435

Browse files
committed
refactor(algorithms): split all 30 into separate documented classes and add flowchart
1 parent 9da3564 commit 6e43435

39 files changed

Lines changed: 1102 additions & 640 deletions

‎README.md‎

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# Array Sort Visualizer · JavaFX
22

3-
Visualizador de **30 algoritmos de ordenación y 8 diseños gráficos** con interfaz nativa JavaFX en negro y grafito. La rama `refactor/ui-modernization` contiene una versión modernizada y completamente separada del antiguo código Swing.
3+
Visualizador de **30 algoritmos de ordenación y 8 diseños gráficos** con interfaz nativa JavaFX en negro y grafito. La rama `refactor/ui-modernization` está separada del antiguo código Swing.
4+
5+
**[Ver el diagrama de flujo y la explicación de la arquitectura](docs/architecture.md)** · [Auditoría técnica](docs/audit.md)
46

57
## Ejecutar la aplicación
68

7-
**Requisitos:** JDK 21 y Apache Maven. Maven descarga JavaFX con sus bibliotecas nativas; no necesitas instalar el SDK por separado.
9+
**Requisitos:** JDK 21 y Apache Maven. Maven descarga JavaFX y sus bibliotecas nativas; no necesitas instalar el SDK por separado.
810

911
```bash
1012
git clone https://github.com/javiluli/array-sort-visualizer-V2.git
@@ -14,57 +16,56 @@ mvn clean package
1416
mvn javafx:run
1517
```
1618

17-
Si ya tienes el repositorio clonado, ejecuta `git pull` antes de compilar. En Windows, comprueba que `java -version` y `mvn -version` utilizan JDK 21. La entrada normal es `visualizer.fx.Launcher`; `PreviewLauncher` existe únicamente para generar la captura automática usada por CI.
18-
19-
El JAR de Maven contiene las clases de la aplicación, pero no incluye un runtime JavaFX autónomo. Hasta preparar una distribución empaquetada, inicia la aplicación con `mvn javafx:run`.
19+
Si ya tienes la rama seleccionada, usa `git pull` antes de compilar. En Windows comprueba que `java -version` y `mvn -version` apuntan a JDK 21. La entrada normal es `visualizer.fx.Launcher`; `PreviewLauncher` solo genera una captura para CI y termina. El JAR no incluye un runtime JavaFX autónomo.
2020

2121
## Controles
2222

23-
- **Algoritmo y diseño:** desplegables para los 30 algoritmos y los ocho modos gráficos.
23+
- **Algoritmo y diseño:** desplegables para 30 algoritmos y ocho modos gráficos.
2424
- **Arcoíris:** switch de activación/desactivación.
25-
- **Retardo:** 1–100 ms en pasos de 1 ms.
26-
- **Elementos:** potencias de dos entre 2 y 1024.
27-
- **Acciones:** ordenar, desordenar y saltar la animación. Saltar acelera la ejecución hasta terminar; no cancela el algoritmo.
28-
- **Información:** tiempo, cambios, accesos al array, memoria, diálogo de información y enlaces externos.
29-
30-
Bogo sort es deliberadamente no determinista y puede tardar mucho con cantidades grandes de elementos.
31-
32-
## Organización del proyecto
33-
34-
El proyecto usa la estructura Maven estándar y **ya no contiene las antiguas jerarquías `Adicionales`, `Ordenar` o `Principal` ni dependencias Swing/AWT**.
25+
- **Retardo y elementos:** mismo control numérico con botones `− / +`; 1–100 ms y potencias de dos entre 2 y 1024.
26+
- **Acciones:** ordenar, desordenar y saltar animación. Saltar elimina el retardo, no cancela el cálculo.
27+
- **Información:** tiempo, cambios, accesos al array, memoria, diálogo de información y enlaces.
28+
29+
Bogo sort no tiene una duración acotada y puede tardar mucho con arrays grandes.
30+
31+
## Estructura y responsabilidades
32+
33+
```text
34+
src/
35+
├── main/
36+
│ ├── java/visualizer/
37+
│ │ ├── core/
38+
│ │ │ ├── AlgorithmCatalog.java
39+
│ │ │ ├── SortAlgorithm.java
40+
│ │ │ ├── SortContext.java
41+
│ │ │ └── algorithms/ # 30 clases, un algoritmo por archivo
42+
│ │ │ ├── BubbleSort.java
43+
│ │ │ ├── QuickSort.java
44+
│ │ │ ├── ...
45+
│ │ │ └── SortHelpers.java # solo operaciones comunes
46+
│ │ └── fx/ # JavaFX, ejecución, controles y dibujo
47+
│ └── resources/visualizer/fx/theme.css
48+
└── test/java/visualizer/fx/SortEngineRegressionTest.java
49+
```
3550

36-
| Ruta | Responsabilidad |
37-
| --- | --- |
38-
| `src/main/java/visualizer/core/AlgorithmCatalog.java` | Registro único y ordenado de los 30 algoritmos. |
39-
| `src/main/java/visualizer/core/Algorithms.java` | Implementaciones de los algoritmos sin dependencias de interfaz gráfica. |
40-
| `src/main/java/visualizer/core/SortAlgorithm.java` | Contrato funcional común de los algoritmos. |
41-
| `src/main/java/visualizer/core/SortContext.java` | Métricas, lecturas/escrituras e hitos de animación. |
42-
| `src/main/java/visualizer/fx/SortEngine.java` | Worker, ciclo de vida, snapshots, shuffle y animación final. |
43-
| `src/main/java/visualizer/fx/VisualizerApp.java` | Composición de la interfaz y acciones JavaFX. |
44-
| `src/main/java/visualizer/fx/UiControls.java` | Controles reutilizables del panel lateral. |
45-
| `src/main/java/visualizer/fx/VisualizationCanvas.java` | Renderizado de los ocho modos y caché de colores. |
46-
| `src/main/resources/visualizer/fx/theme.css` | Tema visual. |
47-
| `src/test/java/visualizer/fx/SortEngineRegressionTest.java` | Regresión del motor y de los 30 algoritmos. |
48-
| `docs/audit.md` | Decisiones y límites de la auditoría técnica. |
51+
`AlgorithmCatalog` vincula cada nombre visible con su clase; `SortEngine` gestiona el trabajador y los snapshots; `SortContext` cuenta operaciones y permite animar sin que los algoritmos dependan de JavaFX. `VisualizationCanvas` dibuja los ocho modos. El proyecto compila íntegramente con Java 21 y UTF-8, sin fuentes Swing heredadas.
4952

50-
Toda la aplicación se compila ahora como **Java 21 / UTF-8** mediante Maven. Ya no existe una compilación secundaria en Windows-1252 ni una capa de compatibilidad Swing.
53+
En [docs/architecture.md](docs/architecture.md) hay un **diagrama del recorrido completo** y un ejemplo explicado paso a paso.
5154

52-
## Compilar, probar y documentar
55+
## Compilar y probar
5356

5457
```bash
5558
mvn clean package
5659
```
5760

58-
El build compila la aplicación y genera Javadoc. GitHub Actions además ejecuta la prueba de regresión del motor, el smoke test de JavaFX y una captura de la ventana real.
61+
El build compila la aplicación y genera Javadoc. GitHub Actions ejecuta además los 30 algoritmos con arrays pequeños (29 con ocho elementos; Bogo con dos), la prueba de controles JavaFX y una captura real. No representa una prueba exhaustiva de todos los tamaños o permutaciones ni sustituye la revisión visual de Windows.
5962

60-
Para ejecutar manualmente la regresión en Windows después de compilar:
63+
Para repetir manualmente la regresión en Windows, después de compilar:
6164

6265
```powershell
6366
java -cp "target\classes;target\test-classes" visualizer.fx.SortEngineRegressionTest
6467
```
6568

66-
La regresión ejecuta los **30 algoritmos con arrays pequeños**: 29 sobre ocho elementos y Bogo sobre dos, además de validar límites de tamaño, shuffle, estado final y cierre del motor. Esto detecta regresiones funcionales importantes, pero no constituye una prueba matemática de todos los tamaños o permutaciones posibles.
67-
6869
## Algoritmos de ordenación
6970

7071
- Bidirectional Bubble

‎docs/architecture.md‎

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Cómo funciona el visualizador
2+
3+
El proyecto tiene dos capas: `visualizer.core` contiene los algoritmos y su contrato, sin JavaFX; `visualizer.fx` contiene la ventana, los controles, el motor de ejecución y el dibujado. El motor une las dos capas mediante `SortContext`, no mediante dependencias de los algoritmos hacia la ventana.
4+
5+
## Diagrama de flujo: pulsar «Ordenar»
6+
7+
```mermaid
8+
flowchart TD
9+
A([Usuario abre Launcher]) --> B[VisualizerApp crea la ventana y SortEngine]
10+
B --> C[Usuario elige algoritmo y pulsa Ordenar]
11+
C --> D{Motor libre y abierto?}
12+
D -- No --> E[No inicia otra operación]
13+
D -- Sí --> F[SortEngine reserva un único hilo de trabajo]
14+
F --> G[AlgorithmCatalog localiza nombre y clase]
15+
G --> H[Clase del algoritmo ordena int\[\] mediante SortContext]
16+
H --> I{Quedan pasos?}
17+
I -- Sí --> J[SortContext contabiliza lecturas y cambios]
18+
J --> K[SortEngine publica una copia del array como Frame]
19+
K --> L[AnimationTimer de VisualizerApp recibe el último Frame]
20+
L --> M[VisualizationCanvas dibuja uno de los 8 estilos]
21+
M --> I
22+
I -- No --> N[SortEngine publica comprobación y estado final]
23+
N --> O[VisualizerApp actualiza tiempo, métricas y botones]
24+
O --> P([Listo para otra operación])
25+
```
26+
27+
Las instantáneas se limitan aproximadamente a 60 por segundo. El bucle de ordenación se ejecuta en un hilo independiente: JavaFX solo lee los `Frame` y pinta la interfaz. El frame incluye copia de los valores, contadores, duración y estado. Los ocho dibujos no conocen los algoritmos.
28+
29+
## Qué contiene cada carpeta
30+
31+
```text
32+
src/main/java/visualizer/
33+
├── core/
34+
│ ├── AlgorithmCatalog.java # nombres + asociación de 30 clases
35+
│ ├── SortAlgorithm.java # contrato funcional
36+
│ ├── SortContext.java # lecturas, escrituras, swaps y animación
37+
│ └── algorithms/
38+
│ ├── BubbleSort.java # una implementación por archivo
39+
│ ├── QuickSort.java
40+
│ ├── ... # otras 28 implementaciones
41+
│ └── SortHelpers.java # solo las 4 operaciones reutilizadas
42+
└── fx/
43+
├── Launcher.java # entrada para usuarios
44+
├── VisualizerApp.java # ventana y conexión de controles
45+
├── UiControls.java # switch y steppers reutilizables
46+
├── SortEngine.java # hilo, estado, contadores, snapshots
47+
├── VisualizationCanvas.java # ocho dibujos
48+
└── PreviewLauncher.java # captura de CI, no app habitual
49+
```
50+
51+
**Ejemplo:** al seleccionar Bubble, `VisualizerApp` llama a `SortEngine.sort(indice)`. Este consulta `AlgorithmCatalog`, que llama a `BubbleSort.sort(array, contexto)`. Bubble compara elementos; para animar intercambios usa `contexto.swap(...)`. El contexto notifica al motor, el motor publica un `Frame` y JavaFX lo dibuja. Un algoritmo diferente reutiliza exactamente ese mismo recorrido.
52+
53+
## Por qué hay menos código que antes
54+
55+
Antes cada algoritmo dependía de una clase llamada `MainAplicacion`, que acumulaba controles Swing, animación, contadores y estado estático. Ahora cada algoritmo contiene solo su lógica de ordenación: el `SortContext` centraliza las operaciones comunes, `SortEngine` centraliza el estado de una ejecución, `UiControls` centraliza los controles visuales y `VisualizationCanvas` centraliza el dibujo. **Se han eliminado duplicaciones y una segunda UI**, no los 30 algoritmos ni las ocho visualizaciones.
56+
57+
## Otras acciones y límites
58+
59+
- **Desordenar** emplea Fisher–Yates directamente en `SortEngine` y publica los mismos `Frame`.
60+
- **Saltar** quita el retardo de los pasos del algoritmo, pero no lo cancela. Con Bogo, esto no garantiza terminar pronto.
61+
- **Cambiar modo/arcoíris** solo modifica `VisualizationCanvas`; no reinicia el algoritmo.
62+
- **Cambiar número de elementos** reinicializa el array solo cuando el motor está libre.
63+
- **Memoria** se lee en JavaFX aproximadamente una vez por segundo, por separado del motor.
64+
65+
## Cómo verificarlo
66+
67+
`mvn clean package` compila todas las clases y genera Javadoc. GitHub Actions ejecuta una regresión de los 30 algoritmos con entradas pequeñas, una prueba de controles y una captura JavaFX. Esas pruebas no cubren todas las permutaciones ni sustituyen una prueba visual en Windows.

‎docs/audit.md‎

Lines changed: 21 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,38 @@
1-
# Auditoría del repositorio — rama `refactor/ui-modernization`
1+
# Auditoría técnica — rama `refactor/ui-modernization`
22

3-
Fecha: 17 de septiembre de 2026. Auditoría y refactorización completa de la rama de modernización. **No** incluye merge a `master`.
3+
Fecha: 17 de septiembre de 2026. Cambios exclusivos de la rama de pruebas, sin merge ni PR.
44

5-
## Resultado actual
5+
## Estructura actual
66

7-
La aplicación queda como un único proyecto Maven Java 21/UTF-8 con interfaz JavaFX. Se han eliminado las jerarquías antiguas `Adicionales`, `Ordenar` y `Principal`, la dependencia de Swing/AWT, la compilación secundaria en Windows-1252 y las clases puente que conservaban nombres históricos.
7+
Maven estándar, Java 21 y UTF-8. No existen las antiguas carpetas `Adicionales`, `Ordenar` ni `Principal`, ni la UI Swing. El motor reside en `visualizer.fx.SortEngine`; su estado ya no utiliza campos estáticos de la aplicación de 2020. Los algoritmos no importan clases UI.
88

9-
Se mantienen los 30 algoritmos, ocho visualizaciones, métricas, memoria, controles, enlaces, modo arcoíris y comportamiento de «Saltar ordenación».
9+
- `visualizer.core.AlgorithmCatalog`: fuente única de nombres y referencias a implementaciones.
10+
- `visualizer.core.SortAlgorithm` y `SortContext`: contrato y métricas/animación.
11+
- `visualizer.core.algorithms`: **30 clases con implementación propia, una por archivo**; `SortHelpers` reúne cuatro primitivas compartidas sin algoritmos seleccionables.
12+
- `visualizer.fx`: `Launcher`, ventana `VisualizerApp`, controles `UiControls`, motor `SortEngine`, dibujado `VisualizationCanvas` y captura CI `PreviewLauncher`.
13+
- `src/main/resources/visualizer/fx/theme.css`: estilos; `src/test/java/visualizer/fx/SortEngineRegressionTest.java`: regresión.
1014

11-
## Estructura
15+
[Diagrama de flujo y explicación para entender las responsabilidades](architecture.md).
1216

13-
- `src/main/java/visualizer/core/AlgorithmCatalog.java`: catálogo único de nombres e implementaciones.
14-
- `src/main/java/visualizer/core/Algorithms.java`: implementaciones de los 30 algoritmos.
15-
- `src/main/java/visualizer/core/SortAlgorithm.java`: contrato funcional común.
16-
- `src/main/java/visualizer/core/SortContext.java`: instrumentación compartida de accesos, cambios y checkpoints.
17-
- `src/main/java/visualizer/fx/SortEngine.java`: worker, ciclo de vida, snapshots, shuffle y animación final.
18-
- `src/main/java/visualizer/fx/VisualizerApp.java`: composición y eventos de la interfaz.
19-
- `src/main/java/visualizer/fx/UiControls.java`: controles reutilizables.
20-
- `src/main/java/visualizer/fx/VisualizationCanvas.java`: renderizado de los ocho modos.
21-
- `src/main/resources/visualizer/fx/theme.css`: tema visual.
22-
- `src/test/java/visualizer/fx/SortEngineRegressionTest.java`: regresión funcional del motor.
17+
## Refactorizaciones y errores revisados
2318

24-
Esta separación evita que los algoritmos conozcan JavaFX. Solo reciben un `SortContext` y operan sobre el array.
19+
El registro con referencias a métodos permite detectar referencias a implementaciones inexistentes al compilar. Separar cada algoritmo simplifica revisarlo y modificarlo sin tocar los demás; se conservó el cuerpo de cada implementación y su orden. Las operaciones de partición, inserción, fusión y heap están compartidas para no duplicarlas entre Quick/Intro/Tim/Merge y sus variantes.
2520

26-
## Cambios de arquitectura aplicados
21+
`SortEngine` rechaza trabajo si está cerrado u ocupado, publica el resultado terminal antes de liberar el estado ocupado, usa un hilo independiente y limita los snapshots a unos 60 por segundo. El canvas conserva una paleta cacheada para evitar recalcular colores por fotograma. Maven emplea un solo compilador Java 21; CI ejecuta compilación, Javadoc, regresión, controles y captura gráfica.
2722

28-
| Área | Antes | Ahora |
29-
| --- | --- | --- |
30-
| Algoritmos | 30 clases heredadas con dependencias a `MainAplicacion`, estado estático y paquetes históricos. | Registro único y métodos de algoritmo aislados en `visualizer.core`. |
31-
| UI | JavaFX más adaptadores de compatibilidad Swing. | JavaFX nativo únicamente. |
32-
| Estado | Contadores, delay y finalización repartidos entre clases estáticas. | Estado de ejecución propiedad de `SortEngine`. |
33-
| Animación | Callbacks con nombres de la antigua UI. | `SortContext` con operaciones explícitas y checkpoints. |
34-
| Build | Java 21 + compilación separada Java 8/Windows-1252. | Un solo build Java 21/UTF-8. |
35-
| Registro | Implementaciones y nombres podían estar duplicados. | `AlgorithmCatalog` es la única fuente de orden y nombres. |
36-
| Tests | Smoke de UI y regresión parcial evolucionada durante la migración. | Regresión que recorre los 30 algoritmos con entradas pequeñas, más smoke JavaFX. |
23+
## Limitaciones
3724

38-
## Errores y riesgos revisados
25+
- La regresión recorre los 30 algoritmos, pero 29 usan ocho valores y Bogo usa dos: no demuestra corrección para todos los tamaños, permutaciones o casos con duplicados. Bitonic y los controles del visualizador usan potencias de dos. Algunos algoritmos de distribución solo admiten enteros no negativos, como los valores utilizados en la aplicación.
26+
- Los contadores `SortContext` son consistentes dentro de la nueva arquitectura pero pueden diferir del código de 2020; ciertas operaciones auxiliares (por ejemplo la ordenación interna de cubetas) no se instrumentan paso a paso.
27+
- Bogo puede tardar indefinidamente. «Saltar» acelera animación, **no** es cancelación real.
28+
- Las pruebas UI corren en un escritorio virtual Linux; escalado DPI y tipografías de Windows requieren revisión manual.
29+
- `PreviewLauncher` utiliza `java.awt.image.BufferedImage` únicamente para guardar la captura PNG de CI; la interfaz de usuario y los algoritmos no utilizan Swing/AWT.
3930

40-
### Ciclo de vida del motor
41-
42-
El motor rechaza nuevas tareas cuando está cerrado u ocupado, publica el frame terminal antes de liberar `busy`, utiliza un worker daemon único y conserva el resultado final visible. `close()` es idempotente y una interrupción se propaga como error de ejecución en vez de ignorarse silenciosamente.
43-
44-
### Estado global
45-
46-
Se eliminó el estado estático compartido que impedía razonar sobre una ejecución de forma aislada. Contadores, delay, progreso de finalización y array pertenecen ahora a la instancia de `SortEngine`.
47-
48-
### Registro de algoritmos
49-
50-
Los nombres y funciones viven juntos en `AlgorithmCatalog`, evitando dos listas paralelas. El selector consume directamente ese catálogo.
51-
52-
### Renderizado
53-
54-
`VisualizationCanvas` sigue reutilizando la paleta de colores por tamaño de array y limita las actualizaciones del motor a aproximadamente 60 snapshots por segundo. No se afirma una mejora porcentual de rendimiento sin perfilado específico.
55-
56-
### Build
57-
58-
Maven compila todas las fuentes con Java 21 y UTF-8. Ya no existe Ant embebido ni una ruta de compilación distinta para código antiguo. Javadoc forma parte del build.
59-
60-
## Limitaciones que siguen siendo reales
61-
62-
### Cobertura algorítmica
63-
64-
La regresión ejecuta los 30 algoritmos, pero usa entradas pequeñas: 29 con ocho elementos y Bogo con dos. Esto detecta regresiones comunes y errores de ordenación, pero no prueba todas las permutaciones, tamaños ni costes extremos.
65-
66-
### Bogo sort
67-
68-
Bogo es deliberadamente no determinista. Con tamaños grandes puede tardar indefinidamente. «Saltar ordenación» elimina el retraso de animación, pero no transforma Bogo en un algoritmo acotado ni cancela la operación.
69-
70-
### Métricas
71-
72-
Los contadores de cambios y accesos se instrumentan ahora mediante `SortContext`. Son coherentes dentro de la nueva arquitectura, pero no deben interpretarse como una reproducción bit a bit de los contadores históricos porque la implementación antigua no aplicaba una política uniforme en todos los algoritmos.
73-
74-
### Revisión visual de Windows
75-
76-
GitHub Actions usa Linux con escritorio virtual. El smoke test comprueba arranque, controles, ocho modos y una ordenación real, pero no sustituye una revisión manual del escalado DPI, tipografía y comportamiento de ventana en Windows.
77-
78-
## Comprobaciones reproducibles
31+
## Cómo reproducir comprobaciones
7932

8033
```bash
8134
mvn clean package
82-
java -cp "target/classes;target/test-classes" visualizer.fx.SortEngineRegressionTest
8335
mvn javafx:run
8436
```
8537

86-
En Linux el separador de classpath es `:` en lugar de `;`.
87-
88-
GitHub Actions además ejecuta el smoke test JavaFX y captura una imagen de la ventana real como artefacto.
89-
90-
Todo permanece aislado en `refactor/ui-modernization`; no se ha realizado merge ni se ha abierto una pull request.
38+
Tras compilar, en Windows: `java -cp "target\classes;target\test-classes" visualizer.fx.SortEngineRegressionTest` (en Linux, separador `:`). GitHub Actions ejecuta además el smoke de los controles, dibujo y captura.

0 commit comments

Comments
 (0)