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.