Ver Mensaje Individual
  #10 (permalink)  
Antiguo 31/12/2008, 09:48
Avatar de enriqueplace
enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Duda: Como inicializar propiedades públicas (filtradas) de un objeto

Cita:
También he leído un artículo de Allen Holub en el que dice que los getters/setters deben evitarse a toda costa...
Justamente lo comento en el mismo artículo, al final:

"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"."

Cita:
y estoy de acuerdo con él... pero, ¿como lo soluciono? Si yo quiero saber la nota del examen de Febrero de un alumno que se abstrae en un objeto $alumno de la clase Alumno...
Haces simplemente un método, común y corriente, pero no "conceptualmente" un get/set.

Es conceptual, getter/setter como forma alternativa de acceder a los atributos, pero si necesitas hacer algo más complejo, no uses el "concepto get/set", crea un método que haga lo que necesites y no importa si inicia con la palabra "get" (eso no lo define como un getter).

Ejemplo:

Si tienes un atributo "nombre", tendrías:

Código PHP:
$alumno->getNombre();
$alumno->setNombre(); 
Esos son get/set (tienes un atributo "nombre"), pero perfectamente podrías hacer:

Código PHP:
$alumno->getNotaExamen(); 
Y no quiere decir que sea un "getter", es un método común y corriente, no lo usas para tratar de acceder a un atributo privado.

¿Se entiende la diferencia?

Complica todo lo que quieras (validaciones etc) los métodos comunes, pero evita hacerlo en los getter y setter, la idea es una forma de "solucionar" la necesidad de acceder a un dato de un atributo evitando que este sea público, por eso sugiero que definan estas reglas:
  1. atributos privados
  2. usa métodos comunes y no getter/setter
  3. Si no te queda otra, usa solo getter
  4. Si no te queda otra, usa setter
  5. trata de evitar getter y setter a la vez (efecto "atributo público")
¿Queda más claro ahora?
__________________
Blog phpsenior.com Cursos a Distancia surforce.com