martes, 22 de mayo de 2012

Setters y getters, friend or foe?

Esto me lo he preguntado alguna vez y Kpacha al final me convencía, aunque ahora no recuerdo sus argumentos. ¿Por qué quiero programar así?:

private String nombre;
public void setNombre(String nombre) { this.nombre = nombre; }
public String getNombre() { return nombre; }


En lugar de hacer simplemente esto:

private String nombre;

y acceder directamente a las propiedades cuando haga falta...¿?
Hay buenos motivos para usar esas funciones get, set, como por ejemplo:

  • Encapsulación: Así nos protegemos frente a cambios de implementación. Por ejemplo si decidimos que hay que verificar algo antes de hacer el set solo habrá que hacerlo en ese método.
  • Es necesario para que sean compatibles con clases como serialize.
  • Al heredar puedes modificar el funcionamiento.

Peeeeeroooo...

Realmente el uso de getters y setters sigue sin ser una buena práctica, no sigue la filosofía de la programación con objetos. ¿Por qué?
Uno de los principios que engrandecen la OOP es la abstracción de los datos. Un objeto no debe mostrar cómo funciona internamente, de ese modo siempre se puede modificar ese comportamiento sin afectar a los que hacen uso de él. Por eso las propiedades han de ser privadas como norma general.
Usar getters y setters son un rodeo para, en realidad, hacer pública una propiedad. Si por ejemplo tenemos que cambiar el tipo que devuelve el getCantidad de int a long tendremos que recorrer todo el código donde se use ese método para arreglar la recepción del dato. Esos datos no tendrían que ir pululando por ahí de clase en clase, en vez de pedir el dato para hacer algo, habría que decirle a la clase que tiene la información que lo haga.

En resumen, hay que tener todos los getters y setters si tienes pensado usar serialize o similares. En caso contrario hay que reducir al mínimo posible este tipo de accesos porque exponen el funcionamiento interno de la clase y por tanto hacen el código más difícil de mantener. Para conseguirlo hay que planificar previamente la visión global del funcionamiento de las clases y su interacción, es decir hacer bien las cosas desde el principio. ¡Qué fácil es decirlo!

Voy a avisar a Kpacha para que se pase por aquí a poner los puntos sobres las íes.

2 comentarios:

  1. Kpacha, te has dejado algo, porqué he hecho un ctrl+F y por "Hello World" no me viene nada.

    ResponderEliminar
  2. juas!

    lo que me había dejado por decir es que, como todo en esta vida, el simplificar las cosas conlleva un coste: cada (g/s)etter no definido y redirigido al método genérico sobrecarga la ejecución...

    como siempre, nadie da duros a cuatro pesetas!

    ResponderEliminar