Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/03/2011, 21:20
Avatar de Triby
Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 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