Design_Patterns::factory();

Nos juntamos varias personas de varios países en el servidor de chat irc.freenode.net, que creo que es de los servidores mas cotizados para el área tecnológica. En este server encontramos salones como los oficiales de #ubuntu, #kubuntu, #ubuntu-es, #kubuntu-es, ##php, #php-es, #php.thinktank y muchos muchos mas, pero en esos son los que me van a encontrar comúnmente. Ayer me comprometí a dar una charla por el chat sobre patrones de diseño, sobre el patrón “factory”, y este es un log de lo que vimos, para que la gente que no pudo llegar pueda revisar lo que vimos.

[kib0] no me vengas con tonteras =)
[clue] StR: yo empecé a leerme el ibro de phparchitect
[StR] clue: ok…. y podés decirnos el concepto de un patrón?
[StR] aver…  les cuento
[clue] kib0: descansa
[kib0] nah
[clue] StR: y más o menos me hago una idea
[kib0] paradigmas de programacion.. patrones de diseño..
[juchipilo] yo tengo idea tambien.. lei un poco del tema
[juchipilo] por cierto si lo quieren bajar yo tengo el pdf
[StR] un patrón es un molde…. un concepto de un problema ya resuelto
[clue] :)
[StR] por ejemplo.. cuantos de nosotros hemos desarrollado un sistema para validar usuario?
[StR] muchas y muchas veces
[StR] y creen que como lo hemos hecho es la mejor forma?
[StR] o puede haber una mejor forma?
[StR] un patrón nos dá la solución a un problema común que alguien mas ya lo pensó y lo solucionó y entre muchos han diseñado la forma óptima de resolverlo
[StR] un patrón no es una receta de cocina
[StR] no es un conjunto de reglas a seguir… sino que solo es un concepto.. una forma de hacerlo..
[StR] ya implementarlo puede variar, de problema a problema… pero basado en el mismo concepto
[StR] me explico?
[juchipilo] si
[StR] todos hasta ahí?
[StR] ok
[kib0] aja
[clue] si
[StR] entonces…  el pattern factory es una forma de crear objetos de una forma facil
[StR] los patrones de por sí están orientados a programación orientada a objetos.. porque es la forma escalable de programar
[StR] como programadores de PHP orientados a objetos, tenemos la costumbre de crear un archivo para cada clase y guardarlos en una cierta carpeta
[StR] por ejemplo…. Tenemos nuestra clase  Persona .. en el archivo Persona.php en la carpeta “clases”
[StR] esa persona podemos tener varios métodos y propiedades
[StR] y vamos a tener varias clases que heredan de la clase Persona
[StR] tenemos,  Empleado, Jefe, Cliente .. cuantas clases queramos
[StR] cada vez que vamos a crear un objeto de clase Empleado por ejemplo…. primero tenemos que hacer un require_once(’clases/Persona.php’);
[StR] y luego  require_once(’clases/Empleado.php);
[funky] buenas
[StR] y luego   declarar el objeto   $miEmpleado =  new Empleado($nombre,$telefono,$puesto);
[StR] por ejemplo
[StR] todos hasta ahí?
[juchipilo] buenas, funky, hay una platica por STR. pasale
[clue] sep
[efra] got it
[clue] :)
[funky] juchipilo: lo sé
[StR] ok… cuantos de ustedes tienen el libro de “guide to PHP design patterns” ?
[clue] yo lo tengo
[StR] alguien mas?
[juchipilo] yo
[StR] ok…  si se dan cuenta, la Factory es la primera de las patterns que enseñan
[juchipilo] http://www.juchipila.com/libro/  [[ aqui esta para aquellos que lo queiran bajar en pdf
[StR] es el capítulo 3, página 32
[StR] porqué?   porque crear objetos es de las cósas básicas programación orientada a objetos
[StR] y por consiguiente de programación orientada a patrones
[clue] no es la pag 53?
[StR] eso.. perdón
[clue] 3 the Factory Pattern
[clue] vale perfecto, perdona
[KarlsBerg] Buenas
[clue] hola KarlsBerg
[KarlsBerg] hola freak
[clue] KarlsBerg: hazte de este libro
[clue] [juchipilo] http://www.juchipila.com/libro/  [[ aqui esta para aquellos que lo queiran bajar en pdf
[clue] para seguir al conversación
[StR] ok….   que hace una factory….. crea objetos…
[StR] cuando la creación del objeto puede ser muy complicada, es mas facil usar una factory
[StR] por ejemplo, el ejemplo que usan en ese capítulo es crear un objeto de la clase Color
[StR] en la página 60 podemos ver el código de la clase
[StR] y podemos ver que el constructor recibe 3 parámetros,   $red, $green, $blue
[StR] en la página 62 tenemos la clase “CrayonBox”
[StR] esa es una clase factory
[StR] miremos el método  &getColor($color_name)
[StR] si se dan cuenta.. getColor recibe un nombre de color
[StR] por ejemplo “red”
[StR] y busca en un array los 3 colores RGB que componen ese nombre de color para construir un objeto de clase Color y enviarle esos 3 parámetors para enviarle al constructor
*** ChanServ gives channel operator privileges to xiam.
[StR] miren que  la linea:  return new Color($color[0],$color[1],$color[2]);   se encarga de retornar un objeto
[StR] todos hasta ahí?
[kib0] si
[juchipilo] sip
[StR] alguien no entiende algo del código de la página 60 y página 62?
[clue] si
[StR] ok.. entonces ya vimos nuestro primer ejemplo de una clase factory
[StR] porqué no mas facil declaramos un método para la clase Color que reciba un nombre.. por ejemplo así:
[StR] $color =  new Color();
[StR] $color->getColor(’red’);
[StR] 1) porque estamos permitiendo crear colores invisibles….   osea… que se haga el objeto sin propiedades…. y eso nos hace un sistema inseguro
[StR] y 2) para poder tener objetos mas facil de reutilizar
[StR] objetos pequeños, que se dediquen a hacer exáctamente lo que deben de hacer y nada mas, son mas faciles de reutilizar en otro proyecto donde los necesitemos
[StR] quién de ustedes ha jugado con PEAR?
[juchipilo] yo no
[clue] yo no, pero no poder instalarlo en server compartido
[clue] entonces lo dejé de lado
[StR] hmmm….
[StR] dudas hasta aquí?
[StR] o voy muy rápido?
[clue] mmm no, pero yo tengo un ligero problemilla
[clue] a lo mejor es una tontería y se me ha pasado por alto
[StR] clue: sobre?
[clue] si tienes 2 clases diferentes, de la cual una no hereda a la otra
[clue] en este caso color y CrayonBox
[clue] si la clase color no tiene el método definido getColor (que si lo está en CrayonBox)
[clue] no veo cómo al instanciar el objeto como clase color obtenga los métodos de Crayonbox
[StR] color no tiene getColor
[StR] getColor hace eso.. te dá un objeto de tipo Color
[clue] se que CryonBox posee el método getColor definido con una referencia… pero… no se, no consigo hacerme a la idea
[clue] lo digo más que nada por el código que has puesto antes
[StR] CryonBox y Color son 2 cosas aparte…
[clue] $color =  new Color();
[clue] $color->getColor(’red’);
[clue] :?
[StR] ahhh no… eso es lo que digo.. “Que pasaría si color SI tubiera el método getColor?” cosa que no tiene
[clue] ah ok ok vale perfecto gracias :)
[StR] ok…..   entonces ya se dieron cuenta que CrayonBox no hace nada útil mas que crear objetos de tipo Color
[StR] eso es una factory.. alguien que se encarga de crear objetos
[StR] ok….. .. lástima que no han jugado con PEAR, porque eso sirve mucho…
[StR] todo PEAR está basado en eso,
[StR] todos tienen PHP en su máquina? supongo verdad?
[juchipilo] si lo vemos como una ‘caja negra’,   le entran datos y le salen objetos del tipo especificado , no?
[StR] juchipilo: si.. algo así
[juchipilo] ok.
[StR] ok.. todos tiene PHP instalado en su máquina?
[clue] si, php5
[StR] http://go-pear.org/
[juchipilo] yo si php5
[clue] am si
[StR] ese es un archivo.. un script PHP que lo pueden descargar… y ejecutar con php
[StR] guarden ese archivo en algún lado,.. por ejemplo en el escritorio, con el nombre… instalarPEAR.php
[StR] y ahora corran ….    sudo php instalarPEAR.php
[StR] si usan windows, no usan sudo
[StR] y si usan GNU/Linux y no usan sudo, corranlo como root
[StR] les va a preguntar unas cosas y luego ya tendrán pear instalado
[StR] me dicen cuando lo tengan…
[efra] listo
[StR] efra: sobre Windows o sobre GNU/Linux?
[efra] Linux
[juchipilo] pregunta: el correr este script no dan~a o altera mi php actual?
[StR] efra: ok, donde le dijiste que te instalara PEAR?  crero que por default te dice que lo instalés   en /usr/share/php
[StR] juchipilo: no….
[juchipilo] okas pues
[clue] Installation in progress …
[StR] les va a preguntar si instalan los paquetes básicos como DB, XML, no se que y no se cuanto…
[StR] diganle que si
[StR] ok… en la carpeta donde les preguntó donde lo guarda todo, van a ver… una carpeta llamada DB y un archivo DB:php
[efra] tengo un pear.conf en /etc/pear y tengo un /usr/bin/pear
[StR] efra: mira en /usr/share/php
[efra] Aja, ahi hay un dir PEAR
[StR] efra.. ok.. ademas de esa carpeta tienes una carpeta DB  y un archivo DB.php?
[efra] No
[juchipilo] yo si
[StR] efra: entonces corre:  sudo pear install DB
[StR] juchipilo: ok.. esperemos a efra que corra ese comando para que también tenga esos archivos
[efra] En esas ando
[juchipilo] no problema
[efra] Listo
[StR] mientras les cuento…  PEAR es un conjunto de librerías.. que otro día vamos a explicar mas detallado
[StR] una de esas librerías es DB
[StR] que se encarga de hacer una abstacción de conección a base de datos
[StR] miremos el archivo DB.php en la linea  485
[StR] ahi nos enseña como usarlo:
[StR]      * $dsn = ‘pgsql://user:password@host/database’;
[StR]      * $db =& DB::connect($dsn, $options);
[StR] en la primera linea miramos que definimos un string de conección.. en este caso se está conectando a una base de datos PostgreSQL
[StR] que si lo cambiamos por una que diga ‘mysql://user:pass@host/database’…..   nos va a conectar a mysql…
[StR] ok …. $db es el objeto de base de datos.. ese le decimos   $db->query(’select * from usuarios’);….
[StR] o cualquier cosa que queramos ejecutar
[StR] todos hasta ahí?
[juchipilo] si
[StR] ok…..  salgámonos por un momento de ese archivo.. y miremos la carpeta DB
[StR] vamos a ver un montón de archivos que funcionan como drivers….
[StR] al hacer  DB::connect($dsn, $options);     la clase DB se encarga de reconocer a que tipo de base de datos nos queremos conectar y levanta automáticamente uno de estos archivos.. dependiendo de a donde nos queramos conectar
[StR] si se dan cuenta  en la carpeta DB tenemos, mysql, mysqli, pgsql, sqlite, db2, etc etc…
[StR] regresemos al archivo  DB.php
[StR] en la linea 520 parsea el string de conección.. que simplemente separa todos los componentes del string que definimos que se parece a un URL….  mysql://blabla…
[StR] y eso está guardado en $dsninfo
[StR] y en la 521 tenemos:  $type = $dsninfo[’phptype’];
[StR] osea..  $type es el tipo de conección que tenemos…
[StR] en la linea 533  hace un include del archivo… los drivers que están en la carpeta DB
[StR] en la linea  538  $classname = “DB_${type}”;  aquí dice… que $classname es …  DB_mysql
[StR] o DB_sqlite
[StR] y en la linea547  hace el objeto… y en la 562  retorna el objeto
[StR] y tará…. vimos como PEAR::DB usa una factory para crear el objeto….
[StR] me explique bien? alguien se perdió?
[efra] No
[juchipilo] no. muy claro
[juchipilo] buen ejemplo para ese patron
[mic_] los sigo
[StR] alguien mas si entendió?
[StR] o alguien se quedó atras?
[patofeo] :P
[StR] si se dan cuenta.. encapsuló la creación del objeto de conección a base de datos.. un proceso complicado y lo convirtió en algo facil de usar para el usuario final.. que somos nosotros
[StR] dudas? comentarios?
[juchipilo] no.. yo no
[StR] ok.. vamos a ver un último ejemplo
[StR] PHP no maneja lo que en otros lenguajes se conoce como namespaces…
[StR] un namespace es un paquete.. un conjunto de clases que pertenecen a una misma función
[StR] por ejemplo.. DB
[StR] si se dan cuenta…. tenemos un DB.php que es la factory.. que carga objetos de tipo   DB_xxxx
[StR] DB_xxx segun las especificaciones de PEAR nos indica que está en la carpeta DB
[StR] por ejemplo si tubieramos una clase llamada     Persona_Profesion_Programador.php
[StR] sabríamos que está en el archivo Persona/Profesion/Programador.php
[StR] esa es una forma que tienen PEAR para ordenar sus archivos en carpetas y tener un orden facil de entender
[StR] ahora…..  lo que vamos a ver a continuación nos facilita la forma de estar creando los objetos con una factory que yo me programé
[StR] miremos el código que tengo en  http://php-es.pastebin.com/738388
[StR] ese código es parte de una Framework que me hice para mis proyectos
[StR] la clase se llama FW (por FrameWork);
[StR] y nos permite hacer lo sigiente:
[StR] por ejemplo si tenemos una estructura como la que dije:  Persona/Profesion/Programador.php
[clue] re
[StR] al hacer:     $miPersona =  FW::factory(’Persona_Profesion_Programador’);
[StR] miremos lo que hace….
[StR] en la linea 52 tenemos el método factory
[StR] que recibe el nombre de la clase como primer parámetro
[StR] y manda a llamar loadClass
[StR] loadClass está en la linea 32
[StR] recibe el nombre de la clase… hace un explode para separar el nombre de la clase por el signo _  y luego lo junta con un signo / para buscar en esa carpeta el archivo
[StR] en este caso busca el archivo Persona/Profesion/Programador.php
[StR] y avisa si el archivo no existe, o no tiene permisos para leer el archivo
[StR] y si todo sale bien.. hace un require_once($file);
[StR] una vez ya cargamos el archivo.. verifica si, despues de cargar el archivo, ahora ya existe una clase llamada  Persona_Profesion_Programador
[StR] eso hace loadClass
[StR] ya una vez tenemos la clase… solo tenemos que hacer un return new $class($params);
[StR] y con eso ya tenemos una factory que…
[StR] se encarga de cargar archivos sin estar nosotros haciendo .. require_once(’Mi_nombre_de_objeto);
[juchipilo] muy bien
[StR] se encarga de verificar que ese archivo existe
[StR] se  encarga de verificar que el archivo si se puede leer
[StR] se encarga de ver si en ese archivo existe esa clase
[StR] y se encarga de retornar un objeto de dicha clase
[StR] dudas?
[StR] aplausos?
[efra] Hasta ahorita nada
* efra aplaude
[clue] :)
[efra] ¿Tu codigo es GPL?
* juchipilo tambien aplaude
[StR] ok..  y eso es todo…
[clue] buena ponencia StR (aunque me haya perdido parte de ella :P )
* clue aplaude tb :)
[StR] bueno jovenes.. creo que con esto aprendimos bastante…
[juchipilo] claro que si
[StR] espero que les sirva para comenzar a organizar sus proyectos, y separar en carpetas sus clases… de forma que después si queremos reutilizar nuestro cóigo, sea mas facil
[clue] :)
[clue] antes me costó un poco instalr el pear a través de go-pear
[clue] pero ya está todo ok
[mic_] ahi tengo el log
[StR] si….   leanse de pear, es muy util para usarlo después
[StR] yo me tengo que retirar ya…
[clue] si, mucha gente me lo recomienda, pero ocupa bastante
[clue] 3Mb
[clue] :S
[StR] clue… casi no es nada…
[juchipilo] habra que probarlo pues
[clue] hombre si le metes más módulos … chupa un poco
[clue] 5Mb ocupa lo qu ehe metido
[StR] otro día voy a enseñarles a usar pear en hosting donde no nos dejen usar librerías extras de PHP
[StR] si quieren hagamos eso la proxima vez
[patofeo] avisen cuando es StR
[patofeo] con anticipacion
[patofeo] pongan de topico
[juchipilo] patofeo, si lo han hecho
[StR] patofeo… si esta reunion estubo en el topic como 3 semanas
[clue] mmm
[patofeo] igual deje logueado patofeo2 en mi servidor, dsp voy a leer.
[clue] StR: yo lo he hecho a través d web
[clue] se instala perfectamente :)
[patofeo] ah :)
[patofeo] Anduve muy distraido :)
[StR] ok jóvenes… cualquier cosa me cuentan…..
[StR] voy a estar viniendo a ver que tal las experiencias
[patofeo] 1 abrazo StR
[StR] solo les recomiendo:
[juchipilo] sale str. gracias
[StR] lean el libro este de de guide to PHP design patterns
[StR] y … practiquen, practiquen y practiquen
[patofeo] algun mail para tirar algunas dudas?
[patofeo] o posibles problema
[patofeo] :D
[StR] patofeo si querés me podés escribir a str@strgt.cjb.net
[StR] bueno.. me voy.. adiós gente!
[patofeo] gracias.
[clue] StR: me falta el otro libro que recomendaste el otro día
[clue] jeje
[clue] enga hasta luego StR
[clue] que descanses :)

Leave a Reply