====== 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