Este proyecto demuestra los conceptos fundamentales de la programacion modular utilizando un enfoque estructurado/procedural en Java.
La simulacion de una maquina expendedora es un ejemplo perfecto para ilustrar la programacion modular. El proyecto esta dividido en tres modulos claramente definidos:
| Modulo | Responsabilidad |
|---|---|
MaquinaExpendedora |
Programa principal que coordina los modulos y maneja la interaccion con el usuario |
ModuloInventario |
Gestiona los productos, sus precios y disponibilidad |
ModuloMonedero |
Gestiona todo lo relacionado con el dinero (insercion, pagos y cambio) |
.
├── MaquinaExpendedora.java # Programa principal
├── ModuloInventario.java # Modulo para gestion de productos
├── ModuloMonedero.java # Modulo para gestion del dinero
└── README.md # Este archivo
Un modulo es una unidad independiente de codigo que agrupa variables y funciones relacionadas con una tarea especifica.
Nota: Los modulos son como "librerias" especializadas, cada una con su propio ambito de responsabilidad claramente definido. En Java, utilizamos clases como contenedores de funciones y variables estaticas.
La ocultacion de informacion es un principio que establece que los datos internos de un modulo deben estar protegidos del acceso directo desde fuera del modulo.
En nuestro ejemplo:
- Las variables
stockProductos,preciosProductosynombresProductosenModuloInventariosonprivate static. - Las variables
dineroInsertadoydineroTotalenModuloMonederosonprivate static.
// ERROR: No compila, acceso denegado
ModuloInventario.stockProductos[0] = -100;
ModuloMonedero.dineroTotal = 999999;
// CORRECTO: usa las funciones publicas que validan la operacion
ModuloInventario.dispensarProducto(0);
ModuloMonedero.insertarDinero(100);El bajo acoplamiento significa que los modulos dependen lo menos posible unos de otros.
En nuestro ejemplo:
ModuloInventariono sabe nada sobre como se gestiona el dinero.ModuloMonederono sabe nada sobre que productos existen ni sus precios.- El programa principal conoce la interfaz publica de ambos modulos pero no sus detalles internos.
La alta cohesion significa que un modulo tiene un proposito unico y bien definido.
En nuestro ejemplo:
ModuloInventariosolo se ocupa de la gestion de productos.ModuloMonederosolo se ocupa de la gestion del dinero.
| Caracteristica | Descripcion |
|---|---|
| Sin instanciacion | No necesitamos crear objetos con new ModuloInventario() |
| Datos compartidos | Las variables static existen una unica vez en memoria |
| Simulacion de modulos | Los metodos static nos permiten simular modulos independientes |
Advertencia: No podemos tener multiples maquinas expendedoras independientes con estados diferentes, porque todas compartirian las mismas variables
static. Para eso necesitariamos POO.
| Beneficio | Descripcion |
|---|---|
| Mantenibilidad | Es mas facil mantener codigo organizado en modulos |
| Reutilizacion | Los modulos bien disenados pueden reutilizarse |
| Facilidad de prueba | Es mas facil probar un modulo aisladamente |
| Division del trabajo | Diferentes programadores pueden trabajar en diferentes modulos |
| Gestion de complejidad | Ayuda a manejar sistemas complejos dividiendolos en partes mas pequenas |
- Java Development Kit (JDK) instalado
javac MaquinaExpendedora.java ModuloInventario.java ModuloMonedero.javajava MaquinaExpendedora- Ver productos disponibles: Muestra todos los productos, sus precios y stock
- Insertar dinero: Te permite agregar dinero a la maquina
- Comprar producto: Selecciona un producto para comprarlo
- Solicitar cambio: Recupera el dinero insertado
- Salir: Finaliza el programa
- Responsabilidad: Gestion de productos
- Variables:
nombresProductos,stockProductos,preciosProductos - Metodos principales:
mostrarProductos(),verificarStock(),dispensarProducto(),consultarPrecio()
- Responsabilidad: Gestion del dinero
- Variables:
dineroInsertado,dineroTotal - Metodos principales:
insertarDinero(),procesarPago(),darCambio(),verificarDineroSuficiente()
- Responsabilidad: Coordinar los modulos y gestionar la interfaz de usuario
- Funcionamiento: Muestra el menu, recibe las opciones del usuario y llama a los metodos adecuados de cada modulo