miércoles, 30 de marzo de 2011

Identificación de patrones de diseño

Para esta semana nos corresponde entregar un texto con diagramas que explica cuáles patrones se aprovecha en el proyecto.


Un patrón de diseño resume de los aspectos clave de un problema de diseño de programación orientada a objetos en particular o que ha sido mas eficaz durante el tiempo, expresando ideas primordiales en el diseño, algunos contienen principios, como reglas generales para la construcción de apliaciones orientadas a objetos reutilizables y facil de mantener.


Como vimos en clase existen 3 principales patrones de diseño según su propósito, entre ellos son los patrones creacionales, estructurales y de comportamiento.

  • Creacionales son los que patrones que, como su nombre lo dice, crean instancias de objetos, ocultando los procesos de como los objetos fueron creados o inicializados.
  • Estructurales son los patrones que combinando varias clases junto con objetos para crear estructuras agregando nuevas funciones.
  • Comportamiento son patrones en los que los objetos de un software pueden realizar una comunicación e iteración.



Para mi proyecto explicaré de cada uno de las clasificaciones, los patrones que pudiera utilizar e implementar para así mejorar mi código y la implementación.


En el grupo de Creacionales:
Builder:




¿Cuando se utiliza el patrón Builder?
Cuando se necesita crear un objeto complejo, involucrando diferentes partes, separando el algoritmo de la creación y el de ensamblaje.
Se necesita este proceso para construir un objeto de diferentes maneras, por ejemplo, diferentes combinaciones de piezas.


¿Como puedo utilizar este patrón?
Puedo utilizar builder para crear el producto según las preferencias del usuario, al construir una variedad de objetos, que en este caso serian las comidas y bebidas que el cliente quiera, con sus diferentes propiedades, por ejemplo que cuantas bebidas, si las quiere azucaradas, el termino de una carne, etc...



Ahora este es un diagrama de como se implementaria en mi proyecto.




En el libro que he leido, nos dice que Abstract factory y Builder son similares ya que estos crean objetos abstractos, pero tienen diferencias y ventajas que tenemos en cual utilizar y para que, entre las mas importantes estas son:


Builder Abstract Factory
Construye objetos complejos Construye objetos simples o complejos
Construye un objeto en multiples pasos Construye el objeto en un paso
Construye un objeto de muchas maneras Construye un objeto de una manera
Devuelve un producto objeto como un paso final Devuelve el objeto de inmediato
Se centra en un producto en particular Destaca un conjunto de productos


La desventaja mas importante que tenemos en el uso de este patrón, es que se necesita que todos sus elementos esten entrelazados entre las partes de este patrón que son Director, Builder y el Producto, por lo tanto si queremos realizar un cambio, tendremos que realizar una verdadera variación.


Aqui tengo un diagrama de secuencia de como se puede implementar el Builder.


Builder es una interfaz abstracta que declara un método BuildPart, que se realiza por la construcción de ConcreteBuilder. Este tambien incluye un método getResult que regresa el producto que el cliente ha realizado. Builder incorpora al Director, pero a su vez, el director no se responsabiliza de el periodo de tiempo del constructor.






En el grupo de estructurales:
Façade:




En este patrón, el ejemplo que te proponen es que si un dia nos tenemos que ir en taxi a alguna parte, nosotros solamente le decimos "Lleveme a X lugar", el taxista empieza una secuencia de acciones para ejecutar el comando dado, en este caso que me lleve a ese lugar, por lo tanto lo que el taxista hace es separar de una interfaz complicada a una interfaz mas simple, pero siendo necesario conocer todas sus partes.
Por lo tanto, este patrón es una manera de proporcionar una interfaz unificada para un conjunto de interfaces diferentes en un subsistema.




¿Cuándo se utiliza el patrón de Façade?
Si el sistema se esta complicando, podemos utilizar este patrón para hacer más simple para las clases del sistema.
Simplificar las dependencias, haciendo comunicarse at través de las fachadas implementadas en un sistema.


¿Como puedo utilizar este patrón?
Puede utilizar este patrón para crear una clase que agrupe diferentes accesos a una unica clase, y hacer mi código mas eficiente y simple, por ejemplo en mi caso tengo una clase Producto que agrupa Bebidas y Comidas, estoy separando mi clase para que se comunique con otras, Bebida en cierto momento ya no tiene las mismas instancias que Comida para este luego comunicarse con otras interfaces, creando una clase Façade para luego comunicarlo como punto de entrada apor ejemplo en mi caso con Carrito u alguna otra clase, por ejemplo Conexión, la cual no pienso implementar en un futuro, tal vez no en este momento, que servira para transladar los objetos por medio de la web a otra interfaz que seria un servidor.



Este seria un diagrama de como lo puedo implementar en mi proyecto:





Ventajas Desventajas
Los clientes no deben saber las clases que hay antes de la clase que implementa el patrón. Oculta a los clientes la complejidad
Se pueden cambiar las clases que estan ocultas sin tener que cambiar a el cliente. Ensamble débil entre el subsistema y el cliente






En el grupo de Comportamiento:
Observer:


Este modelo, diferentes objetos pueden trabajar juntos y al mismo tiempo pueden ser reutilizados en otros lugares del programa, como ejemplo nos ponen en una central de tráfico aereo, muchos operadores ven en los radares para asegurarse de que no se provoque un choque en el aire, al igual que los pilotos que están volando ven ese tráfico, todos pudiendo observar el tráfico de la región. Si en algún momento un controlador lanza algunas emisiones de precauciones, en este momento todos pueden reconocer los mensajes, cambiando algunas funciones, asi es la idea al diseño de software.


¿Cuándo se utiliza el patrón Observer?
Tenemos dos tipos de abstracción que dependen uno del otro, encapsulando en objetos separados, permite variar y reutilizar.
Se cambia un objeto y es necesario cambiar a los demás, y el número de objetos que necesitan ser cambiados pueden variar.
Un objeto notifica a otros objetos.


¿Como puedo utilizar este patrón?
En mi proyecto puedo utilizarlo al ir observando cada uno de los objetos que va ordenando con sus propiedades y si en algún momento el usuario antes de ordenar puede cambiar de opinión, ya sea cambiar las propiedades de una comida o eliminarla, se necesita un observer para avisar a por ejemplo, la función que hace la cuenta, para volver activo el producto que se compró despues enviarlo definitivamente.



Este es el diagrama de como lo implementaria en mi proyecto:


Ventajas Desventajas
Union abstracta entre Subject y Observer Actualizaciones inesperadas e ineficientes
Se envia a los objetos interesados No se especifica el receptor.


Estas son los patrones que creo se pueden implementar en mi proyecto, si alguien me pudiera dar ideas de cuales otros serian utiles, pueden comentar.


Tambien algunas de las referencias en los cuales me base para hacer esta entrada, aqui vienen ejemplos aplicados en códigos y con diagramas es este libro que encontré.
Objective-C Design Patterns de Apress

1 comentario: