jueves, 31 de marzo de 2011

Aplicación de patrones de diseño

Para la entrada de taller de esta semana, necesitamos implementar patrones de diseño en nuestro proyecto, en mi caso, implementé un Builder ya que con esto puedo 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...


Después de aplicar este patrón mi Diagrama quedaría así:


En donde vemos que Carrito hace la función de un builder, y Cliente la de Director, en este caso, los objetos abstractos se van creando conforme a los atributos que el cliente le da.

Este es mi parte de mi código.


















Estoy trabajando, ya que tengo un error, estoy suponiendo que es de declarar varios imports que no son necesarios, o de las propiedades de las bebidas y comidas.

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

jueves, 24 de marzo de 2011

Demostraciones de avance parcial

Este es mi avance de mi proyecto:
En este codigo, creo productos y un cliente de manera manual, lo que quiero originalmente es que los productos los leea en un plist y que cliente tenga una interfaz donde le pide sus datos.

Lo unico que hace es mandar llamar a printMenu lo cual lo imprime en el terminal, no se como hacer que crea una lista y pedir para que se valla guardando en una lista.



Lo que hace el código es asignarle los atributos a los productos, al igual que tengo otra función que se los asigna a el producto, luego en recibe orden, muestra esta información.
Estas son las diferentes clases a las cuales les he agregado código.

Lo que hago es hacer un NSMutableDictionary para la orden llamada MiMenu, en ese caso, se agrega a MiMenu y al final confirma su orden.










Esto es lo que imprime la consola:


Por otra parte en la API, encontré las funciones de Mapa para agregarlos a mi proyecto, en este caso agregue la opción que se pudiera ver y que ubicara a la persona.





En clase menu estoy trabajando en como funciona plist y las vistas en tabla, aun estoy viendo como leer del plist creando objetos y como se relaciona en mi proyecto.

En este código pongo como agregar objetos a una tabla en donde estarán los productos.
Tambien están manuales.



Ahora muestro capturas de pantalla de mi interfaz, solamente le puse diferentes colores al tab, la tabla lo estoy trabajando separado para luego incluirlo y en Sucursales agregar el mapa de google maps.
Lo de las tablas del menu, lo estoy trabajando en otro proyecto aparte para luego incorporarlo al la interfaz existente.





miércoles, 16 de marzo de 2011

Código autogenerado y comparación

Taller OOP
Para realizar un código autogenerado, tuve el problema que no encontré un software gratuito que generara código en Objective C, todos son comerciales, por lo tanto lo que hice es hacer el diagrama en Umbrello y que generara el código en C++ y tambien en Java, para ver las diferencias entre mi código y el código generado a base del diagrama.


Este es el diagrama que realizé en Umbrello
diagrama 1

Este es el diagrama que generó en base a código el xcode
diagrama 2


Podemos ver que es prácticamente igual así que ahora lo que hice en Umbrello es generar el código en base ahora al diagrama 1

Aquí tenemos el diagrama de secuencia


Para resaltar las diferencias decidí utilizar dos clases diferentes, entre ellas Bebida y Recomen.

Este es el código que generó en C++ para clase Bebida

Este es el código que generó en Java para clase Bebida

Este es el código que yo escribí en Objective C

Como diferencia podemos ver que en los códigos generados crean el uso de funciones especiales para definir propiedades, los cuales son get y set.
Según encontré en internet, get hace que puedas obtener el valor de la propiedad, esto quiere decir que lo puedes leer y set es para darle un valor a la propiedad, esto quiere decir que lo puedes escribir.

Este es el código que generó en C++ para clase Recomen

Este es el código que generó en Java para clase Recomen

Este es el código que yo escribí en Objective C












Aqui podemos encontrar la misma diferencia de las funciones de get y set en la propiedad y podemos ver tambien que en C++ crea la función initAttributes();


links de interes:
Getter y Setter en OOP
Umbrello

Cabe recalcar que esta comparación la estoy haciendo con otros lenguajes de programación ya que como comenté al principio, no encontré una herramienta que generara código en lenguaje Objective C en base a un diagrama.

Diagramas de clase y secuencia de UML

Clase OOP
Diagrama de Clase


Este es mi diagrama de clases UML, en donde podemos ver mas facilmente las conexiones entre las clases que estoy desarrollando en el sistema de restaurantes, orientado a objetos, podemos ver que clases heredan de otras clases, así como los metodos de cada una, por ejemplo, podemos ver que Producto hace herencia de los metodos y atributos de Bebida y Comida, cuyas clases poseerá características y atributos aparte de los visibles en su clase padre.

Cambié mis clases respecto a la presentación del martes, ya que me di cuenta que estaba hecho en base a lo visual y se necesitaba la parte lógica del programa, espero que esta ves no tenga problema, si tienen una recomendación es bienvenida.

Este diagrama se generó en base con el código hecho en xcode, en la parte de design.


 Diagrama de Secuencia

El diagrama de secuencia muestra como su nombre lo dice, la secuencia de los mensajes entre los objetos de un programa, podemos ver como si fuera una linea de vida sobre el funcionamiento de nuestro programa, al igual que las flechas de los mensajes de origen al destino, esto sirve para ver mas facilmente como se comunican los objetos y que se esta llamando en cada uno, podemos ver en la parte de arriba que aparecen los clases que intervienen y de modo vertical el tiempo que ocurre esto utilizando las flechas.

En este caso utilizó como un circulo negro el inicio, y con circulo con contorno blanco el final, por ejemplo iniciamos en mostrar un producto, ordena ese producto, ya sea comida o bebida, después este se comunica con Orden para recibirlo, crear la cuenta, poder eliminar o descontar, se confirma la acción pidiendo los datos necesarios en cliente y finaliza, en otra parte podemos ver que para crear un comentario, muestra los productos, crea el comentario lo guarda y finaliza. 

Este diagrama se generó con el programa OmniGraffle Pro, en donde vienen patrones para generar diagramas de este tipos.


Iinks importantes:

Espero recibir comentarios acerca de los diagramas, algunos de los comentarios hechos en la presentación ya los lleve a cabo.