Skip to content

Latest commit

 

History

History
219 lines (183 loc) · 15.8 KB

File metadata and controls

219 lines (183 loc) · 15.8 KB

INFORME DEL PROYECTO: TIENDA DE CELULARES

Fecha: 18 de diciembre de 2025 Versión del Informe: 3.0

Objetivo del informe

Explicar de forma clara y didáctica el proyecto "Tienda de Celulares" y cada uno de sus módulos, con un nivel adecuado para programadores novatos: qué hace cada archivo, cómo se relacionan, cómo compilar y ejecutar, y recomendaciones para mantenimiento y mejoras.

Resumen del proyecto

  • Lenguaje: Java (Swing para la interfaz gráfica)
  • Propósito: aplicación simple de escritorio para gestionar un catálogo de teléfonos y procesar ventas con descuentos y obsequios.
  • Estructura: código en src/tienda y clases compiladas en bin.

Cómo funciona (flujo general)

  1. Al ejecutar la aplicación se crea VentanaPrincipal, que muestra un menú con opciones.
  2. VentanaPrincipal invoca diálogos modales (JDialog) para consultar, listar, modificar y vender teléfonos.
  3. Los datos de los teléfonos y la lógica de ventas están centralizados en DatosGlobales.
  4. El modelo de datos principal es la clase Telefono.

Cómo compilar y ejecutar

En Windows PowerShell, desde la raíz del proyecto:

if (-not (Test-Path -Path "bin")) { New-Item -ItemType Directory -Path "bin" }
javac -d bin src\tienda\*.java
java -cp bin tienda.VentanaPrincipal

También se puede ejecutar directamente desde VS Code usando el botón "Run Java" después de configurar los archivos .project, .classpath, launch.json y settings.json en el directorio .vscode.

Explicación por módulo (nivel: programador novato)

Cada sección explica responsabilidad, cómo usarlo desde el código, y puntos clave para entenderlo.

VentanaPrincipal.java

  • Responsabilidad: Ventana principal de la aplicación, crea la barra de menú, muestra un fondo con imagen escalable y abre los diálogos.
  • Componentes clave:
    • JMenuBar menuBar y varios JMenu/JMenuItem para las secciones: Archivo, Mantenimiento, Ventas, Configuración, Ayuda.
    • Panel principal con fondo: imagen "Tienda_1.png" que se escala proporcionalmente al tamaño de la ventana.
    • Comportamiento del botón cerrar (X): muestra diálogo de confirmación igual que la opción "Salir" del menú.
    • Métodos que abren diálogos: abrirDialogoConsultar(), abrirDialogoModificar(), etc.
    • main crea la ventana en el hilo correcto (SwingUtilities.invokeLater).
  • Conceptos importantes para un novato:
    • Separación de responsabilidades: la ventana solo coordina, no contiene lógica de negocios.
    • Listeners: los item.addActionListener(...) enlazan acciones del UI con métodos.
    • Escalado de imágenes: uso de Graphics.drawImage con cálculo de escala para mantener proporción.

DatosGlobales.java

  • Responsabilidad: Centro de datos y utilidades. Contiene los datos de hasta 5 teléfonos, parámetros de descuento y obsequios, y funciones de venta.
  • Diseño intencional: utiliza variables independientes (marca0, modelo0, ..., marca4, modelo4) en lugar de una lista para mantener el código simple y explícito para principiantes.
  • Métodos clave:
    • inicializarTelefonos() inicializa datos ejemplo.
    • getTelefono(int indice) construye y devuelve un objeto Telefono según el índice.
    • getCantidadTelefonos() indica cuántos teléfonos están definidos.
    • procesarVenta(int indice, int cantidad) calcula descuentos, registra la venta y devuelve una boleta como String.
    • obtenerPorcentajeDescuento(int cantidad) y obtenerObsequio(int cantidad) aplican reglas.
  • Puntos de aprendizaje:
    • Aunque el diseño no usa colecciones, los métodos muestran cómo encapsular lógica centralizada.
    • Para escalar, refactorizar a List<Telefono> es recomendable; este cambio requiere actualizar todos los lugares que usan índices.

Telefono.java

  • Responsabilidad: Modelo de datos que representa un teléfono móvil.
  • Contenido: atributos (marca, modelo, color, procesador, pantalla, memoria, almacenamiento, precio, medidas, peso, tipoPlan, etc.), constructor completo, getters y setters.
  • Puntos para novatos:
    • Separar modelo de UI facilita pruebas y mantenimiento.
    • Usar getters y setters en lugar de exponer campos directamente mantiene encapsulación.

DialogoConsultarTelefono.java

  • Responsabilidad: Mostrar los datos de un teléfono seleccionado (campos de solo lectura).
  • Flujo:
    • Carga modelos desde DatosGlobales en un JComboBox.
    • Al cambiar selección, muestra los datos del Telefono correspondiente en campos no editables.
  • Buenas prácticas simples:
    • Usar JDialog modal para que el usuario complete la tarea antes de volver a la ventana principal.

