Foros del Web » Programando para Internet » PHP »

Error en concepto de encapsulamiento ?

Estas en el tema de Error en concepto de encapsulamiento ? en el foro de PHP en Foros del Web. Cuan correcto es tomar el valor de una propiedad (variable) de un objeto de esta manera ? Código PHP: echo  $Objeto -> Valor  Yo estoy ...
  #1 (permalink)  
Antiguo 07/05/2004, 07:45
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Error en concepto de encapsulamiento ?

Cuan correcto es tomar el valor de una propiedad (variable) de un objeto de esta manera ?

Código PHP:
echo $Objeto->Valor 
Yo estoy estudiando en forma independiente POO, y si bien (creo) PHP permite el acceso de esta forma, esto no seria conceptualmente correcto. Es asi ?

Esto de alguna manera no estaria violando el concepto de encapsulamiento ?

En caso de que esto no sea correcto, la forma de implementar esto según he leido es mediante un método que nos permita acceder al valor de la propiedad.

Por ejemplo:
Código PHP:
echo $Objeto->Get_Valor () 
o tal vez mediante un método mas genérico como
Código PHP:
echo $Objeto->Get_Dato ($tipo
, donde en $tipo se especifica a cual propiedad quiero acceder, por ejemplo 'valor'.

Finalmente, quiero comentar que no intento buscarle pelos al huevo, simplemento estoy en pleno proceso de aprendizaje, y realmente quiero tratar de captar lo mejor posible el concepto de la POO.

Desde ya ..., muchas gracias.
__________________
| Cabeza De Raton |
  #2 (permalink)  
Antiguo 07/05/2004, 08:25
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Efectivamente, en PHP es posible acceder a los atributos de un objeto directamente, rompiendo el encapsulamiento. Lo cual no creo que esté mal del todo, pero para ciertas cosas, en las que es mejor no saber de que manera guarda un dato un objeto, no es nada recomendable.
Yo personalmente creo métodos con el mismo nombre del atributo, que dependiendo de la cantidad de parámetros con la que son invocados, guarda el dato en el atributo o lo devuelve Por ejemplo, lo que suelo hacer bastante, por parecerme similar a lo que hacia en SmallTalk, es lo siguiente:

Código PHP:
<?php
class Objeto
{
    var 
$nombre '';

    function 
nombre()
    {
        switch(
func_num_args())
        {
            case 
1:
                
$this->nombre func_get_arg(0);
            case 
0:
                return 
$this->nombre;
        }
    }
}

$obj = new Objeto();
$obj->nombre('Pablo');
echo 
'Este Objeto se llama '.$obj->nombre();
?>
De esta manera, conservo el encapsulamiento, porque en el Setter y el Getter (ambos son el mismo método ) puedo manipular los datos antes de entregarlos a quien los solicita.

La únca contra que le veo a este método es que sugiere mucho código, aunque yo en el PHPEdit tengo un Template que con solo escribir unas letras, me hace todo el método personalizado.

Igualmente, sería interesante ver de implementar un objeto cuyo único propósito sea proveer una Api inteligente para el guardado de opciones.

saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #3 (permalink)  
Antiguo 07/05/2004, 08:29
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Justamente estoy haciendo esto. Ahora lo subo.
Gracias.
__________________
| Cabeza De Raton |
  #4 (permalink)  
Antiguo 07/05/2004, 08:32
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
El metodo tuyo es, me parce, muy bueno y simple. NO se muy bien a que te referis cuando decis que es mucho codigo, y en ultima instancia, en que te afecta que tenga un poco mas de codigo ?, en el procesamiento del servidor ?
__________________
| Cabeza De Raton |
  #5 (permalink)  
Antiguo 07/05/2004, 08:35
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 2 meses
Puntos: 0
De todas maneras no estas evitando el problema del acceso directo a la variable. Pero al carecer de directivas del tipo public, private, no creo que haya solucion.
__________________
Saludos!
  #6 (permalink)  
Antiguo 07/05/2004, 09:00
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Cita:
Mensaje Original por hogasa
De todas maneras no estas evitando el problema del acceso directo a la variable. Pero al carecer de directivas del tipo public, private, no creo que haya solucion.
Eso no lo podés evitar en PHP4, pero de esta manera le ofrecés al Usuario de tu Clase, una manera mucho más sencilla y legible de utilizar tu objeto.

De todas maneras, ya PHP5 trae el modelo de variables privadas, publicas y protegidas, para la delicia de los amantes de la POO.

Calisco : cuando me refiero a que es mucho código, es que si tenés 6 o 7 atributos publicos, que los demás pueden acceder, entonces tenés que repetir casi el mismo método 6 o 7 veces, cuando eso en programación es duplicación de código, y lo mejor es refactorizarlo en algo más general. Yo sigo utilizando este método porque ayuda mucho a la legibilidad del código.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #7 (permalink)  
Antiguo 07/05/2004, 09:20
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 2 meses
Puntos: 0
Lo de "más sencilla y legible" me parece relativo. Yo he programado en VB y C++ (a pesar de no ser OOP puros) y estoy mas acostumbrado a acceder a las propiedades de la forma
$objeto->propiedad = "valor";
que
$objeto->propiedad("valor");
Por ende el primero me parece (a mi) mas legible que el segundo.
Ademas te permite diferenciar lo que es un metodo de una propiedad.
Imagina que tuvieras esto:
$objeto->sort('campo');

Estoy invocando un metodo sort o estoy asignandole a la propiedad sort el valor 'campo'?
__________________
Saludos!

Última edición por hogasa; 07/05/2004 a las 09:28
  #8 (permalink)  
Antiguo 07/05/2004, 09:32
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Lo que pasa es que tu manera de acceder a las variables (propiedades) del objeto está 'pasando por alto' el encapsulamiento del objeto.

Yo creo que en PHP4 esto te va a funcionar correctamente, pero si en PHP5 el encapsulamiento es determinante, esa metodologia de acceso no va a estar permitida.

Lo que sucede es que PHP4 es un hibrido entre POO y programacion estructurada, y la buena POO cuenta por cuenta propia.

En forma particular, me alegra MUCHISIMO que PHP5 contenga conceptos mas formales de POO.
__________________
| Cabeza De Raton |
  #9 (permalink)  
Antiguo 07/05/2004, 09:37
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
hogasa, justamente vos lo dijiste "estoy más acostumbrado". Por ende, es tu opinión basado en TUS experiencias. Y creo yo, bastante influenciadas por lenguajes que no son POO puros, como bien decís.
Cuando me referia a más legible, estaba comparando :

$objeto->alto('48px');
vs.
$objeto->set('alto', '48px');

Porque justamente, la primera forma, la arrastro desde SmallTalk, que SI es un lenguaje puro de Objetos ( incluso más que Java ).

El tema con Smalltalk, es que luego de definir tus atributos, podés decirle que te cree los Accessors automáticamente, eso es lo que yo hago con los KeyboradTemplates del PHPEdit.

Y en cuánto al ejemplo que das, es un problema más semántico que otra cosa, para mi es lo mismo de legible que sea un acceso a un atributo, que la llamada a un método, porque las DOS cosas, en realidad deberian ser llamadas a métodos, tanto el pedido de ordenar algo, como el ingresar un valor a un atributo. En lenguajes como Smalltalk, no existe el acceso directo a atributos, de ninguna manera, TODO es a base de métodos, por lo que me parece bien que no distingas entre uno y otro.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #10 (permalink)  
Antiguo 07/05/2004, 09:38
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
Si yo veo una linea de tu codigo $objeto->sort('campo'), creo que realmente no se que estoy haciendo.

Por otro lado, si yo escribo ...
$objeto->Dale_vieja ($mi_vieja) ...

Que estoy haciendo ?
Si no tenes info del metodo Dale_Vieja, no vas a saber TAMPOCO de que se trata dicho metodo.

Yo creo que lo que hace o no hace un metodo esta en primera instancia en definir adecuadamente el nombre del metodo, y en segunda instancia, uno tiene que tener el conocimiento adecuado de los metodos de la clase como para utilizar el objeto correctamente.

Por ejemplo ...
$obj->nombre('Pablo');
A mi a simple vista pareciera que es una asignacion, ya que estoy pasando el valor 'Pablo' al metodo nombre.

y si tengo ....
echo obj->nombre();
creo que esta medianamente claro que estoy tomando el valor de la propiedad nombre.
__________________
| Cabeza De Raton |

Última edición por Calisco; 07/05/2004 a las 09:40
  #11 (permalink)  
Antiguo 07/05/2004, 09:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Yo como "usuario" de classes (OOP) .. uso métodos con nombres alegóricos a lo que hacen tipo:

$obj->asigna_nombre('pepe');
$obj->borra_nombre();
$obj->yoquese_nombre();

Y .. bueno .. una buena documentación (creada con PHP Doc o similar que cumpla los standars que UDs. conocen mejor que yo) y .. listo, el que use ese objeto tendrá que tener a mano la documentación .. Pero con nombres tipo accion_propiedad() creo que son bastante intuitivos .. eso a nivel de metodos públicos (hablo desde el punto de vista del "usuario" del objeto").

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 07/05/2004, 10:04
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 2 meses
Puntos: 0
Cita:
Mensaje Original por Calisco
Lo que pasa es que tu manera de acceder a las variables (propiedades) del objeto está 'pasando por alto' el encapsulamiento del objeto.
Totalmente de acuerdo. Lo que que digo es que sin directiva private no vas a poder evitar el problema del encapsulamiento. Ergo (se me pego del arquitecto ), hacer getter y setter no le veo mucho sentido (salvo que estes acostumbrado a esta sintaxis)

Cita:

Yo creo que en PHP4 esto te va a funcionar correctamente, pero si en PHP5 el encapsulamiento es determinante, esa metodologia de acceso no va a estar permitida.
Depende de como implementen esto. En VB podes declarar un metodo como getter o setter y luego accederlo como:
objeto.prop = "val" //getter
var = objeto.prop //setter
__________________
Saludos!
  #13 (permalink)  
Antiguo 07/05/2004, 13:13
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
hogasa:

Ta bien, pero de ultima esto termina siendo una cuestion personal y a donde yo apunto, conceptal.

Yo entiendo perfectamente lo que me decis; pero bueno ..., pasa que estuve leyendo algo de teoria de OOP y se 'recomienda' tratar de usar getter/setter.

Cluster:
Pasa que el metodo que comenta Webstudio esta bueno porque es getter y setter a la vez. SI no le pasas un valor al metodo, hace de getter y si le pasas un valor, hace setter.

se podria definir este metodo como $obj - > GS_nombre ($nombre), que se yo.
Igualmente, lo mio es una opinion de poca importancia; hace poco empece con OOP.
__________________
| Cabeza De Raton |
  #14 (permalink)  
Antiguo 07/05/2004, 14:38
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 2 meses
Puntos: 0
Ojo. No me tomen como el abanderado del "no usen getter/setter". Yo estoy de acuerdo en que se deben usar por el tema del encapsulamiento. Pero al no haber directivas de privacidad en PHP4...
A lo mejor me estoy obviando algun otro beneficio de los getters/setters. Pero hacerlo solo por respetar las reglas de POO...
__________________
Saludos!
  #15 (permalink)  
Antiguo 09/05/2004, 17:08
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 1 mes
Puntos: 4
__________________
| Cabeza De Raton |
  #16 (permalink)  
Antiguo 09/05/2004, 19:25
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Cita:
Mensaje Original por hogasa
Ojo. No me tomen como el abanderado del "no usen getter/setter". Yo estoy de acuerdo en que se deben usar por el tema del encapsulamiento. Pero al no haber directivas de privacidad en PHP4...
A lo mejor me estoy obviando algun otro beneficio de los getters/setters. Pero hacerlo solo por respetar las reglas de POO...
Que pasa? el encapsulamiento ya de por si no te parece un motivo suficiente?
El que un objeto no le tenga que interesar como otros objetos guardan internamente sus datos, no te parece suficiente?

En un ejemplo como este:
Código PHP:
<?php
class Reloj
{
    var 
$hora null;
    
    function 
Reloj()
    {
        
$this->hora time();
    }
    
    function 
mostrarHora()
    {
        return 
date('H:i:s'$this->hora);
    }
    
    function 
mostrarFecha()
    {
        return 
date('d/m/Y'$this->hora);
    }
}
?>
Queda patente que sin un Getter adecuado, todas las clases que quisieran saber la hora, deberian tener métodos para formatear los datos de $reloj->hora. Lo mismo seria necesario si quisieran actualizar este valor dentro de $Reloj. En cambio, gracias al encapsulamiento, con solo implementar este método dentro de Reloj :

Código PHP:
    function reset()
    {
        
$this->hora time();
    } 
alcanza. Y los Getters/Setters son la herramienta adecuada para que el encapsulamiento nos sirva para algo.

No es solo por respetar los preceptos de la POO solo porque si.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:05.