Refactoring: Extract Class
Finalidad:
Una clase tiene responsabilidades que no le corresponde, sino que deberian pertener a otra clase.
Mecánica:
- Decidir como dividir las responsabilidades de la clase.
- Crear una nueva clase que alojará ciertas responsabilidades.
- Vincular a la clase original con la nueva.
- Usar Move Field en cada campo que se quiera mover.
- Compilar y testear cada movimiento.
- Usar Move Method para mover los métodos que se encontraban en la clase original a la nueva.
- Compilar y testear.
- Reveer las interfaces de cada una de las clases.
- Decidir como exponer la nueva clase.
Ejemplo Extract Class:
Tenemos una clase usuario donde tiene todos los atributos correspondientes a un usuario de un sistema X y ademas tiene dentro de si el manejo de permisos.
public class Usuario {
String _nombre;
String[] _permisos;
public String getNombre(){
return _nombre;
}
public String[] getPermisos(){
return _permisos;
}
public String[] obtenerPermisosParaUsuario(int oidUsuario){
//busca los permisos del usuario
}
public void manejaPermisos(){
//Código que hace operaciones con los permisos
}
}
![]()
En este caso la clase Usuario deberia tener una lista de permisos pero no deberia hacer manejo de los mismos. Por lo tanto, vamos a crear una clase Permisos para que sea esta la que tenga el comportamiento necesario.
public class Usuario {
String _nombre;
Permisos[] _permisos;
public String getNombre(){
return _nombre;
}
public String[] getPermisos(){
return _permisos;
}
}
class Permisos{
String _nombrePermiso;
public String[] obtenerPermisosParaUsuario(int oidUsuario){
//devuelve los permisos del usuario
}
public void manejaPermisos(){
//Código que hace operaciones con los permisos
}
}
Esto ha sido todo el artículo Técnica de Refactoring en Español: Extract Class




Un ping
Que son las tecnicas de Refactoring en Español (II) » Sur Patterns Community
19/03/2012, a las 0:51 (UTC -3) Enlace a este comentario
[...] se podría considerar usar Extract Class en una clase y luego usar el nuevo componente en la otra [...]