Construyendo una AOS con PHP: Patrones de Diseño de Servicios Web en PHP
Introducción a Los Patrones de Diseño Con PHP _ Baluart
-
Upload
ivan-berlot -
Category
Documents
-
view
222 -
download
0
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