sábado, 16 de abril de 2011

Los métodos getter/setter o accesores/modificadores

Hoy veremos un tema muy importante en la programacion orientada a objetos en php aunque a simple vista se mire sencillo y sin sentido lo que vamos a hacer mas adelante le hallaremos una utilidad muy grande que son los metodos accesores bien demole con todo pues!!!!

Migremos a la sintaxis de PHP5
PHP5, consciente de este problema, implementa la definición de "visibilidad" de los atributos y métodos, como lo haría Java o .Net. Si hiciéramos una migración "mecánica" de nuestro código, este cambiaría la sintaxis a esta forma (ya que la sintaxis "var" pasa a desuso y esta definía a los atributos siempre "públicos") usabamos var en PHP4 para declarar propiedades.

Ahora disponemos de las siguientes opciones gracias a la nueva sintaxis: public, private y protected.

Por un tema de principios de la POO los atributos de los objetos deben ser siempre "privados" (concepto "encapsulación": no son accesibles desde fuera del objeto, solo el objeto tiene la potestad de usarlos directamente) y se deberán crear métodos públicos que sustituya una u otra operación, o ambas, cada vez que la situación lo amerite:

  • un método "setter" para "cargar un valor" (asignar un valor a una variable)
  • un método "getter" para "retornar el valor" (solo devolver la información del atributo para quién la solicite).
Los famosos Getter/Setter

Cuando empezamos a aprender a usar Objetos el primer error que cometemos es dejar todos los atributos públicos, lo que permite que cualquier usuario de nuestra clase pueda hacer y deshacer sin control nuestro objeto (modificando y consultando sus valores). Generalmente nuestros objetos deberían contener determinada información que no necesariamente el usuario de nuestro objeto debería saber, porque no conviene, o porque directamente no corresponde y permitirle acceder a la misma es aumentar innecesariamente la complejidad del uso del objeto.

Regla: "Evitar que el objeto muestre detalles de su implementación"
Por ejemplo: si tu sabes que tu objeto "Persona" tiene una fecha de nacimiento y calculas su edad, no deberías poder permitir que alguien "de afuera del objeto" cambie la edad, pues está relacionada con otra información (fecha de nacimiento) y a partir de ella es que se genera (calcularEdad()).

Los detalles del funcionamiento del objeto son internos, y el usuario del objeto (otro desarrollador u otro sistema) no debe ni necesita conocerlos. Por consiguiente ya tenemos otro caso claro, el atributo "edad" no debería poder ser modificado externamente, pero sí consultado cada vez que se necesite.

Si este fuera un atributo público sería imposible restringir una operación y habilitar la otra. De ahí que nace el concepto de "getter / setter", o de "métodos accesores / modificadores", o como muchos autores se refieren a estos métodos especiales como "propiedades" (pero creo que puede generar confusiones con el concepto "atributo", pues muchos otros autores usan las mismas palabras indistintamente). Si tú colocas atributos privados, estos serán solo "vistos / accedidos / usados / modificados" dentro de la propia clase. Si tu quieres que puedan ser accedidos desde fuera de la clase, debes crear métodos públicos que internamente "accedan" a los atributos, pero que los dejarán "resguardados" dentro del objeto.

Errores más comunes que comentemos a la hora de usar metodos accesores

Definir todos los "get" y "set" para todos los atributos existentes. Es casi lo mismo que si fueran todos públicos, careciendo de utilidad. aunque a veces hay excepciones.

Lo habitual es que esto no debería suceder, cuanto más escondamos de nuestro objeto mejor será, pues disminuimos la complejidad de su uso y evitamos que cambie a un estado que no queremos, y cuando menos se sepa de cómo trabaja internamente, más fácil será poder reutilizarlo en contextos distintos (deberá ser raro que debas dejar disponible todo y no existan algunos que sean solo de uso interno). Otro error común es agregarle más lógica que asignar un valor o retornar el valor del atributo. Si necesitas agregarle lógica, ya dejan de ser "get / set", lo cual es mejor que cambiemos de nombre y lo dejemos con los demás métodos comunes de nuestra clase. Por ejemplo: si para cambiar el nombre del usuario, antes de asignar el valor voy a la base de datos y verifico que no exista otro igual, y luego en caso de nombre duplicado genero otro alternativo, etc, preferiría o desglosar el método setNombre en varias llamadas a métodos privados, o directamente crear un método nuevo que se llame cambiarNombre, reflejando un proceso fuera del simple get/set.

Tratemos de de seguir las siguientes reglas
1. Por defecto, atributos privados
2. Usa métodos comunes y no getter/setter
3. Si no queda otra opción, usa solo getter
4. Si no queda otra opción, usa setter

El tema no es tan complejo, de forma genérica esta es la explicación de qué es "getter/setter" y para qué sirve y cómo se usan.

También quiero destacar que a pesar de existir esta técnica, no quiere decir que deba ser usada o que su uso esté completamente permitido. Hay que entender que la POO no debería hacer uso de de los getter y setters ya que tendríamos acceso de forma directa al "estado del objeto" (la información que tienen los atributos de un objeto) y permitir el acceso o modificación genera el mismo efecto de manipulación que si fuera una operación de "corazón abierto".

Nuestro objeto debería estar protegido del exterior y no permitir tener acceso directo a sus atributos, y trabajar siempre sobre sus métodos ("los métodos definen el comportamiento del objeto").

En caso de no poder hacerlo, se podría priorizar disponer de "get" (obtener valor de un atributo de forma directa) y no "set" (modificar un valor directo de un atributo), y en el peor de los casos, tener un uso muy controlado de los "set".

Bien despues de la teoria veamos que ondas bien el ejemplo es sencillo pero nos ayudara a comprender de una forma simple ya que los utilizaremos mas adelante.

primero hay que crear la estructura de los setter y getter tenemos que declarar nuestras propiedades como privadas y luego para no estar escribiendo este codigo repetitivo hay una opcion bastante buena que la encontre en esta web , ingresando el nombre de la propiedad te devuelve su respectivo metodo set y get en php.

enlace

Tenemos que crear una clase y luego nuestras propiedades no olviden de comentar su codigo .

Luego para ocupar esta clase hacemos esto:

Hacemos un require del archivo luego instanciamos y ya podemos usar los metodos de esta clase el metodo set sirve para asignar el valor y el metodo get para obtenerlo. Y el resultado que tenemos es este.

Bien esto ha sido todo para los metodos accesores mas adelante veremos mas utilidades realmente interesantes sobre esto.

Descargar

comenten no sean bayuncos....

No hay comentarios:

Publicar un comentario