1. Duplicated Code: [Cuenta. Validación monto positivo]: La validación de si el parámetro es negativo se puede extraer a un metodo -> validarMontoPositivo() y usarlo en el método poner(x) y sacar(x).
2. Duplicación de Código/ duplicación de objetos: [Cuenta. Método poner(),sacar()]: Por cada new Movimiento(...).agregateA(...) estoy creando dos objetos Movimiento con la misma info, por un tema de mala ubicación de métodos (ver code smell N° 7).
3. Long Method: [Cuenta. Método sacar()]:
En el método sacar() ( vale también para el método poner() ) se están realizando demasiadas validaciones, las cuales pueden variar. Como por ejemplo, puede variar que la cantidad de depósitos por día sea de 3; o que el límite de extracción sea de 1000. Sería mejor parametrizar estos valores y extraerlos a otro métodos o a otras clases las cuales realicen las validaciones.
4. Feature Envy: [Cuenta. Método getMontoExtraidoA(fecha)]:
En este método estamos realizando muchos mensajes sobre un Movimiento mientras la interfaz nos provee 2 métodos para realizar lo mismo con mayor encapsulamiento "fueExtraido(fecha)".
5. Duplicated Code: [Movimiento. Método isDeposito()]:
No hace falta tener los dos métodos isDepósito() y isExtracción(). Se puede hacer un return !isDeposito() (igualmente no es demasiada repetición, puede ayudar tener los 2 para más declaratividad).
6. Misplaced Method: [Movimiento. Método agregateA(Cuenta)]:
Un Movimiento no tiene porque saber agregarse a una cuenta en particular. Es la cuenta quien tiene que agregar un Movimiento determinado basado en la fecha, monto y tipo de operación.
7. Feature Envy/Misplaced Method - Primitive Obsession (TipoOperación): [Movimiento. Método calcularValor(Cuenta) / Atributo esDeposito]:
Es la propia cuenta quien debería realizar el set saldo actual a partir de un nuevo movimiento. El movimiento en base a un monto podría devolver el importe luego de realizar este movimiento, pero la asignación del saldo actual a la cuenta la debería hacer la Cuenta. Se podría modelar una interfaz tipoOperación y delegar el cálculo del nuevo saldo a las clases que la implementen.
Este repositorio contiene el código de un monedero virtual, al que podemos agregarle y quitarle dinero, a través
de los métodos Monedero.sacar
y Monedero.poner
, respectivamente.
Pero hay algunos problemas: por un lado el código no está muy bien testeado, y por el otro, hay numeros code smells.
Tenés seis tareas:
maven