08 - La Forja: en capas
El programa principal mezcla menú, reglas de negocio y estado interno, y pensar en “cambiar la consola por una API” implica rehacerlo todo. El paso aplica el tema: arquitectura por capas, DTO con Java records, mapeadores e inyección de dependencias (IoC manual).
1. Qué se pide
- El proyecto se reparte en las tres capas — presentación, negocio y persistencia —, cada una en su paquete, sobre el modelo compartido:
- la consola solo presenta: menú, lectura y escritura; nada de reglas ni de acceso directo a los datos.
- el negocio concentra las reglas: registrar, equipar, informes, cálculo de poder;
- la persistencia guarda y consulta héroes e ítems (aún en memoria).
- Las reglas de comunicación del tema se cumplen: flujo en una dirección, no se salta capas y de abajo no se llama a arriba.
- Los datos que cruzan la frontera del negocio viajan en DTO records: entrada sin lo que la app asigna sola, salida con lo ya calculado. El modelo del gremio y lo que ve la consola no son el mismo idioma.
- La traducción entre ambos mundos tiene su lugar: mapeadores, no puntos sueltos.
- Cada capa recibe sus dependencias por constructor, y el ensamblado ocurre en un único punto: el
main. - Todas las pruebas anteriores pasan enteras.
2. Con qué
- Todo lo del tema: capas y sus reglas, DTO con records, mapeadores, e inyección de dependencias manual (programar contra interfaces, recibir por constructor, un único punto de ensamblado).
3. Decisiones tuyas
- ¿Cómo se llaman las capas en paquetes y clases? Usa nombres que digan responsabilidad: qué hace cada una, no “servicio del servicio”.
- ¿Qué interfaces fijan las capas (negocio y persistencia) y qué promete cada una? El estilo del tema: programa contra lo abstracto, ensambla lo concreto.
- ¿Qué son “los datos mínimos” de un héroe para crearlo? ¿Y los de la ficha? Son los campos de tus DTO: ¿qué viaja en la salida que quien consulta no sabría calcular por sí solo, y qué queda solo en el dominio?
- ¿Qué hace el mapeador con lo que la consola no necesita (identificadores internos, datos derivados)?
- ¿Quién es responsable del estado de la plantilla y de la forja? Deja de ser variables estáticas: la capa de persistencia mantiene los datos — decisión: memoria por dentro, interfaz de repositorio por fuera.
- ¿Dónde ensamblas las dependencias? El punto único es ahora el
main.
4. Comprobación
- La consola no toca colecciones ni reglas: solo llama al negocio, que es la única puerta.
- De abajo no sale arriba: ninguna clase de negocio o persist imprime nada.
- Cambiar el almacenamiento en memoria por otro (fichero, colección distinta) no toca la capa de negocio: solo la implementación del repositorio.
- Las fichas impresas vienen de DTO: el formato del “¡Aquí está tu ficha!” es cosa de la consola; el cálculo ya lo hizo el negocio.
- El ensamblado está en un punto único y todas las dependencias se inyectan por constructor: ninguna capa se instancia sus propias dependencias.
- Las pruebas de los pasos anteriores pasan enteras.
5. Pendientes
- La presentación sigue siendo consola: un único usuario en el mismo ordenador → contrato REST diseñado a mano (09) y su implementación (10).
- El repositorio en memoria guarda todo en vivo y luego será compartido… ¿por quién? → hilos (11).