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

PHP OO Aprender OOP?... pero entendiendo las bases

Estas en el tema de Aprender OOP?... pero entendiendo las bases en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Desde hace tiempo he trabajado con objetos (muy superficialmente), aunque sin detenerme a analizar porque usarlos. Ahora estoy reescribiendo parte de mis codigos y, buscando ...
  #1 (permalink)  
Antiguo 26/03/2011, 21:20
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Aprender OOP?... pero entendiendo las bases

Desde hace tiempo he trabajado con objetos (muy superficialmente), aunque sin detenerme a analizar porque usarlos. Ahora estoy reescribiendo parte de mis codigos y, buscando informacion para hacer algo realmente estructurado, me encontre con un excelente ejemplo para entender el "porque" y "paraque" de los objetos: http://stackoverflow.com/questions/1...343881#1343881 por Peter Baley

Traduccion:
--------------------------
POO no se trata realmente de una simple clase y su forma de operar, se trata de como las instancias de una o mas clases trabajan en conjunto.

Es por eso que muchos ejemplos estan basados en "Autos" y "Personas", porque, de hecho, son muy buenos para ilustrar este principio.

En mi opinion, las lecciones mas importantes en POO son encapsulacion y polimorfismo.

Encapsulacion: Unir datos y logica para manipularlos en una forma concisa y logica. Polimorfismo La habilidad de cada objeto para parecerse o comportarse como otro.

Un buen ejemplo "de la vida real" de esto, seria algo como un iterador de directorios. Donde esta el directorio? Tal vez en una carpeta local, o tal vez en algun lugar remoto como un servidor FTP... quien lo sabe?

Esto es encapsulacion:
Código PHP:
Ver original
  1. abstract class DirectoryIterator
  2. {
  3.   protected $root;
  4.  
  5.   public function __construct( $root )
  6.   {
  7.     $this->root = $root;
  8.   }
  9.  
  10.   abstract public function getAll();
  11. }
  12.  
  13. class LocalDirectoryIterator extends DirectoryIterator
  14. {
  15.   public function getAll()
  16.   {
  17.     // Logica para leer el contenido del directorio y retornarlo
  18.   }
  19. }
  20.  
  21. class FtpDirectoryIterator extends DirectoryIterator
  22. {
  23.   public function getAll()
  24.   {
  25.     // Logica para leer el contenido del directorio y retornarlo
  26.   }
  27. }

Cada clase/objeto es responsable de sus propios metodos para obtener el listado del directorio. Los datos (variables) estan asociados a la logica (funciones de la clase) que los usan.

Pero la historia no se ha terminado, recuerdan que mencione que POO es acerca de instancias de clases que trabajan en conjunto y no una simple clase/objeto?

Ok, hagamos algo con estos datos... imprimirlos en pantalla?, seguro, pero... como? HTML, texto plano, RSS?... aterricemos algo.

Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class DirectoryRenderer
  4. {
  5.   protected $iterator;
  6.  
  7.   public function __construct( DirectoryIterator $iterator )
  8.   {
  9.     $this->iterator = $iterator;
  10.   }
  11.  
  12.   public function render()
  13.   {
  14.     $dirs = $this->iterator->getAll();
  15.     foreach ( $dirs as $dir )
  16.     {
  17.       $this->renderDirectory( $dir );
  18.     }
  19.   }
  20.  
  21.   abstract protected function renderDirectory( $directory );
  22. }
  23.  
  24. class PlainTextDirectoryRenderer extends DirectoryRenderer
  25. {
  26.   protected function renderDirectory( $directory )
  27.   {
  28.     echo $directory, "\n";
  29.   }
  30. }
  31.  
  32. class HtmlDirectoryRenderer extends DirectoryRenderer
  33. {
  34.   protected function renderDirectory( $directory )
  35.   {
  36.     echo $directory, "<br>";
  37.   }
  38. }

Ok, ahora tenemos un par de clases para obtener e imprimir listado de directorios, como las usamos?

Código PHP:
Ver original
  1. // Imprimir un directorio remoto como HTML
  2. $data = new HtmlDirectoryRenderer( new FtpDirectoryIterator( 'ftp://example.com/path' ) );
  3. $data->render();
  4.  
  5. // Imprimir un directorio local como texto plano
  6. $data = new PlainTextDirectoryRenderer( new LocalDirectoryIterator( '/home/pbailey' ) );
  7. $data->render();

Ahora, yo se lo que estan pensando, "Pero Peter, no necesito dos complicadas clases para hacer esto!", bueno, si piensas asi es porque no pones atencion al punto importante, tal como sospecho que has hecho con los ejemplos de "Autos" y "Personas". No te fijes en las minucias del ejemplo, trata de entender lo que esta pasando aqui.

Hemos creado dos clases donde una (DirectoryRenderer) usa a la otra (DirectoryIterator) en una forma esperada, a veces a esto se le llama "Contrato". A la instancia de DirectoryRenderer no le importa el tipo de instancia de DirectoryIterator que recibe, asi mismo, las instancias de DirectoryIterator tampoco saben como son manipuladas y presentadas.

Porque?, porque las hemos diseñado en esa forma, ambas se pueden conectar una con otra... y funcionan!!!... eso es POO en accion.
------------------- Fin de traduccion -----------
__________________
- León, Guanajuato
- GV-Foto
  #2 (permalink)  
Antiguo 26/03/2011, 22:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Aprender OOP?... pero entendiendo las bases

En ese mismo tema, sugieren este tema http://stackoverflow.com/questions/1...-vs-procedural
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 26/03/2011, 22:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Aprender OOP?... pero entendiendo las bases

Muy buen post Triby, gracias por compartirlo
  #4 (permalink)  
Antiguo 26/03/2011, 22:47
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Aprender OOP?... pero entendiendo las bases

Abimael, no habia visto ese tema y tambien esta muy interesante, breve y muy claro... creo que me quede asombrado porque Peter Baley sabe exactamente lo que yo pensaba de los clasicos ejemplos de "Autos y Personas", sin haberme puesto a pensar en la frase final.

Me gusto mucho el resumen de codigos - funciones - clases - frameworks!

GatorV, gracias.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 12/04/2012, 20:13
Avatar de necoide  
Fecha de Ingreso: diciembre-2011
Mensajes: 9
Antigüedad: 12 años, 10 meses
Puntos: 1
Respuesta: Aprender OOP?... pero entendiendo las bases

Sigo sin entender... jajaj
No le encuentro la vuelta para que sirve OOP. Osea, siempre pienso en estructurado, es lo primero que se me viene a la cabeza. Si lo tengo que pensar en OOP no se me viene nada...

Etiquetas: bases, oop
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 17:52.