Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Visibilidad de Propiedades y Metodos

Estas en el tema de Visibilidad de Propiedades y Metodos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos! Revizando "php.net/manual" por una duda que tenia sobre visibilidad de las propiedades y metodos de un objeto, encontre un codigo que demuestra que en ...
  #1 (permalink)  
Antiguo 05/06/2008, 11:17
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Pregunta Visibilidad de Propiedades y Metodos

Saludos!

Revizando "php.net/manual" por una duda que tenia sobre visibilidad de las propiedades y metodos de un objeto, encontre un codigo que demuestra que en PHP es posible acceder a propiedades privadas de un objeto, desde otra instancia de la misma clase, a traves de un metodo de la misma clase.

El ejemplo (el cual modifique del original para hacer mas pruebas) hago una clase "Prueba" con una propiedad publica y otra privada

seria algo como el siguiente:

Código PHP:
class Prueba{
    
    private 
$privada;
    public 
$publica;
    
    function 
Prueba($privada$publica){
        
$this->privada $privada;
        
$this->publica $publica;
    }
    
    function 
mostrarActual(){
        echo(
"<br> valor Privado: ".$this->privada);
        echo(
" valor Publico: ".$this->publica);
    }
    
    function 
mostrarOtro($Obj){
        echo(
"<br> Otro valor Privado: ".$Obj->privada);
        echo(
" Otro valor Publico: ".$Obj->publica);
    }
    
    private function 
establecerDatos($privada$publica){
        
$this->privada $privada;
        
$this->publica $publica;
    }
    
    static function 
crearDDDDD(){
        
$x = new Prueba("Privado_CCCCC""Publico_CCCCC");
        
$x->establecerDatos("Privado_DDDDD""Publico_DDDDD");
        return 
$x;
    }
    
}

$a = new Prueba("Privado_AAAAA""Publico_AAAAA");
$b = new Prueba("Privado_BBBBB""Publico_BBBBB");

$a->mostrarActual(); 
// MUESTRA    valor Privado: Privado_AAAAA valor Publico: Publico_AAAAA

$b->mostrarActual(); 
// MUESTRA    valor Privado: Privado_BBBBB valor Publico: Publico_BBBBB

$b->mostrarOtro($a); 
// MUESTRA    Otro valor Privado: Privado_AAAAA Otro valor Publico: Publico_AAAAA

$a->mostrarOtro($b);
 
// MUESTRA    Otro valor Privado: Privado_BBBBB Otro valor Publico: Publico_BBBBB

Prueba::crearDDDDD()->mostrarActual(); 
// MUESTRA    valor Privado: Privado_DDDDD valor Publico: Publico_DDDDD

$a->establecerDatos("Privado_EEEEE""Publico_EEEEE"); 
// MUESTRA    Fatal error: Call to private method Prueba::establecerDatos() 
// Como se esperaba... 
Bueno la duda es si esto es correcto en la programacion orientada objetos y no rompe con los principios de encapsulamiento. Desconozco si esto es valido y si se puede hacer en otros lenguajes.

Gracias !!
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
  #2 (permalink)  
Antiguo 05/06/2008, 16:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Visibilidad de Propiedades y Metodos

Hola Lord Kazuky,

Es "correcto" ya que estás parado dentro de la misma clase, aunque yo creo si rompe con el encapsulamiento.

Desconozco si es posible hacerlo en otros lenguajes.

Saludos.
  #3 (permalink)  
Antiguo 05/06/2008, 21:11
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Visibilidad de Propiedades y Metodos

Cita:
Iniciado por Lord Kazuky Ver Mensaje
Saludos!
Bueno la duda es si esto es correcto en la programacion orientada objetos y no rompe con los principios de encapsulamiento. Desconozco si esto es valido y si se puede hacer en otros lenguajes.
¿Me puedes detallar los puntos concretos de tu duda?

No veo nada raro si tienes atributos privados pero luego acceso a métodos públicos (?).

Tu haces el diseño que quieras de acuerdo a las posibilidades del lenguaje, pero el lenguaje no hace un buen o mal diseño, lo haces tú.

Es el mismo caso que los getter/setter, se recomienda que siempre los atributos son privados y cuando queramos acceder a ellos usemos métodos públicos, tanto para definir el valor como para obtenerlo... pero... si tenemos todos los atributos privados y hacemos todos los métodos set y get, tenemos indirectamente un "atributo público" (ya que desde el exterior cualquiera puede modificarlo y accederlo).

¿Ahora bien... es problema del lenguaje o del uso que le doy (diseño)?

PD: sinceramente no entendí tu duda.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #4 (permalink)  
Antiguo 05/06/2008, 21:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Visibilidad de Propiedades y Metodos

Se refiere a que si es correcto o no que desde una clase puedas instanciar una clase del mismo tipo y accesar a sus métodos privados...
  #5 (permalink)  
Antiguo 05/06/2008, 21:24
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Visibilidad de Propiedades y Metodos

Mira, en realidad el encapsulamiento lo rompe el programador que utiliza mal los objetos. Los lenguajes solo ofrecen mecanismos para facilitar el encapsulamiento. Sin embargo, hay lenguajes orientados a objetos que no tienen modificadores de acceso y sin embargo son muy poderosos (sin ir más lejos, javascript es un buen ejemplo).

Una cosa que surge aca es si "rompe con el paradigma de objetos". El paradigma esta en el programador. Uno puede estar programando en c, con structs y funciones miembro del struct, o simplemente funciones que trabajen sobre un struct como si estuvieran mandando un mensaje al objeto que representa el struct y estar pensando en objetos.

