|
1 | | -<!-- TODO --> |
| 1 | +<h1 align="center"> |
| 2 | + Trabajo Práctico de Java [2025] |
| 3 | +</h1> |
| 4 | + |
| 5 | +<p align="center"> |
| 6 | + <strong>Repositorio para el trabajo práctico del curso de Paradigmas de Programación</strong> |
| 7 | + <br> |
| 8 | + <strong>- <a href="https://www.unlam.edu.ar/">UNLaM</a> (Universidad Nacional de La Matanza) -</strong> |
| 9 | +</p> |
| 10 | + |
| 11 | +<p align="center"> |
| 12 | + <a href="#summary">Resumen</a> • |
| 13 | + <a href="#features">Características</a> • |
| 14 | + <a href="#installation">Instalación</a> • |
| 15 | + <a href="#installation">Diagramas</a> • |
| 16 | + <a href="#team-workflow">Flujo de trabajo en equipo</a> • |
| 17 | + <a href="#development-team">Equipo de desarrollo</a> |
| 18 | + <br> |
| 19 | + <a href="#additional-material">Material adicional</a> • |
| 20 | + <a href="#license">Licencia</a> • |
| 21 | + <a href="#acknowledgments">Agradecimientos</a> |
| 22 | +</p> |
| 23 | + |
| 24 | +<p align="center"> |
| 25 | + <a href="../../../README.md">[ Versión en inglés ]</a> |
| 26 | +</p> |
| 27 | + |
| 28 | +<p align="center"> |
| 29 | + <a href="#"> <!-- TODO --> |
| 30 | + <img src="../../assets/preview.png" width="800" alt="Vista previa"> |
| 31 | + </a> |
| 32 | +</p> |
| 33 | + |
| 34 | +<p align="center"> |
| 35 | + <a href="#" target="_blank">(video de demostración)</a> <!-- TODO --> |
| 36 | +</p> |
| 37 | + |
| 38 | +## Resumen |
| 39 | + |
| 40 | +Este repositorio contiene el trabajo práctico para el curso de Paradigmas de Programación en la [Universidad Nacional de La Matanza (UNLaM)](https://www.unlam.edu.ar/). El trabajo práctico consiste en realizar un sistema de crafteo en Java y probarlo con [JUnit 5](https://junit.org/junit5/). |
| 41 | + |
| 42 | +## Características |
| 43 | + |
| 44 | +- Almacenamiento local de registros |
| 45 | +- Colecciones |
| 46 | +- Commits siguiendo el estándar [Conventional Commits](https://www.conventionalcommits.org/es/v1.0.0/) |
| 47 | +- Control de entradas mediante validaciones |
| 48 | +- Convenciones y estándares de código |
| 49 | +- Despliegue de versiones |
| 50 | +- Documentación del código usando la sintaxis de [JavaDoc](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html) |
| 51 | +- Lectura e interpretación de archivos |
| 52 | +- Planificación de arquitectura |
| 53 | +- Planificación del flujo de trabajo en equipo (ramas, etiquetas y versiones) |
| 54 | +- Pruebas E2E con [JUnit 5](https://junit.org/junit5/) |
| 55 | +- Pruebas unitarias con [JUnit 5](https://junit.org/junit5/) |
| 56 | + |
| 57 | +## Instalación |
| 58 | + |
| 59 | +1. Clona el repositorio en tu dispositivo. |
| 60 | +2. Instala [Java](https://www.java.com/en/download/) y [Prolog](https://www.swi-prolog.org/download/stable) (marca la opción `Add swipl to the system PATH` durante la instalación). |
| 61 | +3. Instala [Eclipse IDE for Java developers](https://www.eclipse.org/downloads/packages/). |
| 62 | +4. Abre el repositorio clonado con Eclipse IDE. |
| 63 | +5. Luego, haz clic derecho sobre el archivo [Main.java](../../../src/Main.java) y selecciona `Run As` -> `Java Application`. |
| 64 | +6. Eso es todo, disfruta del sistema de crafteo a través de la interacción con la consola. |
| 65 | + |
| 66 | +<details> |
| 67 | +<summary>¿Cómo puedo ejecutar todas las pruebas JUnit?</summary> |
| 68 | + |
| 69 | +Si deseas ejecutar todas las pruebas JUnit, debes hacer clic derecho sobre el proyecto dentro del `Package explorer` de Eclipse IDE, y seleccionar `Run as` -> `JUnit Test`. Eso es todo, Eclipse IDE comenzará a ejecutar todas las pruebas. |
| 70 | + |
| 71 | +</details> |
| 72 | + |
| 73 | +<details> |
| 74 | +<summary>¿Cómo puedo cambiar el inventario?</summary> |
| 75 | + |
| 76 | +Para cambiar los ítems del inventario, debes actualizar el archivo [inventory.json](../../../src/assets/inventory.json) con los ítems deseados. |
| 77 | + |
| 78 | +> Es importante seguir la misma estructura que los originales, y estos deben estar definidos dentro del archivo [recipes.json](../../../src/assets/recipes.json). |
| 79 | +
|
| 80 | +</details> |
| 81 | + |
| 82 | +<details> |
| 83 | +<summary>¿Cómo puedo cambiar la lista de ítems disponibles para craftear?</summary> |
| 84 | + |
| 85 | +Para cambiar la lista de ítems disponibles para craftear, debes actualizar el archivo [recipes.json](../../../src/assets/recipes.json) con los nuevos ítems crafteables. |
| 86 | + |
| 87 | +> Es importante seguir la misma estructura que los originales. |
| 88 | +
|
| 89 | +</details> |
| 90 | + |
| 91 | +### Problemas conocidos |
| 92 | + |
| 93 | +| Problema | Solución | |
| 94 | +| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
| 95 | +| Prolog no puede encontrar recursos del sistema | _En Eclipse IDE, ve a la pestaña `File` y selecciona la opción `Import`. Luego, debes buscar `Launch configurations`, seleccionarla y presionar `Next`. Después, busca el directorio del proyecto, selecciona los archivos `Java-Practical-Work-2025`, `Main`, y `PrologServiceTests` y marca la opción `Overwrite existing launch configurations without warning.`. Finalmente, presiona `Finish` para cargar tu instancia local de Prolog. Si esto no funcionó, revisa el valor de cada variable de entorno dentro de la pestaña `Environment` en cada configuración de ejecución de `Java-Practical-Work-2025`, `Main`, y `PrologServiceTests`, ya que deben apuntar a tu directorio local de Prolog._ | |
| 96 | + |
| 97 | +## Diagramas |
| 98 | + |
| 99 | +<details> |
| 100 | +<summary>Diagrama de clases</summary> |
| 101 | + |
| 102 | +```mermaid |
| 103 | +--- |
| 104 | +config: |
| 105 | + class: |
| 106 | + hideEmptyMembersBox: true |
| 107 | +
|
| 108 | + theme: redux |
| 109 | + look: neo |
| 110 | + layout: elk |
| 111 | +--- |
| 112 | +classDiagram |
| 113 | +direction TB |
| 114 | +
|
| 115 | + class Menu { |
| 116 | + -Scanner scanner |
| 117 | + -Inventory inventory |
| 118 | + -ItemsRepository itemsRepository |
| 119 | + -Item itemToCraft |
| 120 | + -int quantityToCraft |
| 121 | + -CraftingSystem craftingSystem |
| 122 | + -PrologService prologService |
| 123 | +
|
| 124 | + -void setItemToCraft() |
| 125 | + +void init() |
| 126 | + -int requestOperation(String item, int quantity) |
| 127 | + -int requestBranch() |
| 128 | + -int requestRecipeToCraft() |
| 129 | + -String requestPrologPath() |
| 130 | + -String requestInventorySavePath() |
| 131 | + -void showCraftableItemsByProlog() |
| 132 | + -void showIngredientsCollection(Collection~List~Ingredient~~ collection, Function~Integer, String~ onEmptyList) |
| 133 | + } |
| 134 | +
|
| 135 | + Menu "1" --o "1" Inventory : Has a reference to |
| 136 | + Menu "1" --o "1" ItemsRepository : Has a reference to |
| 137 | + Menu "1" --o "1" Item : Has |
| 138 | + Menu "1" --o "1" CraftingSystem : Has |
| 139 | + Menu "1" --o "1" PrologService : Has a reference to |
| 140 | +
|
| 141 | + class ItemsRepository { |
| 142 | + -HashMap~String, Item~ items |
| 143 | +
|
| 144 | + +HashMap~String, Item~ getItems() |
| 145 | + +HashMap~String, Item~ getCraftableItems() |
| 146 | + +Item getItem(String name) |
| 147 | + +static ItemsRepository loadFromJSON(String path) |
| 148 | + +String toString(String itemMarkers[], int lPadding) |
| 149 | + } |
| 150 | +
|
| 151 | + class PrologService { |
| 152 | + -String baseItemFactName |
| 153 | + -String ingredientFactName |
| 154 | + -String itemInInventoryFactName |
| 155 | + -ItemsRepository itemsRepository |
| 156 | + -Inventory inventory |
| 157 | +
|
| 158 | + +HashMap~Item, Integer~ craftableItems() |
| 159 | + +void toFile(String path) |
| 160 | + -void toFile(FileWriter fWriter) |
| 161 | + -String toProlog(ItemsRepository itemsRepository) |
| 162 | + -String toProlog(Inventory inventory) |
| 163 | + -String utilityRules() |
| 164 | + } |
| 165 | +
|
| 166 | + class Item { |
| 167 | + -String name |
| 168 | + -List~Recipe~ recipes |
| 169 | +
|
| 170 | + +String getName() |
| 171 | + +List~Recipe~ getRecipes() |
| 172 | + +boolean isBase() |
| 173 | + } |
| 174 | +
|
| 175 | + class Recipe { |
| 176 | + -Item craftingTable |
| 177 | + -List~Ingredient~ ingredients |
| 178 | + -int timeToCraftInMilliseconds |
| 179 | + -int quantityToCraft |
| 180 | +
|
| 181 | + +Item getCraftingTable() |
| 182 | + +List~Item~ getIngredients() |
| 183 | + +int getTimeToCraftInMilliseconds() |
| 184 | + +int getQuantityToCraft() |
| 185 | + +List~Item~ getBaseIngredients() |
| 186 | + +boolean needsCraftingTable() |
| 187 | + +void setCraftingTable(Item craftingTable) |
| 188 | + +void setIngredients(List~Ingredient~ ingredients) |
| 189 | + } |
| 190 | +
|
| 191 | + class CraftedItem { |
| 192 | + -ZonedDateTime date |
| 193 | + -Recipe usedRecipe |
| 194 | + -int quantityCrafted |
| 195 | + -int craftingTimeInMilliseconds |
| 196 | +
|
| 197 | + +ZonedDateTime getDate() |
| 198 | + +Recipe getUsedRecipe() |
| 199 | + +int getQuantityCrafted() |
| 200 | + +int getCraftingTimeInMilliseconds() |
| 201 | + } |
| 202 | +
|
| 203 | + class Inventory { |
| 204 | + -HashMap~Item, Integer~ items |
| 205 | +
|
| 206 | + +HashMap~Item, Integer~ getItems() |
| 207 | + +Item getItemQuantity(Item item) |
| 208 | + +void addItem(Item item, int quantity) |
| 209 | + +void removeItem(Item item, int quantity) |
| 210 | + +void storeOnJSON(String path) |
| 211 | + +static Inventory loadFromJSON(String path) |
| 212 | + +String toString(String itemMarker, int lPadding) |
| 213 | + } |
| 214 | +
|
| 215 | + class Ingredient { |
| 216 | + -Item item |
| 217 | + -int quantity |
| 218 | +
|
| 219 | + +Item getItem() |
| 220 | + +int getQuantity() |
| 221 | + +String toString(String itemMarker, int lPadding) |
| 222 | + } |
| 223 | +
|
| 224 | + class CraftingSystem { |
| 225 | + -Item itemToCraft |
| 226 | + -int quantityToCraft |
| 227 | + -Inventory inventory |
| 228 | + -CraftingHistory history |
| 229 | +
|
| 230 | + +List~CraftedItem~ getCraftedItems() |
| 231 | + +int getCraftableUnits() |
| 232 | + -int getCraftableUnits(Recipe recipe) |
| 233 | + +HashMap~Recipe, List~Ingredient~~ getMissingIngredients() |
| 234 | + +HashMap~Recipe, List~Ingredient~~ getMissingBaseIngredients(int branch) |
| 235 | + -HashMap~Recipe, List~Ingredient~~ getMissingIngredients(HashMap~Recipe, List~Ingredient~~ recipes) |
| 236 | + +HashMap~Recipe, List~Ingredient~~ getRequiredIngredients() |
| 237 | + +HashMap~Recipe, List~Ingredient~~ getRequiredBaseIngredients(int branch) |
| 238 | + -List~Ingredient~ getBaseIngredientsRecursive(Recipe recipe, int totalToCraft, int branch, Set~Item~ processedCraftingTables) |
| 239 | + +boolean canCraft() |
| 240 | + +void setItemToCraft(Item item, int quantity) |
| 241 | + +CraftedItem craftItem(int recipe) |
| 242 | + +CraftedItem undoLastCraft() |
| 243 | + } |
| 244 | +
|
| 245 | + class CraftingHistory { |
| 246 | + -List~CraftedItem~ items |
| 247 | +
|
| 248 | + +List~CraftedItem~ getItems() |
| 249 | + +CraftedItem getLastItem() |
| 250 | + +void addItem(Item item, Recipe usedRecipe) |
| 251 | + +CraftedItem removeLastItem() |
| 252 | + } |
| 253 | +
|
| 254 | + ItemsRepository "1" --o "0...*" Item : Has |
| 255 | +
|
| 256 | + PrologService "1" --o "1" Inventory : Has a reference to |
| 257 | + PrologService "1" --o "1" ItemsRepository : Has a reference to |
| 258 | +
|
| 259 | + Item "1" --o "0...*" Recipe : Has |
| 260 | +
|
| 261 | + Recipe "1" --o "1...*" Ingredient : Has |
| 262 | + Recipe "1" --o "0...1" Item : Has a reference to |
| 263 | +
|
| 264 | + CraftedItem --|> Item : Inherits from |
| 265 | +
|
| 266 | + Inventory "1" --o "0...*" Item : Has references to |
| 267 | +
|
| 268 | + CraftingSystem "1*" --o "0..." Item : Has references to |
| 269 | + CraftingSystem "1" --o "1" Inventory : Has a reference to |
| 270 | + CraftingSystem "1" --* "1" CraftingHistory : Has |
| 271 | +
|
| 272 | + CraftingHistory "1" --o "0...*" CraftedItem : Has |
| 273 | +``` |
| 274 | + |
| 275 | +</details> |
| 276 | + |
| 277 | +> [!NOTE] |
| 278 | +> Los diagramas fueron desarrollados desde cero como parte de los informes preliminares del proyecto. |
| 279 | +
|
| 280 | +## Flujo de trabajo en equipo |
| 281 | + |
| 282 | +```mermaid |
| 283 | +--- |
| 284 | +config: |
| 285 | + logLevel: debug |
| 286 | + theme: base |
| 287 | + gitGraph: |
| 288 | + showBranches: true |
| 289 | + showCommitLabel: true |
| 290 | + mainBranchName: Master |
| 291 | + parallelCommits: true |
| 292 | +--- |
| 293 | +gitGraph: |
| 294 | + commit |
| 295 | + commit tag: "v0.0.1" |
| 296 | + branch "Aguilera Emanuel" |
| 297 | + commit |
| 298 | + commit |
| 299 | + checkout Master |
| 300 | + branch "De Marco Juan" |
| 301 | + commit |
| 302 | + commit |
| 303 | + checkout Master |
| 304 | + branch "Hoz Lucas" |
| 305 | + commit |
| 306 | + commit |
| 307 | + checkout Master |
| 308 | + branch "Rueda Olarte Joel" |
| 309 | + commit |
| 310 | + commit |
| 311 | + checkout Master |
| 312 | + branch "Maudet Alejandro" |
| 313 | + commit |
| 314 | + commit |
| 315 | + checkout Master |
| 316 | + branch "Monges Omar" |
| 317 | + commit |
| 318 | + commit |
| 319 | + checkout Master |
| 320 | + merge "De Marco Juan" |
| 321 | + merge "Aguilera Emanuel" |
| 322 | + merge "Rueda Olarte Joel" |
| 323 | + merge "Maudet Alejandro" |
| 324 | + merge "Hoz Lucas" |
| 325 | + merge "Monges Omar" tag: "v1.0.0" |
| 326 | +``` |
| 327 | + |
| 328 | +### Etiquetas |
| 329 | + |
| 330 | +- `vMAJOR.MINOR.PATCH`: Esta etiqueta indica una [versión](https://github.com/hozlucas28/Java-Practical-Work-2025/releases) del trabajo práctico siguiendo [Semantic Versioning](https://semver.org/), y solo estará presente en los commits de la rama `Master`. |
| 331 | + |
| 332 | +### Ramas |
| 333 | + |
| 334 | +- `Master`: Rama que contiene las versiones de desarrollo del trabajo práctico, donde los miembros del equipo introducirán nuevos cambios (commits). |
| 335 | + |
| 336 | +> [!IMPORTANT] |
| 337 | +> Las versiones estables solo están disponibles como [releases](https://github.com/hozlucas28/Java-Practical-Work-2025/releases). |
| 338 | +
|
| 339 | +> [!NOTE] |
| 340 | +> Las demás ramas son ficticias y representan las contribuciones individuales de cada miembro a la rama `Master`. |
| 341 | +
|
| 342 | +## Equipo de desarrollo |
| 343 | + |
| 344 | +- [Aguilera Emanuel](https://github.com/EmaaAg) |
| 345 | +- [Hoz Lucas](https://github.com/hozlucas28) |
| 346 | +- [De Marco Juan](https://github.com/juDemarco) |
| 347 | +- [Maudet Alejandro](https://github.com/Mabbdet) |
| 348 | +- [Monges Omar](https://github.com/Omar-Monges) |
| 349 | +- [Rueda Olarte Joel](https://github.com/joelalexisrueda) |
| 350 | + |
| 351 | +## Material adicional |
| 352 | + |
| 353 | +- [Informe del trabajo práctico](../../assets/report.pdf) |
| 354 | +- [Requerimientos del trabajo práctico](./requirements.md) |
| 355 | + |
| 356 | +## Licencia |
| 357 | + |
| 358 | +Este repositorio está bajo la [Licencia MIT](./LICENSE). Para más información sobre lo que está permitido con el contenido de este repositorio, visita [choosealicense.com](https://choosealicense.com/licenses/). |
| 359 | + |
| 360 | +## Agradecimientos |
| 361 | + |
| 362 | +Queremos agradecer a los docentes del curso de Paradigmas de Programación de la [UNLaM](https://www.unlam.edu.ar/) por su apoyo y guía. |
0 commit comments