Ver Mensaje Individual
  #17 (permalink)  
Antiguo 03/01/2009, 07:36
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:
Es más simple de lo que parece, vuelvo al principio, te estás complicando exageradamente desde el planteo de tu duda y cómo abordas la implementación.
Bueno, eso es circunstancial... es lo que tienen las discusiones, que tienden a complicarse.

Cita:
Y tu ejemplo es claro, no estás entendiendo el punto del principio ni la diferencia con los getter /setter (el postulado anterior es incorrecto).
Aquí es donde tú y yo no estamos de acuerdo, y nuestra discusión tiene sentido: Tú dices que un getter/setter no debe tener lógica interna, que es simplemente una asignación a una propiedad del objeto. Desde tu punto de vista mis argumentaciones son erróneas, puesto que realmente sí estoy violando el principio de ocultación al revelar los nombres de las propiedades del objeto, y al permitir una asignación a una propiedad privada —lo que la convertiría en pública, y haría que los getter/setter sean una absoluta estupidez.

Sin embargo mi punto de vista es otro: Yo sí creo que los getter/setter deben tener una lógica interna. Y teniendo en cuenta eso, lo que yo expongo al usuario es una propiedad del objeto con un determinado nombre, pero que internamente su nombre puede ser totalmente distinto, de hecho puede tener una lógica asignada y una sola asignación de propiedad puede ser internamente una asignación doble. Por ejemplo:

Código PHP:
class Prueba{
    
    private 
$_t;
    private 
$_f;
    
    public function 
__construct($arg 37){
        
        
$this -> __set('temperatura'$arg);
        
    }
    
    public function 
__set($var$value){
        
        switch(
$var){
            
            case 
'temperatura':
            
                if (
$value 35 || $value 43$this -> _t $value;
                else throw new 
MyException('Temperatura imposible');
                
                if (
$value 37$this -> _f true;
                else 
$this -> _f false;
                
                break;
            
            default:
                
                throw new 
MyException02('Error');
            
        }
        
    }
    
    public function 
__get($var){
        
        switch(
$var){
            
            case 
'temperatura':
            
                return 
$this -> _t;
            
            default:
                
                throw new 
MyException02('Error');
            
        }
        
    }
    
    public function 
tieneFiebre(){
        
        return 
$this -> _f;
        
    }
    

Ahí creo que se ve claramente lo que quiero explicar. El API del objeto indicará que se puede acceder a una propiedad temperatura, la cual admite asignación de enteros desde el 36 al 42. Además de eso, existe un método tieneFiebre para comprobar si el sujeto tiene o no fiebre. Bien, pero ese es el API pública, internamente el objeto no tiene una propiedad pública —ni privada-pública por acción de los getter/setter— llamada temperatura, no, lo que tiene son dos propiedades privadas llamadas _t y _f, las cuales son definidas según una lógica interna, y que pueden cambiar —tanto sus nombres como sus tipos internos en el caso de ser un lenguaje tipado, y también la lógica que establece si el sujeto tiene o no fiebre, o una nueva propiedad/método, según proceda, que permita determinar la especie del sujeto por si se quiere ampliar la funcionalidad de la clase base (esto es, sin herencias, por lo que sea) y establecer otras reglas para determinar si el sujeto tiene o no fiebre, según su pertenencia a una u otra especie.

Creo que ahora me he explicado al completo, y creo que nuestras discrepancias no son acerca de que los getter/setter se puedan utilizar de forma general o no... la discusión está en si pueden o no llevar una lógica interna: Si pueden, se pueden usar pues no violas el principio de ocultación... si no pueden, no se pueden usar porque sí lo violas.

Y la discrepancia en si se puede o no se puede usar lógica interna creo que ya pertenece al área de las opiniones personales.