Algo que siempre veo (en los últimos 3 proyectos en donde he participado) es la mala práctica del encapsulamiento, el mal uso de los métodos getters y setters.
He podido observar un código de este tipo:
En este caso tenemos las variables roles y filter de la clase MantenimientoUsuario. Supongamos de que manejamos algún tipo de framework para la capa View (Struts, JSF, etc.) y en el jsp utilizaremos solamente la variable filter. También tengamos en cuenta que ninguna clase llama a MantenimientoUsuario para utilizar su variable global roles.
En este caso, encontramos 2 problemas con el código:
1) El uso innecesario de los métodos getRoles() y setRoles(). Muchos programadores están acostumbrados a siempre generar metodos getters y setters en donde muchas veces no se necesita.
2) El uso de los métodos de acceso dentro de la misma clase. En el ejemplo se generaron métodos de acceso para que el JSP pueda utilizar la varibale filter.
La función de los métodos de acceso es para que otra clase o algún recuros accedan a las variables de clase a través de estos métodos. Pero.. ¿la misma clase está utilizando sus métodos de acceso? WTF.
Si el objeto MantenimientoUsuario pudiera hablar, dijera algo como esto: " ¿Por qué rayos estoy utilizando los métodos de acceso en "iniciar" y "registrar", no se suponen que esos métodos lo utilizaría alguien externo?. Son mis variables y las puedo utilizar directamente!!! "
Cuando vi la invocación del método setFilter dentro del método "iniciar", sinceramente pensé que provenía de su padre :S
Si modificamos el código....
:D
He podido observar un código de este tipo:
public class MantenimientoUsuario extends Mantenimiento{
private List roles;
private Usuario filter;
public String iniciar(){
setRoles(new ArrayList());
setFilter(new Usuario());
}
public String registrar(){
String codigo = getFilter().getCodigo().
// codigo para el metodo registrar
}
// Metodos Getters y Setters
public List getRoles(){
return this.roles;
}
public void setRoles(List roles){
this.roles = roles;
}
public Usuario getFilter(){
return this.filter;
}
public void setFilter(Usuario filter){
this.filter= filter;
}
}
En este caso tenemos las variables roles y filter de la clase MantenimientoUsuario. Supongamos de que manejamos algún tipo de framework para la capa View (Struts, JSF, etc.) y en el jsp utilizaremos solamente la variable filter. También tengamos en cuenta que ninguna clase llama a MantenimientoUsuario para utilizar su variable global roles.
En este caso, encontramos 2 problemas con el código:
1) El uso innecesario de los métodos getRoles() y setRoles(). Muchos programadores están acostumbrados a siempre generar metodos getters y setters en donde muchas veces no se necesita.
2) El uso de los métodos de acceso dentro de la misma clase. En el ejemplo se generaron métodos de acceso para que el JSP pueda utilizar la varibale filter.
La función de los métodos de acceso es para que otra clase o algún recuros accedan a las variables de clase a través de estos métodos. Pero.. ¿la misma clase está utilizando sus métodos de acceso? WTF.
Si el objeto MantenimientoUsuario pudiera hablar, dijera algo como esto: " ¿Por qué rayos estoy utilizando los métodos de acceso en "iniciar" y "registrar", no se suponen que esos métodos lo utilizaría alguien externo?. Son mis variables y las puedo utilizar directamente!!! "
Cuando vi la invocación del método setFilter dentro del método "iniciar", sinceramente pensé que provenía de su padre :S
Si modificamos el código....
public class MantenimientoUsuario extends Mantenimiento{
private List roles;
private Usuario filter;
public String iniciar(){
roles = new ArrayList();
filter = new Usuario();
}
public String registrar(){
String codigo = filter.getCodigo().
// codigo para el metodo registrar
}
// Metodos Getters y Setters
public Usuario getFilter(){
return this.filter;
}
public void setFilter(Usuario filter){
this.filter= filter;
}
}
:D
Comentarios
La verdad es que no creo que exista una formula única, y dependerá de cada caso. En términos generales estoy de acuerdo contigo, pero no creo que convenga ser demasiado dogmático al respecto.
Ahora, a mi me impactó un poco. Ya que cuando encontré ese método "setFilter" pensé que venía de su clase padre. Pues crea cierta confusión. Volviendo a esto de los autores hay un libro que es "ThoughtWorks Anthology" de Jeff Bay, que menciona como última regla de calistenia: No utilizar setters y getters (aún tendría que comprobar esto).
El post también menciona de que no está bien tener métodos que nunca van a ser utilizados. Como también el poder minimizar cadenas de getters que se ven feo: getFilter().getA().getB()
En el momento de desarrollo tal vez pase. Pero para las personas que tengan que hacer modificaciones al código, les afecta :(
Ahora estoy corrigiendo cosas de otra persona y encuentro unas cosas que confunden (fuera de getters y setters) como el mal uso del "this". Encuentro "this" por las puras. Y esto da que pensar que la clase padre tiene una variable con nombre similar (similar al "setFilter")
Bueno y en fin... muchas cosas.
Saludos
pakos
www.devtics.com.mx