Introducción a Los Patrones de Diseño Con PHP _ Baluart

download Introducción a Los Patrones de Diseño Con PHP _ Baluart

of 14

Transcript of Introducción a Los Patrones de Diseño Con PHP _ Baluart

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    1/14

    20 8 Twittear 88

    Introduccin a los patrones de diseo con PHPBalu 19 Julio 2010 - 6:44pm 8 comentarios

    Alguna vez te preguntaste qu son los patrones de diseo? En

    este artculo, voy a explicar por qu los patrones de diseoson

    importantes y mostrar algunos ejemplos en PHP, de cundo y

    por qu deben ser utilizados.

    Qu son los patrones de diseo?

    Los patrones de diseo han sido optimizados, son soluciones

    reutilizables a los problemas de programacinque nos

    encontramos todos los das.

    Un patrn de diseo no es una clase o una biblioteca que,

    simplemente, puede conectarse a nuestro sistema, es mucho ms que eso. Es una plantilla que tiene que

    aplicarse a la situacin correcta. Tampoco es especfica de un lenguaje. Un buen patrn de diseo debe poder

    aplicarse en la mayora -si no todos los lenguajes-, slo limitado por las capacidades del lenguaje.

    Lo ms importante, cualquier patrn de diseo puede ser un arma de doble filo, si se aplican en el lugar

    equivocado, puede ser desastroso y crear muchos problemas. Sin embargo, implementndolo en el lugar

    correcto y en el momento adecuado, puede ser nuestro salvador...

    Hay, bsicamente, 3 tipos de patrones de diseo:

    1. Estructural

    2. Creacional

    3. De comportamiento

    Los patrones estructurales, generalmente crean relacin entre las entidades, lo que facilita que estas

    entidades puedan trabajar en conjunto.

    PORTADA VIDEOS CONTACTO

    Actualidad Desarrollo Web Tecnologa Marketing Digital Diseo Grfico

    http://www.baluart.net/categoria/programacionhttp://www.baluart.net/categoria/programacionhttp://www.baluart.net/tema/actualidadhttp://www.baluart.net/tema/desarrollo-webhttp://www.baluart.net/tema/tecnologiahttp://www.baluart.net/tema/marketinghttp://www.baluart.net/tema/diseno-graficohttp://www.baluart.net/http://www.baluart.net/http://www.baluart.net/tema/diseno-graficohttp://www.baluart.net/tema/marketinghttp://www.baluart.net/tema/tecnologiahttp://www.baluart.net/tema/desarrollo-webhttp://www.baluart.net/tema/actualidadhttp://www.baluart.net/contactohttp://www.baluart.net/videos/http://www.baluart.net/http://www.baluart.net/categoria/programacionhttp://www.baluart.net/articulo/introduccion-a-los-patrones-de-diseno-con-phphttps://twitter.com/search?ref_src=twsrc%5Etfw&q=http%3A%2F%2Fwww.baluart.net%2Farticulo%2Fintroduccion-a-los-patrones-de-diseno-con-phphttps://twitter.com/intent/tweet?original_referer=http%3A%2F%2Fwww.baluart.net%2Farticulo%2Fintroduccion-a-los-patrones-de-diseno-con-php&ref_src=twsrc%5Etfw&text=Introducci%C3%B3n%20a%20los%20patrones%20de%20dise%C3%B1o%20con%20PHP%20%7C%20Baluart.NET%3A&tw_p=tweetbutton&url=http%3A%2F%2Fwww.baluart.net%2Farticulo%2Fintroduccion-a-los-patrones-de-diseno-con-php%23.VkyGeeqpQjs.twitter&via=baluarthttp://www.baluart.net/
  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    2/14

    Los patrones creacionales indican mecanismos de instanciacin (Crea un objeto, instancia de una clase); por

    lo que, facilitan la creacin de objetos de una manera que se adapte a la situacin.

    Los patrones de comportamientoson usados en la comunicacin entre entidades y hacen ms fcil y

    flexible que estas entidades puedan comunicarse.

    Por qu debo usarlos?

    Los patrones de diseo son, en principio, soluciones, bien pensadas, a problemas de programacin. Muchos

    programadores han padecido de estos problemas antes y han utilizado estas soluciones para ponerles

    remedio. Si nos encontramos con estos problemas, por qu volver a crear una solucin, cuando podemos

    usar una solucin ya probada?

    Por ejemploImagina que tienes la responsabilidad de crear una forma en que dos clases, que hacen cosas diferentes en

    funcin de la situacin, se combinen. Estas dos clases son muy utilizadas, en diferentes sitios, por el mismo

    sistema; por lo que es complicado retirarlas y cambiar el cdigo existente. Adems, cambiar el cdigo

    necesitara que se verifiquen cada uno de los cambios, ya que estos tipos de ediciones y reorganizaciones,

    en un sistema que esta basado en diferentes componentes, casi siempre introducen nuevos errores. En vez

    de hacer esto, puedes implementar una variacin del patrn de estrategia y uno de adaptacin, los que

    fcilmente pueden manejar este tipo de escenarios.

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    3/14

    }

    ?>

    Sencillo, cierto? Ahora, echemos un vistazo al patrn de estrategia.

    El patrn de estrategia (Strategy Pattern)

    El patrn de estrategiaes un patrn de diseo de comportamiento que nos permite decidir que curso de

    accin debera tener un programa, basado en un contexto especfico en tiempo de ejecucin. El programa

    encapsula dos algoritmos diferentes dentro de dos clases y decide, en tiempo de ejecucin, que estrategia

    debe seguir.

    En nuestro ejemplo, la estrategia esta basada en la variable $_context, lo que fuere en el momento en que la

    clase fue instanciada. Si se diera el contexto para la clase uno, usaramos class_one, y viceversa.

    Bonito, pero dnde puedo aplicar esto?

    Imagina que estas desarrollando una clase que puede crear o actualizar el registro de un nuevo usuario.

    Igual, necesitas los mismos campos (name, address, mobile number, etc.); pero, dependiendo de la situacin,

    tienes que usar funciones diferentes para cuando creas y para cuando actualizas. Ahora, probablemente

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    4/14

    solo uses una condicin if-else para conseguirlo; sin embargo, que sucedera si necesitaras usar esta clase

    en un lugar diferente? En este caso, tendras que reescribir la misma condicin if-else otra vez. No sera

    ms fcil especificar su contexto?

    Ahora, el patrn de estrategia habitual implica encapsular sus algoritmos dentro de otra clase, pero en

    este caso, otra clase sera un desperdicio. Recuerda que uno no tiene que seguir el modelo exactamente.

    Podemos hacer variaciones al trabajo, siempre y cuando, el concepto siga siendo el mismo y solucione el

    problema.

    El patrn adaptador (Adapter Pattern)

    El patrn adaptadores un patrn de diseo estructural que nos permite reutilizar una clase con una

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    5/14

    interfaz diferente, lo que permite ser utilizada por un sistema que utiliza diferentes mtodos de llamada.

    Esto tambin nos permite cambiar algunos campos que estn siendo recibidos de la clase cliente,

    convirtindolos en algo compatible con las funciones adaptadas.

    Cmo podemos darle uso?

    Otro trmino para hacer referencia a una clase adaptador es un wrapper o contenedor, lo que

    bsicamente nos permite envolver (wrapp) acciones en una clase y reusar estas acciones en las

    situaciones adecuadas. Un ejemplo clsico puede ser cuando creas una clase dominio para las clases de

    tabla. En lugar de llamar a las diferentes clases de tabla y llamar a sus funciones una por una, podemos

    encapsular todos estos mtodos en un mtodo que utilice una clase adaptador. Esto no slo nos permitir

    reutilizar cualquier accin que se desee, sino tambin evitar que tengamos que reescribir el cdigo si

    necesitamos usar la misma accin en un sitio distinto.

    Comparemos estas dos clases.

    Enfoque sin adaptador

    Si necesitamos hacer lo mismo en un lugar diferente, o incluso reusar este cdigo en un proyecto distinto,

    tendramos que reescribir todo otra vez.

    Mejor

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    6/14

    $account_domain->NewAccount( //inputs )

    ?>

    En esta situacin, tenemos una clase wrapper, la cual podra ser nuestra clase dominio Account.

    De esta forma, podemos usar la clase dominio Account siempre que la necesitemos, adems de poder

    englobar otras clases bajo la clase dominio.

    El patrn mtodo de fbrica (Factory Method Pattern)

    El patrn mtodo de fbricaes un patrn de diseo creacional que hace exactamente lo siguiente: Es una

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    7/14

    clase que acta como una fbrica de instancias de objetos.

    El principal objetivo de este patrn es encapsular el procedimiento creacional que diferentes clases pueden

    tener, en una slo funcin. Al proporcionar el contexto adecuado al mtodo de fbrica, ste ser capaz de

    devolver el objeto correcto.

    Cundo puedo usar esto?

    El mejor momento para utilizar el patrn de mtodo de fbrica es cuando tienes mltiples variantes de una

    sola entidad. Digamos que tienes una clase button, esta clase tiene diferentes variaciones, como

    ImageButton, inputButton y FlashButton. Dependiendo del lugar, es posible que deba crear diferentes

    botones -aqu es donde podemos utilizar una fbrica para crear los botones, en lugar tuyo!

    Empecemos creando nuestras tres clases:

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    8/14

    ()

    }

    class FlashButton extends Button {

    protected $_html = "..." //Esti debe ser cualquier HTML que

    quieras usar para el botn flash?>

    Ahora, podemos crear nuestra clase de fbrica:

    El resultado deber ser el cdigo HTML de todos los tipos de botones. De esta manera, seremos capaz de

    sealar qu botn crear dependiendo de la situacin y poder reusar la condicin, tambin.

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    9/14

    El patrn decorador (Decorator Pattern)

    El patrn decoradores un patrn de diseo estructural que nos permite aadir comportamientos nuevos, o

    adicionales, a un objeto en tiempo de ejecucin, dependiendo de la situacin.

    El objetivo es hacerlo de tal manera que las funciones extendidas se puedan aplicar a un caso concreto y, al

    mismo tiempo, mantener la posibilidad de crear una instancia original que no tienen las nuevas funciones.

    Tambin permite combinar mltiples decoradores a una instancia, por lo que no hay que trabajar con un

    decorador para cada instancia. Este patrn es una alternativa a la subclase, la cual crea una clase que hereda

    funcionalidad de una clase padre. A diferencia de la subclase, que aade el comportamiento en tiempo de

    compilacin, este patrn nos permite agregar un nuevo comportamiento en tiempo de ejecucin, si la

    situacin as lo requiere.

    Para implementar el patrn Decorator, debemos seguir los siguientes pasos:

    1. Crear una subclase de la clase original Component en una clase Decorator

    2. En la clase Decorator, debemos aadir un Puntero a Component como un campo

    3. Pasar un Component al constructor de Decorator para inicializar el puntero Component

    4. En la clase Decorator, redirigir todos los metodos Component al puntero Component, y

    5. En la clase Decorator, sobreescribir cualquier mtodo Component cuyo

    comportamiento deba ser modificado

    Pasos cortesa de la wikpedia.

    Cundo puedo usarlo?

    http://en.wikipedia.org/wiki/Decorator_pattern
  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    10/14

    El mejor lugar para usar el patrn Decorator es cuando tenemos una entidad que necesita tener un nuevo

    comportamiento slo si la situacin as lo requiere. Por ejemplo, tenemos un elemento enlace HTML, un

    enlace para cerrar sesin, que queremos realice cosas diferentes basados en la pgina en la que aparece.

    Para ello, podemos usar el patrn decorador.

    Primero, definimos las diferentes decoraciones que necesitaremos.

    Si estamos en la portada como usuarios loggeados, tener el enlace dentro de etiquetas .

    Si estamos en una pgina distinta como usuarios loggeados, tener un enlace con subrayado.

    Si estamos loggeados, tener un enlace dentro de etiquetas .

    Una vez que hemos establecido nuestras decoraciones, podemos empezar con la programacin:

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    11/14

    echo $this->_html

    }

    }

    class LogoutLinkH2Decorator extends HtmlLinks {

    protected $_logout_link

    public function__construct( $logout_link )

    {

    $this->_logout_link = $logout_link

    $this->setHtml("" . $this->_html . "")

    }

    public function__call( $name, $args )

    {

    $this->_logout_link->$name($args[0])

    }

    }

    class LogoutLinkUnderlineDecorator extends HtmlLinks {

    protected $_logout_link

    public function__construct( $logout_link )

    {

    $this->_logout_link = $logout_link

    $this->setHtml("" . $this->_html . "")

    }

    public function__call( $name, $args )

    {

    $this->_logout_link->$name($args[0])

    }

    }

    class LogoutLinkStrongDecorator extends HtmlLinks {

    protected $_logout_link

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    12/14

    public function__construct( $logout_link )

    {

    $this->_logout_link = $logout_link

    $this->setHtml("" . $this->_html . "")

    }

    public function__call( $name, $args )

    {

    $this->_logout_link->$name($args[0])

    }

    }

    ?>

    Ahora, debemos ser capaces de utilizarlo de esta manera:

    Aqu podemos ver la manera de combinar mltiples decoradores si los necesitamos. Dado que todos los

    decoradores utilizan el mtodo mgico __call, podemos llamar a los mtodos de la funcin original. Si

    asumimos que estamos en la portada y loggeados, la salida HTML deber ser:

    Logout

    El patrn instancia nica (Singleton Pattern)

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    13/14

    El patrn de diseo Singletones un patrn de diseo creacional que se asegura de tener una sola instancia

    de una clase particular durante su tiempo de ejecucin, y proporciona un punto de acceso global a ella.

    Esto permite configurar un punto de coordinacin para otros objetos que utilicen la instancia singleton;

    asimismo, las variables singleton siempre sern las mismas y estarn disponibles para todos los dems

    objetos de la aplicacin, que las llamen.

    Cundo puedo usarlo?

    Singleton Pattern

    Si necesitamos pasar una instancia especfica de una clase a otra, podemos usar el patrn de instancia nica

    para evitar tener que pasar la instancia va el constructor o un argumento. Imagina que haz creado una clase

    Session, que simula el array global $_SESSION.

    A esta clase slo necesitamos instanciarla una vez; entonces, podemos implementar un patrn singleton de

    la siguiente manera:

  • 7/25/2019 Introduccin a Los Patrones de Diseo Con PHP _ Baluart

    14/14

    private function__clone() { }

    // cualquier otro mtodo(s) de sesin que usemos

    ...

    ...

    ...}

    // obtener una instancia de sesin

    $session = Session::getInstance()

    ?>

    As pues, podemos acceder a nuestra instancia de sesin desde diferentes partes de nuestro cdigo, incluso

    en diferentes clases. Esta data ser persistente y se mantendr a lo largo de todas las llamadas getInstance.

    Conclusin

    Hay muchos ms patrones de diseo por estudiar; en este artculo, slo hemos mencionado algunos de los

    ms destacados y utilizados en la programacin. Si estas interesado en leer sobre los dems patrones de

    diseo, la pgina de Design Patternsde la Wikipedia esta repleta de informacin. Si no es suficiente, pueden

    leer el libro Design Patterns: Elements of Reusable Object-Oriented Software, considerado uno de los

    mejores libros sobre patrones de diseo.

    Una ltima cosa: Cuando uses estos patrones de diseo, siempreasegrate de estar tratando de resolver el

    problema adecuado. Como mencion al principio, estos patrones de diseo son una espada de doble filo: Si

    se utiliza en el contexto equivocado, potencialmente pueden empeorar las cosas; pero, si se utilizan

    correctamente, pueden ser indispensables.

    Fuente | A Beginners Guide to Design Patterns

    http://net.tutsplus.com/articles/general/a-beginners-guide-to-design-patterns/http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29