FrancoPaesani / dds-monedero-java8

Monedero para refactoring
0 stars 0 forks source link

Monedero

Solución - Listado de Code Smells:

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.

Contexto

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.

Consigna

Tenés seis tareas:

  1. :fork_and_knife: Hacé un fork de este repositorio (presionando desde Github el botón Fork)
  2. :arrow_down: Descargalo y construí el proyecto, utilizando maven
  3. :nose: Identificá y anotá todos los code smells que encuentres
  4. :test_tube: Agregá los tests faltantes y mejorá los existentes.
    • :eyes: Ojo: ¡un test sin ningún tipo de aserción está incompleto!
  5. :rescue_worker_helmet: Corregí smells, de a un commit por vez.
  6. :arrow_up: Subí todos los cambios a tu fork

Tecnologías usadas