Académique Documents
Professionnel Documents
Culture Documents
¿Qué es Refactorización?
Mejora el diseño
Mejora la lectura del código
Revela defectos
Ayuda a programar más rápido
Principios de Refactorización
Tips de Refactorización
Herramientas de Refactorización
Técnicas de Refactorización
Rename Method
Una de las técnicas más sencillas pero efectivas, se puede usar sobre: clases,
funciones, propiedades, variables, etc. Usar nombres claros reduce el uso de
comentarios y aumente la lectura del código.
Antes
1 /// <summary>
2 /// Responsable de manejar los impuestos
3 /// </summary>
4 public class Class1
5 {
6 /// <summary>
7 /// Nombre del proceso a ejecutar
8 /// </summary>
9 public string Nombre { get; set; }
10
11 /// <summary>
12 /// Calcula el impuesto a pagar
13 /// </summary>
14 /// <param name="t">Numero de Cedula</param>
15 public double Calcula(string t) { }
16 }
Después
Antes
1 var aplicaDescuento =
2 solicitud.Tipo == 2 && solicitud.Cantidad > 10 && solicitud.Precio < 100;
3 if (aplicaDescuento)
4 {
5 solicitud.Descuento = 0.5M;
6 }
Inline Temp
Las variables temporales son un tipo de code smell que hacen que los métodos se
vuelvan más largos, siempre y cuando se usen una sola vez.
Antes
Antes
1 ValidarAdmision(solicitud.Ent,
2 solicitud.Programa, solicitud.Vacante, solicitud.Ciclo);
Después
1 //Almacena el total
2 var temp = solicitud.Monto * solicitud.Cantidad;
3 //Calcula el impuesto
4 temp = (temp * 0.15);
Después
Esta técnica es parecida a la técnica Inline temp pero con la diferencia que invoca
a un método que contiene la evaluación de la expresión compleja.
Antes
Extract Method
Antes
Esta técnica es opuesta a la técnica Extract method ya que une todos los métodos
en un solo, se debe aplicar siempre y cuando una función solo se use en un solo
lugar y tener el código en métodos separados no agregue ningún beneficio.
Antes
Move Method
Esta técnica mueve un método a otra clase ya que usa más características de la
otra clase que de ella misma. Al aplicar estas estrategias reducimos el
acoplamiento.
Antes
1 class Poliza
2 {
3 public void CaducarPoliza(Poliza poliza)
4 {
5 //Codigo
6 EnviarNotificacionResponsable(poliza);
7 //Codigo
8 }
9
10 private void EnviarNotificacionResponsable(Poliza poliza)
11 {
12 Mensaje mensajeResponsable;
13 //Código...
14 }
15 }
Después
1 class Poliza
2 {
3
4 private readonly IServicioNotificacion servicioNotificacion;
5
6 public Poliza(IServicioNotificacion servicioNotificacion)
7 {
8 servicioNotificacion = servicioNotificacion;
9 }
10
11 public void CaducarPoliza(Poliza poliza)
12 {
13 //Codigo
14 EnviarNotificacionResponsable(poliza);
15 //Codigo
16 }
17
18 private void EnviarNotificacionResponsable(Poliza poliza)
19 {
20 Mensaje mensajeResponsable;
21 //Código...
22 servicioNotificacion.EnviarNotificacion(mensajeResponsable);
23 }
24 }
25
26 class ServicioNotificacion : IServicioNotificacion
27 {
28 public void EnviarNotificacion(Mensaje mensajeResponsable){}
29 }
Extract Class
Esta técnica se aplica cuando se tiene una clase que hace el trabajo (tiene muchas
responsabilidades) de dos o más.
Antes
Inline Class
Esta técnica es opuesta a la técnica Extract class ya que une dos clases en una
sola, esto aplica siempre y cuando la otra clase no es usada en más lugares.
Antes
Encapsulate Field
Antes
1 class Persona
2 {
3 public string nombre;
4 }
Después
1 class Persona
2 {
3 public string Nombre { get; set; }
4 }
Encapsulate Collection
Se aplica cuando una propiedad retorna una colección, en su lugar se debe crear
un método que permita agregar nuevos elementos a la colección.
Antes
Extract Interface
Antes
1 class Poliza
2 {
3 public void CaducarPoliza(Poliza poliza)
4 {
5 //Codigo
6 if(Configuracion.EsSmsActiva)
7 {
8 EnviarNotificacionResponsableSms(poliza);
9 }
10 else {
11 EnviarNotificacionResponsableSmtp(poliza);
12 }
13 //Codigo
14 }
15
16 private void EnviarNotificacionResponsableSmtp(Poliza poliza)
17 {
18 ServicioNotificacionSmtp servicioNotificacion;
19 servicioNotificacion.EnviarNotificacion(mensaje);
20 }
21
22 private void EnviarNotificacionResponsableSms(Poliza poliza)
23 {
24 ServicioNotificacionSms servicioNotificacion;
25 servicioNotificacion.EnviarNotificacion(mensaje);
26 }
27 }
28
29 class ServicioNotificacionSmtp
30 {
31 public void EnviarNotificacion(Mensaje mensajeResponsable){}
32 }
33
34 class ServicioNotificacionSms
35 {
36 public void EnviarNotificacion(Mensaje mensajeResponsable){}
37 }
Después
1 class Poliza
2 {
3
4 private readonly IServicioNotificacion servicioNotificacion;
5
6 public Poliza(IServicioNotificacion servicioNotificacion)
7 {
8 servicioNotificacion = servicioNotificacion;
9 }
10
11 public void CaducarPoliza(Poliza poliza)
12 {
13 EnviarNotificacionResponsable(poliza);
14 }
15
16 private void EnviarNotificacionResponsable(Poliza poliza)
17 {
18 servicioNotificacion.EnviarNotificacion(mensaje);
19 }
20 }
21
22 class ServicioNotificacionSmtp : IServicioNotificacion
23 {
24 public void EnviarNotificacion(Mensaje mensajeResponsable){}
25 }
26
27 class ServicioNotificacionSms : IServicioNotificacion
28 {
29 public void EnviarNotificacion(Mensaje mensajeResponsable){}
30 }
Extract SubClase
Aplica cuando una clase tiene algunos métodos o propiedades solo se usan en
ciertos casos.
Antes
1 class Poliza
2 {
3 public void RegistrarPoliza(Poliza poliza)
4 {
5 //Codigo
6 }
7
8 public void CaducarPoliza(Poliza poliza)
9 {
10 if (Tipo == TipoPoliza.Caducable)
11 {
12 //Codigo
13 }
14 }
15 }
Después
1 class Poliza
2 {
3 public void RegistrarPoliza(Poliza poliza)
4 {
5 //Codigo
6 }
7 }
8
9 class PolizaCaducable : Poliza
10 {
11 public void CaducarPoliza(Poliza poliza)
12 {
13 //Codigo
14 }
15 }
Extract SuperClase
Hide Delegate
Antes
Esta técnica se aplica cuando se tiene un valor en duro y no se sabe que significa.
Antes
1 var aplicaDescuento =
2 solicitud.Tipo == 2 && solicitud.Cantidad > 10 && solicitud.Precio < 100;
3 if (aplicaDescuento)
4 {
5 solicitud.Descuento = 0.5M;
6 }
Después