Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Feature envy es un bad smell en el que una clase "envidia" a otra clase tal cual como su
nombre lo menciona en la traducción al español “Envidia de clase”. Sucede comúnmente
cuando el programador expone el funcionamiento interno de otras clases usando muchas
funcionalidades de otras clases relacionándose con problemas de acoplamiento y cohesión,
con los cuales puede llegar a provocar efectos en cascada. El nombre del bad smell debido a
que la clase en cuestión quiere ser la otra clase tanto que usa sus métodos en exceso. Es
común que se produzca esta práctica cuando movamos propiedades a otra clase, es cuando
nos debería interesar también mover algunas funcionalidades que estén relacionadas con la
clase de origen.
“Move Method” se aplica cuando un método se usa más en otra clase ya sea en una relación
de herencia o de utilidad, que en la propia clase donde se creó.
Para implementar esta técnica se crea un nuevo método en las clases o clase que más usa el
método, o colocar como una referencia dentro de un método creado dentro de las demás
clases para dar más utilidad al nuevo método creado. Se refactoriza para crear una coherencia
interna dentro de la clase y también reduce la dependencia entre clases.
Procedimiento
2. Declare el nuevo método en la clase receptora. Es posible que desee dar un nuevo
nombre al método que sea más apropiado para él en la nueva clase.
3. Decida cómo se referirá a la clase destinataria. Es posible que ya tenga un campo o
método que devuelva un objeto apropiado, pero si no es así, deberá escribir un nuevo
método o campo para almacenar el objeto de la clase destinataria.
Ahora tiene una forma de hacer referencia al objeto destinatario y un nuevo método en su
clase. Con todo esto en su haber, puede convertir el método antiguo en una referencia al
nuevo método.
4. Eche un vistazo: ¿puede eliminar el método anterior por completo? Si es así, coloque
una referencia al nuevo método en todos los lugares que usan el antiguo.
Extract Method
Procedimiento
Ejemplo
Debido a la pandemia del Coronavirus, los hospitales requirieron un sistema eficiente para
obtener la información de los pacientes registrados. En el cual debían obtener la información
más completa del paciente donde debía especificar el nombre completo de la persona,
Localidad (País, Ciudad y dirección), números de teléfono (Casa y Celular) y además de
calcular el precio por los días hospitalizado si el costo del día es 1500 bolivianos, cabe aclarar
que los pacientes deben tener un porcentaje de descuento y se debe imprimir el costo a pagar
incluyendo el descuento. Debido a la agilidad que se necesitó el software resultante contiene
muchos bad Smells, la mayoría de tipo “Envy Feature” se pidió una actualización para el
sistema de tal forma que sea escalable para que próximos desarrolladores puedan mantener el
código.
Análisis y Refactorización
En la clase hospital tenemos dos métodos los cuales son: imprimirPaciente y
calcularPrecioPaciente. En los cuales podemos observar que la clase hospital está usando en
exceso métodos de la clase paciente, lo cual nos indica que es el bad smell “Feature Envy”.
public Hospital(){
precioDia = 1500 ;
pacientes = new ArrayList <Paciente> ();
}
Refactorización:
Para la refactorización se realizó un análisis de ambos métodos, es de vital importancia
mantener la búsqueda del paciente en ambos, pero se extraerán las operaciones principales y
se moverán al método con el cual se está usando más atributos o métodos, en este caso la
clase paciente. Para ello se comienza con el método de imprimirPaciente, el primer paso
será copiar el método a la clase paciente, posteriormente se cambiará las llamadas de los
getters por las mismas propiedades. También se renombrará el nombre del método dentro la
clase paciente de “imprimirPaciente” a “imprimir” para una mejor comprensión del mismo en
invocaciones de otros lados. En esta parte podemos observar de una manera a grandes rasgos
la parte de “extract method” y “move method”.
Una vez completada la refactorización de este método, se prosigue con el siguiente método
de interés, el cual sería “calcularPrecioPaciente”. Al igual que el anterior ejemplo es
necesario copiar el método, a la clase Paciente de la clase Hospital, de igual forma
renombrándolo, pero se mantendrá el método de la clase hospital debido a que es necesario
obtener mediante una búsqueda el paciente. En este caso es buena práctica separar la lógica
de la función de clase para crear un código más mantenible. Por lo cual se agregara el método
“calcularPrecio” el cual retornara el precio descontando el descuento del paciente internado.
Finalmente tendremos el método “imprimirPrecio” el cual llamará al método “calcularPrecio”
e imprimirá el resultado, este será invocado en Hospital.
public Hospital(){
precioDia = 1500 ;
pacientes = new ArrayList <Paciente> ();
}
public Paciente(){
this.nombreCompleto = "";
this.localidad = new Localidad();
this.numeros = new Numeros();
this.diasInternado = 0;
this.descuento = 0;
}
public Localidad(){
this.pais = "";
this.ciudad = "";
this.direccion = "";
}
public Hospital(){
precioDia = 1500 ;
pacientes = new ArrayList <Paciente> ();
}
public Paciente(){
this.nombreCompleto = "";
this.localidad = new Localidad();
this.numeros = new Numeros();
this.diasInternado = 0;
this.descuento = 0;
}
public Localidad(){
this.pais = "";
this.ciudad = "";
this.direccion = "";
}