Comunidad de diseño web y desarrollo en internet online

Cambiar/modificar varias propiedades mediante un solo método

Citar            
MensajeEscrito el 23 Ene 2013 10:54 pm
Buenas, estoy intentando aprender un poco de POO sobre PHP y, bueno, hay cosas que aún se me escapan. Entiendo lo que es una clase, lo que es un objeto, el tema de las propiedades, los métodos y el tema de los constructores, destructores, selectores (get) y modificadores (set).

Lo que no encajo muy bien es el hecho de que, según lo que leo en muchos tutoriales, para modificar una propiedad la forma correcta es usar el set y para recuperarla el get. Entiendo que es la forma correcta para facilitar el mantenimiento del código pero...

¿Hay que estar creando un get o un set por cada propiedad a la que se quiera acceder/modificar?

Código PHP :

class Humanos{
   public $ojos;
   public $brazos;
   public $piernas;
   public $boca;
   public $nariz;

   function __construct(){
       $ojos = 2; 
       $brazos = 2;
       $piernas = 2;
       $boca = 1;
       $nariz = 1;
   }

   function setOjos($ojos){
      $this->ojos = $ojos;
   }

   function getOjos(){
      return $this->ojos;
   }

   function setBrazos($brazos){
      $this->brazos = $brazos;
   }

   function getBrazos($brazos){
      return $this->brazos;
   }


Etc etc etc...

¿No hay alguna forma de controlar la asignación de estas propiedades desde un único método?

Nota: Perdonad si hago preguntas absurdas. Estoy pasando de la estructurada a la POO y me está costando un poco

Gracias ^^

Por Melkart

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Ene 2013 11:15 pm
El uso de métodos getter y setter tiene su lógica. Previamente ten en cuenta una cosa: Las propiedades de los objetos suelen ser privadas para que no sean accesibles desde fuera de la clase. El ser accesibles desde fuera implica que pueden ser modificadas por otra clase, lo que dependiendo del código podría llevar a causar desastres en tu aplicación.

Si una propiedad está definida como pública puedes acceder a ella mediante

Código PHP :

$humano->ojos

por lo que podrías perfectamente usar

Código PHP :

$humano->ojos = "azules";
echo $humano->ojos;

en lugar de

Código PHP :

$humano->setOjos("azules");
echo $humano->getOjos();


Sin embargo de esa forma modificas la propiedad de forma directa, cambiándole el valor sin más. Puede ser que quieras hacer otra operación aparte de la asignación o la devolución del valor, como en este ejemplo:

Código PHP :

class Person {
    private $name;

    public function __construct() {
        //
    }

    public function getName() {
        return ucfirst($this->name);
    }

    public function setName($name) {
        this->name = $name;
        // Guardar $name en base de datos.
    }
}


En ese ejemplo el método get devuelve el nombre, pero por el camino le pone la primera letra en mayúsculas. Y el método set guarda el nombre el la base de datos, aparte de cambiar el valor de la propiedad. El uso de los métodos accesores te permite eso, hacer pasos intermedios que no podrías hacer si accedes directamente al valor de la propiedad.

Por Alivan

288 de clabLevel

3 tutoriales

Genero:Masculino  

Aprendo de Internet

chrome
Citar            
MensajeEscrito el 23 Ene 2013 11:49 pm
Entonces, se consideraría el hecho de acceder a la propiedad directamente, o el poner dichas propiedades como publicas una mala práctica?

Es que el problema es que cuando me dices que podría ser accedida desde otra clase y que podría ser desastroso no me hago a la idea de que clase de peligro podría entrañar. Soy bastante novato en esto y no lo entiendo bien, ¿te refieres a un problema de seguridad? es que si yo mantengo y programo el código no entiendo realmente ese peligro.

Agradezco tu ayuda, pero ya advertí que más verde no podría estar

Por Melkart

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Ene 2013 12:29 am
Se puede considerar una mala práctica, sí. En realidad es una especie de reglas a seguir sobretodo cuando trabajas con más personas y cuando das tu código a otras personas. También es por tema de funcionalidad y mantenimiento. Supongamos que tienes la siguiente clase:

Código PHP :

class Person {
    public $name;
    public $surname;

    public function __construct($name, $surname) {
        $this->name = $name;
        $this->surname = $surname;
    }
}

Y tú piensas "este código solo lo voy a ver yo y nadie más" y no usas métodos accesores por eso mismo. Pero resulta que un tiempo más tarde tienes que ampliar tu código para añadir una propiedad que almacene el nombre completo. Por supuesto, si cambias el nombre debe cambiarse esa propiedad. Entonces ahí se te complica la cosa, pues tendrías que crear un método aparte que llene el nombre completo y llamarlo después de modificar el nombre:

Código PHP :

$persona->name = "Pepito";
$persona->renewFullName();

Esto, al fin y al cabo, se hace poco práctico, por ello es mejor que permanezca unificado para que cada vez que modificas el nombre uses una sola sentencia, y no dos. El siguiente código sería más práctico en ese sentido:

Código PHP :

class Person {
    private $name;
    private $surname;
    private $fullName;

    public function __construct($name, $surname) {
        $this->name = $name;
        $this->surname = $surname;
        $this->renewFullName();
    }

    public function setName($name) {
        this->name = $name;
        $this->renewFullName();
    }

    public function renewFullName() {
        $this->fullName = $this->name . " " . $this->surname;
    }
}

De esta forma, en cuanto introduzcas el nuevo nombre se cambiará también el nombre completo. Como mencioné antes, usar los métodos te permite hacer tareas intermedias como esta, o como guardar el nombre en una base de datos. Es uno de los objetivos de la POO, que sea modular. Realmente cuando usas un método set/get no importa lo que pase por dentro de ese método, solo que lo haga. Lo que haces es tratar dicho valor o hacer lo que sea que te convenga que hacer.

Este ejemplo también vale para explicar lo de que se pueda "romper" tu aplicación. Supón que haces una clase como esa y se la das a un compañero para que trabaje con ella. ¿Qué pasa si usa $persona->name para acceder al nombre porque se le hace más cómodo? Que posteriormente no se cambia el nombre completo, y fullName conservaría el nombre antiguo.
Imagina que tienes puesto que te llamas "Pepe Vega" y te cambias el nombre por "Pepito". Si después tienes que mostrar el nombre completo va a seguir siendo "Pepe Vega" en lugar de "Pepito Vega". En este caso es un nombre, pero en clases más complejas puede significar que el programa se rompa y de error. Ese es el motivo principal por el que las propiedades sean privadas, para que no se pueda acceder de forma directa a su valor.


Al final del día tienes ambas formas de acceder al valor de la propiedad(si las pones públicas). Queda en tu decisión si hacerlo a tu manera o seguir mejores prácticas para que en el futuro todos se entiendan mejor con tu código, y tú entiendas el de los demás, sobretodo en el trabajo en grupo, y por supuesto que no haya problemas.

Por Alivan

288 de clabLevel

3 tutoriales

Genero:Masculino  

Aprendo de Internet

chrome
Citar            
MensajeEscrito el 24 Ene 2013 01:24 am
Perfecto! , lo he entendido a la perfección con tu última explicación. Eres muy bueno explicando, en serio. Al fin consigo saber la razón de dichas prácticas y recomendaciones.

Muchísimas gracias :))

Por Melkart

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Ene 2013 12:25 pm
Bueno, PHP no tiene setters ni getters así que sí, básicamente tienes que hacerlas a mano.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.