-
Empezar por VendingMachine.java que es la interfaz que define el contrato que debe cumplir cualquier clase que pretendar implementar el modelo de vending machine que he diseñado.
-
VendingMachineImpl.java es una implementación de VendingMachine.java.
-
VendingMachineImpl.java no es thread-safe porque asumo que solo hay una persona usando la vending machine (ya sea un cliente o el operador).
-
Examinar los tests:
- VendingMachineImplAtStateProductNotSelectedTest.java: Permite entender el comportamiento esperado de VendingMachineImpl.java en el estado de producto no seleccionado.
- VendingMachineImplAtStateProductSelectedTest.java: Permite entender el comportamiento esperado de VendingMachineImpl.java en el estado de producto seleccionado.
- VendingMachineImplResetCommandTest.java: Permite entender el comportamiento esperado de VendingMachineImpl.java para el command reset.
- CoinChangeCalculatorAsBiggestAsPossibleTest.java: Testea una implementación de la interfaz funcional CoinsChangeCalculator.java que permite inyectar como dependencia en VendingMachineImpl.java la lógica responsable de calcular el cambio en monedas. (Probably is better to inject into deposit coins, see Issue 12).
- InventorizedDepositImplTest.java: Permite entender el comportamiento esperado para la clase genérica InventorizedDepositImpl.java que es inyectada en VendingMachineImpl.java tanto para el depósito de monedas, como para el depósito de productos.
-
La sección Issues de este repositorio GitHub contiene cosas pendientes de implementar o mejorar.
-
Si os fijáis en el historial de commits, he seguido un enfoque test fails first, y luego implementar código hasta que los test pasen correctamente.
-
Si en algún momento he hecho alguna refactorización, los tests me han sido de utilidad para comprobar el progreso de la refactorización. Lógicamente cuando la refactorización afecta a muy alto nivel, los tests deben ser refactorizados correctamente. Esto me ha pasado concretamente con el siguiente commit.