DialogoListarTelefonos.java

  • Responsabilidad: Generar un reporte con todos los teléfonos y mostrarlo en un JTextArea.
  • Flujo:
    • Botón "Listar" recorre DatosGlobales y construye un texto formateado.
  • Tip para novatos: StringBuilder es eficiente para concatenar texto repetidamente.
  • Actualización (11/12/2025): Se añadió un JComboBox de orden en la parte superior del diálogo para que el usuario elija cómo ordenar el listado. Opciones disponibles:
    • Original (orden por defecto)
    • Precio (Mayor → Menor)
    • Precio (Menor → Mayor)
    • Marca (A → Z) La implementación crea una lista local de Telefono, aplica la ordenación seleccionada con Collections.sort y genera el reporte a partir de la lista ordenada. Esto preserva DatosGlobales sin modificaciones.

DialogoModificarTelefono.java

  • Responsabilidad: Permitir editar los atributos de un teléfono existente.
  • Flujo:
    • Seleccionar modelo, editar campos y guardar.
    • En guardarCambios() se validan (mínimamente) y se actualiza el objeto Telefono en memoria.
  • Riesgo y cómo mitigar:
    • Validar entradas (por ejemplo, que precio sea un número) para evitar excepciones.

DialogoVender.java

  • Responsabilidad: Procesar ventas: seleccionar modelo, indicar cantidad y generar boleta.
  • Flujo:
    • Llama a DatosGlobales.procesarVenta(...) que devuelve la boleta como texto.
    • Actualiza contadores de venta en DatosGlobales.
  • Observación para novatos:
    • La lógica de negocio (cálculo de descuentos y obsequios) está en DatosGlobales, no en el diálogo.

DialogoConfigurarDescuentos.java

  • Responsabilidad: Interfaz para cambiar los porcentajes de descuento usados por DatosGlobales.
  • Flujo:
    • Cargar valores actuales al abrir, permitir editarlos y guardarlos (validar que sean numéricos).

DialogoConfigurarObsequios.java

  • Responsabilidad: Permitir editar los nombres de los obsequios según cantidad.
  • Flujo:
    • Guardar los textos en DatosGlobales.obsequio1/2/3.
  • Mejoras recientes: Ajustado ancho del diálogo y centrado de controles para mejorar la legibilidad del texto completo de los labels sin alterar tamaños de controles.

DialogoAcercaDe.java

  • Responsabilidad: Mostrar información del proyecto y autores.
  • Nota: útil como referencia para usuarios y para reconocer a los autores. El botón "Cerrar" tiene el texto en negrita para mayor énfasis.

Configuración de VS Code para ejecución directa

Para ejecutar el proyecto directamente desde el botón "Run Java" en VS Code, se han configurado los siguientes archivos en el directorio .vscode:

  • .project: Define el proyecto como un proyecto Java de Eclipse.
  • .classpath: Especifica las rutas de fuente y salida (src y bin).
  • launch.json: Configura la ejecución de la clase principal tienda.VentanaPrincipal.
  • settings.json: Establece el directorio de salida de compilación en bin.

Esto permite compilar y ejecutar con un clic desde VS Code, facilitando el desarrollo.

Buenas prácticas y recomendaciones (nivel básico)

  • Mantener la UI separada de la lógica de negocio (como ya se hace con DatosGlobales).
  • Validar siempre las entradas del usuario (ej.: Double.parseDouble en guardarCambios() puede lanzar NumberFormatException).
  • Añadir manejo de errores y mensajes claros para el usuario.
  • Comentar el código con JavaDoc (ya se añadieron comentarios en varias clases).

Sugerencias de mejora (siguientes pasos)

  1. Refactorizar DatosGlobales para usar List<Telefono> o ArrayList<Telefono> para facilitar añadir/eliminar y recorrer.
  2. Añadir pruebas unitarias (JUnit) para DatosGlobales y Telefono (verificar procesarVenta, obtenerPorcentajeDescuento, getTelefono).
  3. Internacionalización (i18n) si la app debe usarse en varios idiomas: mover cadenas a ResourceBundle.
  4. Persistencia: guardar el catálogo en un archivo (JSON, CSV o base de datos embebida) para que los datos sobrevivan al cierre de la aplicación.
  5. Mejorar validaciones en formularios y añadir confirmaciones al modificar o eliminar registros.

Errores y advertencias detectadas durante la revisión

  • Advertencias this-escape: se registran acciones en el getRootPane() antes de terminar la inicialización del objeto. No rompen la ejecución, pero es recomendable mover esos registros al final del constructor.
  • Advertencias serial: se añadieron serialVersionUID a las clases serializables para limpiar warnings.

Listado detallado de advertencias detectadas en la compilación actual:

  • src/tienda/DialogoAcercaDe.java:17 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoConfigurarDescuentos.java:23 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoConfigurarObsequios.java:22 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoConsultarTelefono.java:34 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoListarTelefonos.java:20 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoModificarTelefono.java:35 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/DialogoVender.java:23 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (setDefaultCloseOperation)
  • src/tienda/VentanaPrincipal.java:85 - warning: [this-escape] possible 'this' escape before subclass is fully initialized (crearMenu called in constructor)

