02 - La Forja: primera versión funcional
El diseño del paso 01 pasa a Java: La Forja existe y atiende a un solo usuario en la consola. Se usa el repertorio del tema y solo él: variables y constantes, la clase IO, estructuras de selección, bucles, arrays y ya también funciones, con las que nombrar cada acción. Es la versión más humilde del curso: los héroes viven en arrays paralelos y el programa entero en una sola clase — no porque no se pueda hacer mejor, sino porque lo que molesta hoy es la motivación de los pasos que vienen.
1. Qué se pide
La primera versión funcional del gremio:
- Menú que se muestra y se repite hasta que el usuario elige salir, y que solo orquesta: cada opción es una llamada a una función con nombre, y ninguna secuencia de instrucciones vive suelta en el
main. - Registro de héroes con nombre, clase y nivel, con las validaciones decididas en el diseño del paso 01.
- Listado de la plantilla y búsqueda de un héroe por nombre.
- Un límite de plazas: constante con nombre; si el gremio se llena, el registro avisa en vez de corromper datos.
- El estado del gremio (los datos, los contadores, el límite) en variables de clase: toda función lo ve sin pasarlo de mano en mano.
- El poder de combate de un héroe es un cálculo, no una impresión: una función con su entrada y su devolución, que la ficha ya usa.
- Una acción con variante: misma responsabilidad, distinta lista de parámetros — por ejemplo, listar toda la plantilla frente a listar los héroes que superan un nivel mínimo.
- Mensaje conveniente en cada caso: confirmación, aviso, error u opción inválida.
2. Con qué
- Todo lo del tema: variables y constantes,
IO.readln/IO.println, estructuras de selección, bucles, arrays, y cabecera y cuerpo, devolución de valores, ámbito, paso de parámetros, variables de clase y sobrecarga. - Las decisiones del diseño del paso 01 siguen vigentes (datos, validaciones, mensajes); este paso decide además dónde vive cada instrucción y quién puede llamarla.
| Diseño (paso 01) | Herramienta de Java |
|---|---|
pseudocódigo REPETIR…HASTA | el bucle del menú |
| ramas 'SI opcion…' | la estructura de selección |
| guardar los datos de cada héroe | arrays paralelos (nombre, clase, nivel) |
| el límite de plazas que no se repite | constante |
| la acción con nombre del diagrama | función |
| leer / imprimir | IO |
Cada limitación que duela hoy justifica el concepto de un tema futuro: arrays paralelos, clases de juego como números y validación repartida son dolores que esconden pasos. Se escriben funciones porque el tema las trae; no se adelanta nada más: ni objetos, ni colecciones, ni excepciones.
3. Decisiones tuyas
- ¿Cómo representas cada héroe con solo arrays? Sus datos tienen que viajar juntos y en su posición correcta: si la correspondencia entre posiciones se rompe, el héroe queda corrompido.
- ¿Cuántas funciones necesitas y cómo se llaman? Un nombre dice lo que hace la función, y la función hace solo eso.
- ¿Qué pasa por parámetros y qué se lee de las variables de clase? Elige un criterio y sostenlo: mezclar ambos caminos al azar es el desorden que el tema viene a evitar.
- ¿Qué funciones devuelven un valor y qué devuelven: un cálculo, un resultado de búsqueda, un estado?
- ¿Dónde vive el cálculo del poder? Piensa que en el paso siguiente la ficha y los informes lo van a necesitar por separado.
- ¿Cómo conviertes lo que teclea el usuario para la clase (
1,2,3…) en algo con significado para el programa? Que ese lugar sea uno solo: en el 03 la conversión tendrá que salir a otra parte. - ¿Cómo decides si un nombre está en la plantilla? ¿Y qué quiere decir “encontrado” si hay varios héroes con nombres parecidos?
- ¿Cómo sabes cerrar cada bucle y contarlo: por posición, por contador de usados…?
- ¿Existe alguna función con estructura anidada que pida recursividad? Si la respuesta es no, se argumenta en el propio código y queda para los ejercicios del tema.
4. Comprobación
- El menú se repite y solo sale con su opción; una opción rara no tumba el programa: avisa y vuelve. El
maincabe en un pantallazo: menú y llamadas. - Cada función hace una cosa y cabe en la pantalla; ninguna mezcla menú con cálculo, ni cálculo con impresión: la que calcula devuelve el valor y quien llama decide qué hacer con él.
- Registrar un héroe y después listar y buscar muestra sus datos juntos y en el lugar correcto; en búsquedas fallidas el aviso es el decidido en el diseño, y el listado en vacío no muestra basura.
- Las dos variantes de la acción sobrecargada se llaman igual y se distinguen por su lista de parámetros, y cualquiera de las dos se invoca sin tocar el resto.
- Un registro con el gremio lleno avisa de que no hay plazas — y las plazas ocupadas no se pierden ni se mezclan con el siguiente intento.
- Una clase o un nivel sin sentido avisan, como se decidió en el paso 01; escribir letras donde van números tumba la app: se anota en los pendientes, porque arreglarlo aún no se sabe.
- La despedida se muestra solo al salir.
5. Pendientes
- Los arrays paralelos se desincronizan a la primera, y la clase sigue siendo un número que solo entiende el
switch→ objetos y enum (03). - La validación vive repartida por el código y teclear letras en el nivel tumba el programa (
NumberFormatException) → punto único de control y excepciones (05). - Cuando la capacidad se agota no hay forma de crecer → colecciones (04).