Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Iterator
Problema: SalesModel representa el modelo de ventas de la aplicación. Cuando existe un gran número de ventas donde se requiera manipular los objetos de uno a uno, actualmente solo se puede lograr esto a través de un ciclo for utilizando índices.
Solución e implicaciones: Para permitir la iteración a los objetos que representan las ventas, se hizo uso del patrón de comportamiento Iterator. De esta manera, se puede iterar cada uno de los objetos o obtener al siguiente cuando se llame al método iterator().
Observer
Problema: Cuando se realiza una venta existen tareas que se deben ejecutar después de ese evento, por ejemplo el cobro. La implementación que tiene el proyecto ahora mismo para realizar esta función es la estructuración de código para que sea secuencial, lo que genera limitaciones.
Solución e implicaciones: Haciendo uso del patrón de comportamiento Observer, se crea una interface SaleObserver que será implementada en SaleLogger. El logger tendrá funcionalidad que será ejecutada cuando se realice una venta. En SalesModel se guarda ahora una lista de observadores para poder tener acceso a ellos cuando disparen una actualización y poder removerlos con más facilidad.
Strategy
Problema: El código en SupplierModel tiene acoplada la lógica para obtener los proveedores desde la base de datos. Esto lo hace menos flexible y reusable.
Solución e implicaciones:Aplicar el patrón Strategy para desacoplar la lógica de obtención de datos:
Crear interfaz SupplierStrategy con el método getSuppliers()
Implementar estrategias concretas para distintas fuentes (DB, API, etc)
SupplierModel tendrá una referencia a Strategy y delegará la obtención de datos a eso.