Si piensas en objetos, entonces programas en objetos. Si piensas en lógico, programas en lógico, si piensas en funcional, programas en funcional. Si piensas en eventos, podriamos decir que programas en eventos, independientemente del lenguaje en el que estes parado.

Y puedo irme muuuy lejos con teoría pero no creo que de para mucho más... Cualquier cosa mándame un mensaje.
__________________
Saludoss
Guille
  #6 (permalink)  
Antiguo 06/06/2008, 13:59
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Pregunta Respuesta: Visibilidad de Propiedades y Metodos

Mi duda es: " ¿Para el Correcto Diseño según la Metodología de Programación orientada a Objetos es valido que dentro de una clase puedas instanciar una clase del mismo tipo y acceder a sus métodos privados?"

Naturalmente estoy de acuerdo que todo depende de como se piense y como se utilice. Pero mi duda es concretamente para el diseño.

Bueno yo creería que esto es valido siempre que NO este creando un acceso indirecto al método privado. Por ejemplo crear un método público que internamente llame a un método privado pasándole los parámetros que yo recibí del método público.

Código PHP:
private function procesoEspecialprivado($var){ ........ }
public function 
backdoor($var){ $this->procesoEspecialprivado($var); } 
O como dice Enrique:

Cita:
si tenemos todos los atributos privados y hacemos todos los métodos set y get, tenemos indirectamente un "atributo público" (ya que desde el exterior cualquiera puede modificarlo y accederlo).
Digamos una posible utilidad de poder hacer esto es si en una clase: ‘Item’ con un método Item::ConsultarItems (id)'
El cual me crea una lista con todos los objetos ítems que encuentre con un mismo ‘id’. Por cada instancia de 'Item' que el método cree, podría ejecutar métodos privados (como algunos que permitan establecer algunas propiedades). Estos métodos privados se definieron como tal para que desde 'Afuera' de la clase no pudieran ser utilizados (por ejemplo establecer esas propiedades), de todas formas 'ConsultarItems()' es un método que se encuentra dentro de la misma clase 'Item' y en ese mismo método se definen los posibles valores de los parámetros de los otros métodos ‘privados’ que se llamen.

Pero como mencione, la duda es si en un diseño "Correcto" puedo tener en cuenta este detalle o característica. También me gustaría saber si esto se podría hacer en otros lenguajes OO, pues si en todos o la mayoría se puede entonces podría pensarse que es valido.

Gracias ;)
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
  #7 (permalink)  
Antiguo 06/06/2008, 14:07
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Visibilidad de Propiedades y Metodos

Te estás complicando innecesariamente. No sé para que le das tanta vueltas al asunto. Que se pueda hacer "sintácticamente" no significa que esté bien... cuando se habla de "diseño" se habla de "interpretación en base a un contexto", por lo cual seguir teorizando sobre la "nada" (como contexto) no nos llevará a ningún lado.

Quedate con la siguiente frase: "la mejor arquitectura es la simplicidad".

En lo personal no creo en los diseños complejos y creo que tú le estás dando la vuelta tanto porque quieres hacer un diseño complejo.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 06/06/2008, 14:20
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Visibilidad de Propiedades y Metodos

El paradigma de objetos no habla de modificadores de acceso de los métodos. Es puro jugo sintáctico de algunos lenguajes. El paradigma de objetos solo habla de "encapsulamiento del estado interno".
Eso podriamos decir incluye a las variables nada mas, los métodos públicos/privados no estarian contemplados en ese caso.

Sino mira smalltalk, uno de los primeros lenguajes orientados a objetos y no tiene modificadores de acceso. Simplemente encapsula las variables.

Otra cosa que esta relacionada con el encapsulamiento, es poder decirle a un objeto qué hacer sin saber como lo hace, y eso nos hace más felices.

Con respecto a lo que dice Enrique, estoy de acuerdo :). Para lo mismo que dijo él, yo utilizo la frase:

Cita:
KISS (Keep it simple, stupid)
Sin ánimos de ofender, =P.

Una sola cosa más que me gustaría remarcarte:

El diseño orientado a objetos no habla de encapsulamiento. Podríamos sí hablar de diseño del lenguaje.

YYY... para rematar, llendo a tu pregunta concreta:

Cita:
es valido que dentro de una clase puedas instanciar una clase del mismo tipo y acceder a sus métodos privados?"
Sí, es válido. Principalmente porque muchas veces hay objetos que se encargan de instanciar otros de la misma clase (en el caso de que hablemos de un lenguaje con clases), y con respecto a que accedan a sus métodos privados, te diría que tambien es posible, hasta en Java, C#, C++, puesto que los modificadores son de la siguiente manera:

  • private: se tiene acceso solo dentro de la misma clase (sea el mismo objeto u otro).
  • protected: extiende los accesos a las subclases(idem arriba, sea el mismo objeto u otro).
  • public: todos tienen acceso.
Espero haber aclarado un par de cosas...
Suerte!
__________________
Saludoss
Guille
  #9 (permalink)  
Antiguo 07/06/2008, 20:43
Avatar de Lord Kazuky  
Fecha de Ingreso: junio-2006
Ubicación: 7F.00.00.01
Mensajes: 123
Antigüedad: 17 años, 10 meses
Puntos: 5
Respuesta: Visibilidad de Propiedades y Metodos

Ok gracias con eso ultimo quedo claro. Perdon por "darle tantas vueltas" pero necesitaba entender.

Y bueno sobre lo de hacer las cosas simples es obvio (a veces tanto que uno no se acuerda) asi deberia ser para todas las cosas de la vida :P
__________________
Saludos.
"Cualquier tonto puede escribir código que un computador entiende. Los buenos programadores escriben código que los humanos pueden entender. ;)"
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 01:30.