- Mal reparto de responsabilidades => Falta de Cohesión
- Imposible reutilizar para otro formato (HTML) => Inmóvil
- copy+paste => DRY
- Cambio de política de coste y puntos =>
- Viscoso
- copy+paste => multiplica y complica el mantenimiento
Extraer Método => switch y código dependiente en método “amountFor” de clase Customer|
- Malos nombres => “each” y “thisAmount”
- Renombrar variable => “rental” y “result”
-
Envidia de características => get(), get(), … desde el servidor
-
Clase de Datos => get(), get(), … en el cliente Experto en Información => la clase responsable es la que tiene la información
- Mover método => método “getCharge” a clase “Rental”
- “Innecesaria descomposición”: método privado sin justificación
- Método en línea => eliminar “amountFor”
- Variable temporal innecesaria => “thisAmount”
- Reemplazar Temporal por Consulta => “each.getCharge()”
- Método largo => más de 15 líneas
- Extraer método => método “getFrequentRenterPoints()“ a clase “Rental”
- Variable temporal innecesaria => “totalAmount”
- Reemplazar Temporal por Consulta => “this.getTotalCharge()”
- Variable temporal innecesaria => “frequentRenterPoints”
- Reemplazar Temporal por Consulta => “this.getTotalFrequentRenterPoints()”
- Experto en la Información => la mayor parte de la información es de Movie
- Mover Método => método “getCharge()” a clase “Movie”
- Experto en la Información => la mayor parte de la información es de Movie
- Mover Método => método “getFrequentRenterPoints()” a clase “Movie”
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Código de Tipo con Estrategia/Estado (inyección de dependencias) => Auto-encapsular campo => “priceCode”
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Código de Tipo con Estrategia/Estado (inyección de dependencias) => Añadir nuevas clases => “Price”, “ChildrenPrice”, ...
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Código de Tipo con Estrategia/Estado (inyección de dependencias) => Sustituir atributo: “int priceCode” por “Price price”
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Código de Tipo con Estrategia/Estado (inyección de dependencias) => Mover método: método “getCharge()” a Clase “Price”
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Condicional con Polimorfismo => Redefinir método “getCharge()” en clases derivadas
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Reemplazar Condicional con Polimorfismo => Redefinir método “getFrequentRenterPoints()” en clases derivadas
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Ocultar campo: añadir métodos “childrens()”, “regular()” y “newRelease()” en clase “MovieBuilder
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Ocultar campo: desde “CustomerTest” llamar a métodos “childrens()”, “regular()” y “newRelease()” de clase “MovieBuilder”
- Sustituir campo: atributo “priceCode” por “Price” en clase “MovieBuilder”
- Sustituir campo: atributo “priceCode” por “Price” en clase “Movie”
- Sentencia Alternativa Múltiple => el comportamiento depende de un tipo/código/...
- Eliminar método: “getPriceCode()” de clases “Price” y “Movie”
- Números mágilos => 2, 1.5, ...
- Añadir atributo: “CHARGE”, “DAYS_RENTER_THRESHOLD”, ... en jerarquía “Price”