Recomendación: si se desea eliminar estas advertencias, puedo mover las llamadas que exponen this (por ejemplo getRootPane().registerKeyboardAction(...) o llamadas que usen this implícitamente) a un método asignarAtajos() y llamarlo al final del constructor de cada diálogo. Esto no cambiaría la funcionalidad, solo reordenaría la inicialización para evitar el "this-escape".

Correcciones implementadas (24/11/2025):

  • ✅ Corregido problema de doble cierre de diálogos: cambio a DO_NOTHING_ON_CLOSE con manejo explícito de windowClosing.
  • ✅ Añadido serialVersionUID a las clases serializables (JDialog/JFrame) para eliminar warnings de serial.
  • ✅ Reparado y rediseñado DialogoAcercaDe (evitando duplicaciones previas) para mostrar título y autores según diseño solicitado.
  • ✅ Restaurado y verificado que la tecla Escape cierre los diálogos mediante registerKeyboardAction.
  • ✅ Añadidos comentarios JavaDoc de clase en los diálogos que carecían de ellos (comentarios didácticos para programadores novatos).
  • ✅ Añadido selector de orden y lógica de ordenación en DialogoListarTelefonos (11/12/2025): permite ordenar por precio desc/asc y por marca alfabéticamente, sin alterar la estructura de datos global.

Conclusión

El proyecto es un buen ejemplo didáctico para aprender conceptos de Java y Swing: separación de UI y modelo, manejo de diálogos modales, gestión de eventos, y organización básica de la lógica de ventas.

He documentado y comentado los módulos principales, proporcionado recomendaciones claras para mejorar la mantenibilidad y escalabilidad, y corregido el error crítico de doble cierre de diálogos. La aplicación es completamente funcional y está lista para uso educativo.

Estado actual (24/11/2025):

  • ✅ Compilación: 0 errores, 8 advertencias no-críticas (advertencias this-escape pendientes)
  • ✅ Funcionalidad: 100% operativa
  • ✅ Documentación: Completa y actualizada
  • ✅ Cierre de diálogos: Funciona correctamente en primer intento
  • ✅ Código comentado: Nivel programador novato

Estado actual (18/12/2025):

  • ✅ Compilación: 0 errores, 8 advertencias no-críticas (advertencias this-escape pendientes)
  • ✅ Funcionalidad: 100% operativa
  • ✅ Documentación: Completa y actualizada
  • ✅ Cierre de diálogos: Funciona correctamente en primer intento
  • ✅ Código comentado: Nivel programador novato
  • ✅ Fondo con imagen escalable en ventana principal
  • ✅ Comportamiento del botón X igual que opción Salir
  • ✅ Configuración de VS Code para ejecución directa
  • ✅ Ajustes de UI en diálogos para mejor legibilidad y centrado

El proyecto está LISTO PARA PRODUCCIÓN EDUCATIVA sin modificaciones adicionales.

Si quieres, continúo con cualquiera de las siguientes tareas:

  • Refactorizar DatosGlobales a List<Telefono>.
  • Crear pruebas unitarias (JUnit) para DatosGlobales y Telefono.
  • Agregar persistencia (guardar datos en archivo o BD).
  • Mejoras de interfaz gráfica (colores, iconos, layouts mejorados).

Cambios recientes (18/12/2025 - Actualización)

  • Edición gráfica en Eclipse: Los diálogos DialogoAcercaDe, DialogoConsultarTelefono y DialogoModificarTelefono han sido modificados para declarar todos los componentes (labels, textfields, botones) como variables de instancia privadas. Esto permite la edición visual directa usando herramientas como Eclipse WindowBuilder, facilitando el mantenimiento y diseño de la interfaz gráfica.
  • Imagen de fondo mejorada: En VentanaPrincipal, la imagen de fondo ahora se escala para cubrir completamente el área de la ventana (sin mantener proporción), y el panelPrincipal se declara como variable de instancia para compatibilidad con editores gráficos.
  • Documentación completa: Se han agregado comentarios Javadoc exhaustivos a todos los métodos que carecían de ellos, incluyendo descripciones detalladas, parámetros (@param) y valores de retorno (@return). Esto mejora la legibilidad y mantenibilidad del código.
  • Compilación verificada: El proyecto se compila exitosamente sin errores, manteniendo toda la funcionalidad existente y las mejoras implementadas.

Cambios recientes (19/12/2025)

  • Botón guardar mejorado: Los botones "Guardar" en los diálogos de modificación y configuración ahora mantienen la ventana abierta después de guardar, permitiendo ajustes continuos y mostrando inmediatamente los cambios realizados.
  • Persistencia de modificaciones: Las modificaciones a teléfonos se guardan correctamente en DatosGlobales y persisten durante la sesión actual, permitiendo ver los cambios al cambiar de teléfono en el combo box.
  • Comentarios actualizados: Los Javadoc de los métodos guardarCambios, guardarDescuentos y guardarObsequios han sido actualizados para reflejar el nuevo comportamiento de mantener la ventana abierta y refrescar los datos.

Generado por el asistente el 19 de diciembre de 2025.