====== 00 - La Forja: la práctica del curso ======
Durante todo el curso construiremos **La Forja**, una única aplicación que evoluciona con nosotros:
* Al principio es una **aplicación de consola** para gestionar el **Gremio de Héroes**: registrar héroes, consultar su ficha y gestionar el inventario de la forja.
* Cada tema del módulo aporta un concepto nuevo que la aplicación necesita, y ese concepto se aplica directamente sobre ella.
* Al final del curso, La Forja es una **API REST** con **Spring Boot** y **login con tokens**.
===== 1. Cómo funciona la práctica =====
* Tras explicar cada tema en clase, se abre la versión actual de La Forja y se presenta el paso nuevo: no es un tutorial, es un **encargo**.
* Cada paso define tres cosas: el **problema** que sufre la versión anterior, la **funcionalidad** que se exige y las **pruebas** que deben pasar.
* El paso **no trae diseño ni código resuelto**: cómo se agrupan los datos, cómo se nombran las funciones, qué estructura de datos se elige, cómo se organizan los paquetes... son **decisiones de cada alumno**, razonadas y defendibles.
* Solo se da como fijo lo externo: los contratos que no se diseñan (el formato del JSON de configuración, el intercambio de tokens, el HTTP).
* Cada paso termina con una lista de **pruebas**: si las pasa, la versión cumple. Lo que sigue doliendo es la motivación del paso siguiente.
* Cada práctica tiene una **solución de referencia**: se publica después del encargo, y lo valioso no está en acertar el diseño a la primera, sino en comparar las decisiones razonadas de cada uno con las de la solución.
@startuml
!theme cerulean
skinparam backgroundColor transparent
skinparam shadowing false
skinparam ArrowThickness 1
skinparam classAttributeIconSize 0
skinparam class {
BackgroundColor #FEFEFE
BorderColor #344883
ArrowColor #344883
FontColor #343A40
}
skinparam classAttributeFontColor #343A40
skinparam stereotypeCBackgroundColor #344883
skinparam stereotypeCBorderColor #273768
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam package {
BackgroundColor transparent
BorderColor #344883
FontColor #343A40
}
skinparam ArrowColor #344883
skinparam participant {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam actor {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam sequence {
ArrowColor #344883
LifeLineBorderColor #94A3B8
GroupBorderColor #344883
GroupBackgroundColor #E9EDF7
}
skinparam note {
BackgroundColor #FEF9C3
BorderColor #B6C2DE
FontColor #343A40
}
skinparam activity {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
StartColor #344883
EndColor #344883
DiamondBackgroundColor #FEFEFE
DiamondBorderColor #344883
DiamondFontColor #343A40
}
skinparam component {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam database {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam node {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam cloud {
BackgroundColor transparent
BorderColor #344883
FontColor #344883
}
skinparam rectangle {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam state {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
skinparam usecase {
BackgroundColor #FEFEFE
BorderColor #344883
FontColor #343A40
}
start
:Se explica el tema en clase;
if (¿la versión actual "sufre" un problema?) then (sí)
:El paso lo plantea como encargo;
:El concepto nuevo del tema es la herramienta;
else (no)
:Se practica el concepto con lo ya construido;
endif
:El alumno decide el diseño e implementa;
if (¿pasan las pruebas del paso?) then (sí)
:Queda una versión funcional nueva;
else (no)
:Se revisa y se vuelve a comprobar;
endif
stop
@enduml
===== 2. El arco de la aplicación =====
^ Tema ^ Paso de La Forja ^ Herramientas del tema ^
| ''01'' | La app existe antes que el código: diseñar el menú y el registro | IPO, diagramas con **PlantUML**, pseudocódigo |
| ''02'' | Primera versión funcional: arrays paralelos, funciones y estado compartido | Variables, **IO**, selección, bucles, arrays, funciones, sobrecarga |
| ''03'' | El modelo del gremio: objetos, jerarquía de héroes y forja | Clases, encapsulación, **enum**, herencia, polimorfismo, ''abstract'', interfaces, ''equals''/''hashCode'' |
| ''04'' | La plantilla y la forja tienen techo: hay que quitarlo | ''List'', ''Set'', ''Map'', ''Iterator'', ''Comparable'' |
| ''05'' | La app tumba ante datos malos: reglas que no se rompen | Excepciones propias, ''try''/''catch'', fichero de configuración |
| ''06'' | Los informes del gremio, sin bucles a mano | **Stream**, lambdas, ''Optional'' |
| ''07'' | Un montón de clases sin orden ni gestor | Paquetes, **Maven**, librería externa (**Gson**) |
| ''08'' | El negocio mezclado con la consola: separar en capas | Capas, **DTO** records, mapeadores, inyección manual |
| ''09'' | El contrato de la API, en papel | Endpoints, métodos **HTTP**, JSON, códigos de estado |
| ''10'' | La API en **Spring Boot** | ''@RestController'', ''ResponseEntity'', manejador global, logs |
| ''11'' | Peticiones que llegan a la vez | Pool de hilos de **Tomcat**, estado compartido |
| ''12'' | Acceso identificado al gremio | **Tokens opacos**, roles, filtro Servlet, ''Principal'' |
===== 3. Nota de material =====
La práctica es material aparte de los temas de ''temario/'': no sustituye a las explicaciones ni los ejercicios de cada tema. Los pasos se redactan en sintaxis **DokuWiki** y se publican junto a los temas de la web.
Cada paso es corto y no vuelve a explicar los conceptos del tema: describe el problema, los requisitos y las pruebas; el diseño y el código los aport