Ver Mensaje Individual
  #9 (permalink)  
Antiguo 31/12/2008, 09:10
Sanva
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 18 años, 4 meses
Puntos: 1
Respuesta: Duda: Como inicializar propiedades públicas (filtradas) de un objeto

Cita:
Los atributos públicos están prohibidos (99,99% de los casos)
La forma de inicializar es a través del constructor y/o métodos get/set
Estamos totalmente de acuerdo.

Cita:
Posteriormente la validación la podrás hacer a través de un método privado de la propia clase, manteniendo la simplicidad en el constructor y en los set/get.
En esto no. He leído un artículo tuyo al respecto, en el cual comentas que
Cita:
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.

(...)

Nota: esto es muy a nivel personal, hay opiniones encontradas sobre tener una lógica elemental dentro de un set/get o hacerlo tan extenso como necesitemos. Claramente yo estoy en el primer grupo.
Yo estoy en un grupo intermedio... creo que se les puede añadir lógica, pero dependerá mucho de los casos, y de cómo sea esa lógica.

También he leído un artículo de Allen Holub en el que dice que los getters/setters deben evitarse a toda costa... y el mayor argumento que leo —o al menos así lo comprendo yo— es la necesidad de mantener el ocultamiento de la implementación interna del objeto. Estoy de acuerdo, pero... ¿qué gano al utilizar otro tipo de métodos en lugar de un getter? Por ejemplo, él dice que

Cita:
What if you need to change the accessed field's type? You also have to change the accessor's return type. You use this return value in numerous places, so you must also change all of that code. I want to limit the effects of a change to a single class definition. I don't want them to ripple out into the entire program.
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...

Cita:
If X was an int, but now must be a long, you'll get 1,000 compile errors.
Sigo de acuerdo... y si yo implemento el acceso a la nota del alumno como un getter que devuelve un int y luego lo tengo que cambiar a un float, por ejemplo, obtendría errores —en un lenguaje fuertemente tipado, claro—... pero... es que ese problema no tiene nada que ver con el getter-en-sí, el problema está con el hecho de devolver valores, ya que si implemento un método nota que me permita obtener la nota del alumno, voy a tener el mismo problema...

Lamento si me he enrollado demasiado y... si no te gusta debatir sobre el sexo de los ángeles, lo dejamos y espero a que alguien se interese por el tema —o que quedo con mis propias conclusiones, si no hay nadie que me las rebata.

Nota: Me disculpo de antemano por si a alguien le molestan los contenidos en inglés, si es necesario los traduzco.