Está en la página 1de 10

TAREA 1.

BAD SMELL

EQUIPO: ENTENDIDOS

PARALLEL INHERITANCE HERIACHY (JERARQUÍA DE HERENCIA PARALELA)

1. Camacho Sanabria Walter


2. Cárdenas Morales Luis Fernando
3. Garcia Veizaga Sadan
4. Kilibarda Lima Eduardo Francisco
5. Mollo Mamani Cristian

1. Explicación del bad Smell (Jerarquía de herencia paralela)


1.1. Definición
Diagrama 1.1. Jerarquía de herencia paralela

Las jerarquías de herencia paralela es un bad smell que lo define Martin Fowler
como un caso especial de cirugía de escopeta, en la cual, cuando se crea una
subclase de una clase, se debe de crear a la vez una subclase de otra.
Una jerarquía de herencia paralela puede ser reconocida porque los prefijos del
nombre de clase en una jerarquía son los mismos que los prefijos de clase en otra
jerarquía.
1.2. Causas
La jerarquía de herencia paralela ocurre cuando un árbol de herencia depende de
otro árbol de herencia y mantienen una relación especial; en la cual una subclase de
un árbol de herencia depende de otra subclase de otro árbol de herencia.
Entre otras causas tenemos:
- Mucho código duplicado.
- No realizar la refactorización continua.
- Exceso de entusiasmo por dividir cada función como una clase separada.
- No introducir patrones de diseño adecuados.

2. Estrategias de Solución

Las estrategias de solución se las debe de aplicar en función a la complejidad de la


refactorización del programa.

Como estrategia general para eliminar la duplicación es asegurarse de que las instancias de
una jerarquía se refieran a las instancias de otra. Usando Move Method y Move Field, la
jerarquía en la clase de referencia desaparece.

Para la jerarquía de herencia paralela tenemos dos estrategias de solución:

2.1. Mantener abiertas las jerarquías paralelas y acostumbrarse a ella.


Pros
- Mejor forma de mantener Principio de responsabilidad única.
- El código será flexible.
Contras
- Por cada una nueva característica agregada, tenemos que crear dos clases.
- Las jerarquías están acopladas, los cambios en uno pueden requerir cambios
en el otro.
- Más difícil de mantener.
2.2. Colapsar una Jerarquía
Pros
- Mantener solo una jerarquía.
- Fácil de mantener.
Contras
- Rompe el Principio de Responsabilidad Única con bastante frecuencia.
3. Ejemplos
a. Descripción del escenario
Mostramos 2 árboles de herencia paralela de las super clases ingeniero y hito y sus
respectivos sub clases por lo cual dados los conceptos de este bad smell donde se
añade una subclase en la super clase ingeniero debería añadirse automáticamente
una subclase en la super clase hito duplicando el código y agravando los problemas
describiendo en las subclases la labor como profesionales tanto el informático y el
civil y una clase principal donde nos imprime los datos del informático y civil.

b. Código que contiene el bad smell


Diagrama 1.2. Código con bad smell

CLASE 1:

public class Ingeniero


{
private int salario;
private Hito mihito;
private String tipo;
public Ingeniero(int salario,Hito mihito,String tipo)
{
this.salario=salario;
this.mihito=mihito;
this.tipo=tipo;
}
public int getSalario()
{
return salario;
}
public Hito getHito()
{
return mihito;
}
public String gettipo()
{
return tipo;
}
public void setsalario(int salario)
{
this.salario=salario;
}

public void sethito(Hito mihito)


{
this.mihito=mihito;
}

public void settipo(String tipo)


{
this.tipo=tipo;
}

Clase2

public class Civil extends Ingeniero


{
private String infrestructura;

public Civil(int salario,Hito mihito,String tipo,String infrestructura)


{
super(salario,mihito,tipo);

this.infrestructura=infrestructura;
}

public String getinfrectructura()


{
return infrestructura;
}
public void setinfrectructura()
{
this.infrestructura=infrestructura;
}

}
Clase 3:
public class Informatico extends Ingeniero
{
private String rango;
public Informatico(int salario,Hito mihito,String tipo,String rango)
{
super(salario,mihito,tipo);
this.rango=rango;
}

public String getrango()


{
return rango;
}
public void setrango(String rango)
{
this.rango=rango;
}

Clase 4:
public abstract class Hito
{
public abstract String trabajo();
public abstract String objetivo();

clase 5:
public class Hitocivil extends Hito
{
public String trabajo() {
return"contruir las torres gemelas";

public String objetivo()


{
return"terminar la obra en 2 años";
}
}

Clase 6 :
public class Hitoinformatica extends Hito
{
public String trabajo()
{
return"crea un micro servicio de facturacion";

public String objetivo()


{
return"tiene que ser terminado en 14 PD";
}

c. Aplicación de la estrategia de solución


C1. Proceso de refactorización

Quitamos la super clase hito con sus subclases y lo pasamos sus atributos a la super
clase ingenieroRefactor y nos quedamos con sus atributos y de la clase respectivamente
y obtrendremos un solo árbol de herencia con el código refactorizado y más entendible
y nos muestra lo mismo la descripción y los datos de las subclase informaticRefactor y
civilRefactor.

Diagrama 1.3. Código traslado de clase Hito a clase IngenieroRefactor


C2. Código refactorizado
Diagrama 1.4. Código refactorizado

Clase 1:

public abstract class IngenieroRefactor


{
private int salario;
private String tipo;
public abstract String trabajo();
public abstract String objetivo();

public IngenieroRefactor(int salario,String tipo)


{
this.salario=salario;
this.tipo=tipo;
}

public int getSalario()


{
return salario;
}

public String gettipo()


{
return tipo;
}

public void setsalario(int salario)


{
this.salario=salario;
}

public void settipo(String tipo)


{
this.tipo=tipo;
}

Clase 2:
public class InformarticoRefac extends IngenieroRefactor
{
private String rango;
public InformarticoRefac(int salario,String tipo,String rango)

{
super(salario,tipo);

this.rango=rango;
}

public String getrango()


{
return rango;
}
public void setrango(String rango)
{
this.rango=rango;
}

public String trabajo()


{
return"crea un micro servicio de facturacion";
}

public String objetivo()


{
return"tiene que ser terminado en 14 PD";
}
}

Clase 3:
public class CivilRefac extends IngenieroRefactor
{

private String infrestructura;

public CivilRefac(int salario,String tipo,String infrestura)


{
super(salario,tipo);

this.infrestructura=infrestructura;

public String getinfrectructura()


{
return infrestructura;
}

public void setinfrectructura()


{
this.infrestructura=infrestructura;
}

public String trabajo()


{
return "contruir las torres gemelas";

public String objetivo()


{
return "terminar la obra en 2 años";

También podría gustarte