space-invader-game-java - Proyecto Patrones.
Tabla de contenido
Descripción
La finalidad de este proyeto es aplicar patrones de diseño de softwar a un codigo ya existente,
implementando las mejores practicas para pasar de un código poco mantenible y poco escalable
a un codigo facil de mantener y de escalar.
Patrones implementados
A continuación se relacionan los patrones implementados:
Patrones Creacionales
- Patron Singleton: puede ser beneficioso porque garantiza que solo se renderizará una instancia de cada pantalla en la aplicación, lo que puede mejorar el rendimiento, significa que no es necesario volver a crear la pantalla desde cero cada vez que se solicita, lo que puede ahorrar tiempo de procesamiento y mejorar el rendimiento general de la aplicación.
![Singleton.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2FSingleton.png)
- Patron Builder: Builder permite construir objetos complejos de forma mas legible
![builder.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fbuilder.png)
- Patron Factory Method: Este patron fue implementado para poder crear enemigos
Patrones Estructurales
- Facade: El patron facade (fachada) fue implementado para abstraer la inicialización de todos los hilos del juego.
![facade-class.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Ffacade-class.png)
- Proxy: Se implemento el patron proxy para hacer un filtrado entre los eventos emitidos por el usuario desde el Teclado, con el fin de alertar sobre acciones que no se pueden realizar dentro del juego.
![proxy-class.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fproxy-class.png)
Patrones Comportamentales
-
Strategy: permite que el usuario pueda cambiar la forma en que se comparan los valores y se ordenan en tiempo de ejecución. Esto significa que si los requisitos cambian, el usuario puede simplemente cambiar el algoritmo de comparación y ordenación en lugar de tener que modificar directamente el código.
![Strategy.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2FStrategy.png)
-
Command: Space Invader tiene diferentes comandos, el patron comando permite desacoplar estos comandos para que puedan ser invocados desde diferentes componentes (Eventos de teclado, Botones, etc).
![command-class.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fcommand-class.png)
Patrones de interaccion
-
Hover Tools: Mensaje de ayuda que se muestra al momento de pasar el cursor sobre un elemento. Adicional a ello se observa un cambio de cursor sobre el menu al momento de pasar el cursos sobre los elementos.
![hover-pattern.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fhover-pattern.png)
-
Prominent "DONE" Button: Boton de acción como aceptar, confirmar, procesar que sobre salga por encima de los demas para invitar al usuario a hacer click
![prominent-button.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fprominent-button.png)
-
Input Prompt: Placeholder que brinda una ayuda visual al usuario para ingresar un texto en un campo tipo input.
![prominent-button.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fprominent-button.png)
-
Titled Section: Titulo que sobre sale sobre los otros elementos.
![title-pattern.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Ftitle-pattern.png)
Antipatrones
En el código original se identificaron los siguientes Antipatrones:
- The blob (mancha):
- Clase: InterfazSpaceInvaders objeto con muchas responsabilidades, se encarga de la interfaz gráfica de usuario (GUI), la lógica del juego, la gestión de hilos, la serialización de datos, la gestión de eventos de teclado, entre otras cosas.
![blob-interface-main.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fblob-interface-main.png)
- Clase: DialogoMejoresPuntajes se pueden identificar varias funcionalidades diferentes, como la creación de la interfaz de usuario, la gestión de eventos, la manipulación de datos y la lógica de negocio. Esto puede resultar en una clase sobrecargada y difícil de mantener, ya que todas las funcionalidades están entrelazadas en una sola clase.
- Boat Anchor (Ancla del barco): Clase: MonedasInsuficientesException, este objeto no tiene ningún propósito o aporte en la
funcionalidad actual del juego.
![anchor-antipattern.png](https://github.com/DavidZambrano226/space-invader-game-java/raw/master/src%2Fmain%2Fresources%2Fdiagrams%2Fanchor-antipattern.png)
- Lava Flow (Flujo de lava): Se identifica las siguientes líneas de código que no están siendo usadas o se olvidó para que fuera diseñada.
Clase: DialogoCrearJugador tiene el método mostrar que no se está usando.