Mostrando entradas con la etiqueta Programación Orientada a Objetos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación Orientada a Objetos. Mostrar todas las entradas
jueves, 12 de mayo de 2011
Implementación interfaces gráficas
Taller
Bueno para esta entrada de Taller en los botones yo esperaría poder poner iconitos,
solo que ahora estoy mas interesada en algunas partes de funcionalidad.
Primero que nada para implementar CSS3 y Html5 hay que ver la compatibilidad que hay con los navegadores esta es una pequeña tabla que ayuda a saber que navegador soporta que:

En mi proyecto este es el código de los botones:


el borde al canvas se lo agregue así:

y estoy en la busqueda de imagenes para los botones, la manera que probé de poner imagenes en el botón es esta:
Bueno para esta entrada de Taller en los botones yo esperaría poder poner iconitos,
solo que ahora estoy mas interesada en algunas partes de funcionalidad.
Primero que nada para implementar CSS3 y Html5 hay que ver la compatibilidad que hay con los navegadores esta es una pequeña tabla que ayuda a saber que navegador soporta que:

En mi proyecto este es el código de los botones:


el borde al canvas se lo agregue así:

y estoy en la busqueda de imagenes para los botones, la manera que probé de poner imagenes en el botón es esta:

Interfaces gráficas
Clase
CSS 3
CSS, separa el contenido de la forma, se cumplió ya con las primeras especificaciones del lenguaje. Sin embargo, el objetivo de ofrecer un control total a los diseñadores sobre los elementos de la página ha sido más difícil de cubrir. Las especificaciones anteriores del lenguaje tenían muchas utilidades para aplicar estilos a las webs, pero los desarrolladores aun continúan usando trucos diversos para conseguir efectos tan comunes o tan deseados como los bordes redondeados o el sombreado de elementos en la página.
CSS 1 ya significó un avance considerable a la hora de diseñar páginas web, aportando mucho mayor control de los elementos de la página. Pero como todavía quedaron muchas otras cosas que los diseñadores deseaban hacer, pero que CSS no permitía especificar, éstos debían hacer uso de trucos para el diseño. Lo peor de esos trucos es que muchas veces implica alterar el contenido de la página para incorporar nuevas etiquetas HTML que permitan aplicar estilos de una manera más elaborada. Dada la necesidad de cambiar el contenido, para alterar al diseño y hacer cosas que CSS no permitía, se estaba dando al traste con alguno de los objetivos para los que CSS fue creado, que era el separar por completo el contenido de la forma.
CSS 2 incorporó algunas novedades interesantes, que hoy ya utilizamos habitualmente, pero CSS 3 todavía avanza un poco más en la dirección, de aportar más control sobre los elementos de la página.
Así pues, la novedad más importante que aporta CSS 3, de cara a los desarrolladores de webs, consiste en la incorporación de nuevos mecanismos para mantener un mayor control sobre el estilo con el que se muestran los elementos de las páginas, sin tener que recurrir a trucos o hacks, que a menudo complicaban el código de las web.
Propiedades nuevas en CSS 3
He aquí una lista de las principales propiedades que son novedad en CSS3.
Bordes
border-color
border-image
border-radius
box-shadow
Fondos
background-origin
background-clip
background-size
hacer capas con múltiples imágenes de fondo
Color
colores HSL
colores HSLA
colores RGBA
Opacidad
Texto
text-shadow
text-overflow
Rotura de palabras largas
Interfaz
box-sizing
resize
outline
nav-top, nav-right, nav-bottom, nav-left
Selectores
Selectores por atributos
Modelo de caja básico
overflow-x, overflow-y
Otros
media queries
creación de múltiples columnas de texto
propiedades orientadas a discurso o lectura automática de páginas web
Web Fonts
Estructura en HTML5

1-ESTRUCTURA:
En html5 la estructura de las páginas web deben seguir un esquema básico a la hora de hacer el diseño, un header para presentar la web donde se incluirá el menú, una zona de contenidos, una zona para elementos adicionales y la zona footer que será el pie de página. En principio el diseño sigue lo estandar aunque por la forma que quieren que sigamos como por ejemplo la sidebar , nos puede recordar a WordPress que a una página normal.
2-ELEMENTOS DE NAVEGACIÓN:
En html5 los menús deben realizarse medianta listas no ordenadas
.
3-CABECERA:
La cabecerá deberá incluir el logo a título de la página la cual debería ser un h1, seguido de un h2 con una breve descripción del contenido de la página web.
4-ELEMENTOS DE FECHA:
Cuando enviamos contenidos actualizados a la página web, por ejemplo noticias o post para un blog deberemos incluir una nueva etiqueta
En mi proyecto
Me gustaría que al momento de utilizar por ejemplo el lápiz, se cambie la forma del cursor a un lapicito.


Y este es un diseño muy simple de la pantalla de mi proyecto:

miércoles, 27 de abril de 2011
Sistemas distribuidos
Semana 12
Clase de Programación Orientada a Objetos


Bibliografía
http://es.wikipedia.org/wiki/Sistema_distribuido
http://es.wikipedia.org/wiki/Serializaci%C3%B3n
http://www.inmensia.com/blog/20110125/html5_web_sockets.html
http://notasweb.com/articulo/javascript/persistencia-de-objetos-javascript-en-html5.html
Clase de Programación Orientada a Objetos
Sistemas distribuidos
Se podría definir un sistema distribuido por un conjunto de computadoras que aunque están separadas físicamente y conectadas entre sí por una red, cada computadora tiene sus componentes de software y hardware que el usuario percibe como un solo sistema. El usuario puede acceder a recursos remotos de la misma forma que puede manejar recursos locales, o un conjunto de maquinas que usan un software para conseguir un objetivo común.

Los sistemas distribuidos tienen que ser confiables es por eso que si un componente del sistema de descompone otro componente debe poder reemplazarlo, a esto se le conoce como tolerancia a fallos.
Los tamaños de sistemas distribuidos pueden variar, a esto se le conoce como escalabilidad, es decir pueden ser para una red de área local, metropolitana o Internet.
Características
- Seguridad en el sistema distribuido
- Se ejecuta en muchas computadoras
- Interacción entre los equipos
- Software diseñado para ser compatible con varios usuarios y sistemas operativos
- Compatibilidad entre los dispositivos conectados
RMI
RMI(Java Remote Method Invocation) es un mecanismo de Java que llama a un método de forma remota. Es parte de el entorno de ejecución en Java y proporciona una manera sencilla para la comunican de servidores en aplicaciones distribuidas basadas en Java.
En otros lenguajes se puede utilizar CORBA o SOAP en vez de RMI.
La característica de RMI es la facilidad de su uso en la programación por estar diseñado en Java, se puede pasar objetos por referencia, recolectar basura y paso de tipos arbitrarios.
Con RMI, un programa en Java puede exportar un objeto y así estar accesible en la red, entonces el programa permanece esperando peticiones de un puerto TCP. Con este método un cliente podrá conectarse i llamar métodos dados al objeto.
La invocación tiene los siguientes pasos:
- Encapsulado de los parámetros.
- Invocación del método.
- El servidor manda alguna respuesta.
- El cliente recibe la respuesta y puede utilizarlo.
Serialización
La serialización es un proceso de calificación de un objeto en un medio de almacenamiento ya sea un archivo o un buffer de memoria con el propósito de mandarlo a través de un conexión de red como cadenas de bytes o un formato mas legible como XML.
Esta es una forma muy común de para pasar objetos a través de la red, para hacer persistente un objeto en un archivo o base de datos, o para distribuir objetos idénticos a varias aplicaciones.
Algunas ventajas son:
Un método para checar el cambio en variables con respecto al tiempo
Un método de persistencia de objetos
Un método para la distribución de objetos.
Socket
El socket es concepto abstracto en el cual dos programas programas pueden pasarse datos de manera ordenada.
Un socket se constituye de dos direcciones, una IP y una REMOTA, un protocolo de transporte un par de números de puerto local y remoto.
Los sockets permiten implementar un cliente-servidor. La comunicación debe ser iniciada por uno de los programas que se denomina programa cliente y el segundo programa se mantiene esperando a que el programa cliente inicie por eso se llama servidor.
En mi proyecto
En mi proyecto puedo implementar un pequeño ejemplo que utilicé algunos de estos métodos, lo que se me ocurre es que varias personas puedan dibujar online al mismo tiempo, para esto quiero utilizar algunas propiedades de Javascript y HTML5 como son los socket utilizando Websockets y la serialización :
"Con HTML5 contamos con una nueva técnica para almacenar datos persistentes en el navegador cliente. Cuando HTML5 esté ampliamente extendido podremos hacer uso del API DOM Storage de HTML5 con el cúal los datos persistirán entre sesiones sin tener que usar las limitadas cookies (4KB por cookie). Con el API DOM Storage y los métodos JSON#stringify y JSON#parse podremos almacenar objetos complejos de un modo muy sencillo."
Este es un ejemplo de página en donde varias personas pueden dibujar online:
http://william.hoza.us/graffiti/

Bibliografía
http://es.wikipedia.org/wiki/Sistema_distribuido
http://es.wikipedia.org/wiki/Serializaci%C3%B3n
http://www.inmensia.com/blog/20110125/html5_web_sockets.html
http://notasweb.com/articulo/javascript/persistencia-de-objetos-javascript-en-html5.html
domingo, 10 de abril de 2011
Diseño de pruebas unitarias
Semana 11

Y en la siguiente entrada aplicaré estos conceptos a mi proyecto.
JsUnit:
http://www.jsunit.net/
Bibliografía:
http://es.wikipedia.org/wiki/Prueba_unitaria
http://msdn.microsoft.com/es-es/library/ms182517(v=vs.80).aspx
Clase de Programación Orientada a Objetos
Ventajas
El objetivo de las pruebas unitarias es aislar cada parte del programa y probar su correcto funcionamiento, estas pruebas individuales proporcionan 5 ventajas básicas:
Limitaciones
Pruebas Unitarias para mi Proyecto en Javascript y Html5

Para esto lo primero que hice fue descargar JsUnit:

después descomprimimos el "jsunit2_2.zip", ahora dentro de la carpeta descomprimida tenemos varios archivos y carpetas interesantes por ejemplo: tenemos una carpeta llamada "tests" con muchos ejemplos útiles que podemos correr, y tenemos el archivo llamado "testRunner" que es en dónde probaremos nuestro código.
"testRunner.html"

Carpeta "tests"


Una prueba unitaria es la manera de probar el buen funcionamiento de un módulo de código. Esto sirve para asegurar que cada uno de los módulos funcione correctamente independientemente uno del otro.
El objetivo es escribirle casos de prueba a cada método en el módulo de forma que cada caso sea independiente de lo demás.
Las pruebas unitarias sirven para utilizar otro código fuente llamado directamente a los métodos de una clase, pasando los parámetros necesarios y después, si se incluyen instrucciones Assert se pueden comparar valores esperados, los métodos de las clases unitarias se basan en clases Test, que se almacenan en archivos de código fuente.
Características de las pruebas unitarias
Las pruebas unitarias deben cumplir con los siguientes requisitos para que sean buenas:
- Automatizable: Es decir no se debería hacer manualmente.
- Completas: Deben de contener la mayor cantidad de código.
- Repetibles: Se deben crear pruebas para ejecutarlas varias veces.
- Independientes: La ejecución de una prueba no tendrá nada que ver con la ejecución de otra prueba, deben ser independientes.
- Profesionales: Las pruebas deben ser tomadas en cuenta con la misma importancia que el código, con documentación, etc.
Ventajas
El objetivo de las pruebas unitarias es aislar cada parte del programa y probar su correcto funcionamiento, estas pruebas individuales proporcionan 5 ventajas básicas:
- Fomentan el cambio: Facilitan al programador encontrar errores para así poder reeprogramar el código.
- Simplifica la integración: Ya que si el código funciona correctamente indivdualmente se facilita más adaptarlo para las pruebas de integración.
- Documenta el código: En dónde las propias pruebas unitarias son documentación del código ya que se puede ver como utilizarlo.
- Separa la interfaz y la implementación
- Los errores son más fáciles de encontrar
Limitaciones
Se debe de saber que las pruebas unitarias no descubrirán todos los errores del código. Ya que sólo prueban unidades por si solas. Entonces no son capaces de descubrir errores de integracion, problemas de rendimiento, entre otros.

Para esto lo primero que hice fue descargar JsUnit:

después descomprimimos el "jsunit2_2.zip", ahora dentro de la carpeta descomprimida tenemos varios archivos y carpetas interesantes por ejemplo: tenemos una carpeta llamada "tests" con muchos ejemplos útiles que podemos correr, y tenemos el archivo llamado "testRunner" que es en dónde probaremos nuestro código.


Carpeta "tests"


Después también encontré otra herramienta para pruebas unitarias que me ha gustado un poco más se llama Qunit, y es muy fácil de intalar solamente se tienen que descargar dos archivos uno .js y otro .css para poder ver el resultado de tus pruebas unitarias.
Así es como se ve:

Y en la siguiente entrada aplicaré estos conceptos a mi proyecto.
JsUnit:
http://www.jsunit.net/
Bibliografía:
http://es.wikipedia.org/wiki/Prueba_unitaria
http://msdn.microsoft.com/es-es/library/ms182517(v=vs.80).aspx
sábado, 9 de abril de 2011
Implementación de pruebas unitarias
Semana 11
Taller de Programación Orientado a Objetos

La prueba:

Y en mi proyecto hicé esta pequeña prueba que decia si el objeto devuelto era el esperado, como líneas, círculos...etc.
Este es el código:

Y esta es la prueba:

Podemos ver que todas pasaron a prueba sólo en el módulo 4 no dónde se esperaba un valor de retorno de false y llegó true.
Taller de Programación Orientado a Objetos
Para empezar les voy a mostrar un ejemplo de pruebas unitarias que lo que hace es verificar si el valor es un string o un número:
El código:

La prueba:

Y en mi proyecto hicé esta pequeña prueba que decia si el objeto devuelto era el esperado, como líneas, círculos...etc.
Este es el código:

Y esta es la prueba:

Podemos ver que todas pasaron a prueba sólo en el módulo 4 no dónde se esperaba un valor de retorno de false y llegó true.
Saludos.
viernes, 1 de abril de 2011
Identificación de eventos, excepciones y errores
Semana 10
Clase Programación Orientada a Objetos


Se pueden tratar también con try/catch.

Clase Programación Orientada a Objetos
Excepciones

El manejo de excepciones es una estructura de control en la programación creada para manejar situaciones anormales que pueden ser tratadas por el mismo programa que se desarrolla.
Es decir un programa podría admitir cierta cantidad de errores y continuar su proceso produciendo el mejor resultado que le es posible en vez de una salida desagradable que este llena de mensajes que puede que el usuario no entienda.
Muchas veces se soluciona con algún mensaje informativo y se termina; otras veces es una indicación de que se necesita cambiar la forma de resolución del problema.
Muchos lenguajes incluyen el manejo de excepciones, y javascript no es la "excepción".
Las excepciones son imprevistos que ocurren durante la ejecución de un programa.
Su objetivo, es separar el código para manejar errores de la lógica de aplicación del programa. Cuando ocurre una excepción lo que se hace es seguir la ejecución del programa hasta encontrar algo que maneje esa excepción, el cual en ese momento tomará el control de la aplicación.
En Javascript, manejar errores resulta muy necesario ya que presenta dificultad natural para testear aplicaciones. Por lo generar los errores en Javascript son poco informativos, especialmente en IE. Por lo que es muy interesante contar con operadores que permiten lanzar nuestros propios y particulares mensajes indicando que algo salió
mal.
Las excepciones pueden hacerse con:
Throw
La manera mas sencilla de lanzar errores es utilizando throw. Este comando nos permite mandar al navegador un evento similar al que ocurre cuando pasa algo imprevisto o hay un tipo inesperado de datos. El lenguaje permite enviar todo tipo de elementos, incluyendo texto, números, valores booleanos o incluso objetos. Pero la opción más usual es enviar el objeto nativo Error.
Try/Catch
Es una estructura en javascript que permite comprobar el flujo de un programa con comportamientos inesperados. La diferencia entre throw y try/catch es que throw detiene completamente la ejecución mientras que catch realiza una acción determinada frente a los errores para proseguir después con el flujo definido.
Este tipo de excepciones se estructuran con un código que evalúa una condición previa y propone una ejecución predefinida y otra alternativa frente a anormalidades.
En mi proyecto...
He estado pensando mucho las excepciones que podría manejar mi proyecto sin embargo me ha sido muy difícil pensar en alguna puesto que aun no llego a un punto avanzado de mi proyecto, se me viene a la mente quizá cuando el usuario quiera usar una fotografía de algún álbum de un amigo y que al momento de cargar el álbum por paint la foto aún este ahí pero a la hora de seleccionar esa foto en partícula ya no este entonces obviamente javascript ya no podrá acceder a ella, ya que no se encuentra en la memoria, pero me resulta difícil comprobar si de verdad pasaría eso, o si son excepciones que facebook ya maneja por defecto.
Entonces he pensado en esta otra, es una excepción para cuando el navegador web no soporta el elemento "canvas", entonces se mandaría un mensaje al usuario sugiriendo que utilicé otro navegador como Chrome o algo así.
Errores

Los errores comunes en javascript pueden ser "errores de ejecución" que ocurren cuando se están ejecutando los scripts, por ejemplo la llamada a alguna función que no ha sido definida.
La otra forma en la que Javascript muestra un error puede variar de un navegador a otro. En versiones antiguas algunos navegadores como IE y Netscape lanzaban al usuario una ventanita con el error y un botón de aceptar. En la actualidad estos errores se mantienen más ocultos para el usuario, ya que es molesto que salgan esos mensajes de error cuando puede ser que el usuario no se de cuenta de que estén ocurriendo.
En mi proyecto...
Una aplicación para mi proyecto podría ser cuando el usuario entró a la aplicación con acceso a internet, pero después dejo de tener acceso a internet, entonces la aplicación web que funciona cuando se tiene internet dejará de funcionar. Esto lo podré detectar con un script en Javascript que comprueba la conexión a internet queriendo cargar una página confiable tipo "wikipedia" o "google".
Otro enfoque de errores en mi código Javascript es un poco complicado ya que por ejemplo, cuando pruebo mi código y hay algún error el navegador simplemente no me muestra nada. Entonces tengo la opción de gestionar los errores utilizando el evento onerror que se lanza siempre que se produce un error en
el código Javascript.
Eventos

Los eventos es todo lo que permite la interacción con el usuario, se produce mediante la captura de eventos que se produce.
Los eventos se capturan mediante los manejadores de eventos, el proceso que se realiza se captura mediante funciones en Javascript que se llaman "manejadores de eventos"
Cuando un usuario visita una página web e interactúa con ella se crean eventos y con Javascript se puede definir que es lo que se quiere que ocurra cuando se producen los eventos.
Con los eventos podemos responder a las acciones de los usuarios. Ejemplos de manejadores de eventos:
- onAbort
- onBlur
- onChange
- onClick
- onDragDrop
- onMouseMove
- onMouseOut
- onMouseOver
- onMouseUp
- onError
Entre muchos otros.
En mi proyecto...
En mi proyecto estoy manejando ya varios eventos como:
- onMouseOver:Este evento me sirve para saber cuando se esta pasando el mouse dentro del elemento canvas.
- onMouseOut: Este manejado lo utilizo para saber cuando el mouse esta fuera del elemento canvas.
- onClick: Y este otro será quizá el evento más utilizado en el proyecto me indica cuando el usuario a dado algún click en el elemento canvas, así como en botones, radios, etc., etc.
Y me faltan implementar alguos otros como drag-and-drop
En la próxima entrada implementaré algo de código para cada evento, excepción y error.
miércoles, 30 de marzo de 2011
Implementación de eventos, excepciones y errores
Semana 10
Taller de Programación Orientada a objetos
Excepciones
Esta es la manera en la que lo implementé en javascript:

Errores

Eventos
Esta es la parte en el documento html:
Y la parte en javascript:

Excepciones
En este caso programé la excepción que había comentado en la entrada pasada, sobre si el navegador soporta el elemento canvas de html5, para esto voy a utilizar un try/catch
<html>
<head>
<script>
try{
document.createElement("canvas").getContext("2d");
alert("HTML5 es soportado en tu navegador");
} catch(e) {
alert("HTML5 no está soportado en tu navegador");
}
</script>
</head>
<body>
<canvas id="canvas" width="150" height="150"></canvas>

Errores
En esta parte implemené un código que muestra un error cuando no hay conexión a internet, para hacerlo el script de JS lo que hace es tratar de cargar una página conocida como "google" o "wikipedia" y si no se cargan entonces esto quiere decir que no hay conexión a internet.
Y aquí esta el código en la función llamada "internet", en donde tengo una variable que se llama "imgsrc" que es la que obtiene una imagen de internet en este caso de google, la variable "img" que será tipo imagen, y contendrá la imagen en internet, entonces empieza el "try" que dice que se carga "img", pero si no sucede eso para esto esta el catch para mandar un mensaje que "no hay acceso a internet".
function internet(){
var imgsrc = 'http://www.google.es/intl/en_com/images/logo_plain.png';
var img = new Image();
try
{
img.onload = function () {
alert("Hay conexion a internet.");
}
}
catch(err)
{
alert("No hay acceso a internet");
}
img.src = imgsrc;
}

Eventos
En eventos tengo programado en mi canvas que se pueda saber cuando el mouse esta adentro del elemento o afuera, si hizó un click.
<canvas id="paint" width="700" height="500"
onmouseover="mouseAdentro(event)"
onmouseout="mouseAfuera(event)"
onclick="click(event)">Navegador no soportado
Y la parte en javascript:
window.onload = function() {
canvas=document.getElementById("paint");
contexto=canvas.getContext("2d");
evento("clickkkk plis");
}
function evento(str) {
contexto.clearRect(0,0,canvas.width,canvas.height);
contexto.font="9pt Calibri";
contexto.textAlign="center";
contexto.fillText(str, 288, 100);
}
function mouseAdentro(evt) {
evento("estas adentro del canvas");
}
function mouseAfuera(evt) {
evento("estas fuera");
}
function click(evt) {
var mouseX = evt.clientX - canvas.offsetLeft;
var mouseY = evt.clientY - canvas.offsetTop;
evento("estas clickeando " + mouseX + " " + mouseY);
if (!empiezo) {
contexto.beginPath();
contexto.moveTo(mouseX, mouseY);
empiezo = true;
} else {
contexto.lineTo(mouseX, mouseY);
contexto.stroke();
}
}

Esto es todo, espero comenten.
martes, 29 de marzo de 2011
Selección de patrones de diseño
Semana 9
Clase Programación Orientada a Objetos
Patrones de diseño
Categoría de patrones
Plantillas de patrones
Patrones GoF
Estructurales
De comportamiento
Creacionales
Patrones de diseño en mi Proyecto
*Prototype*


Los participantes

*Factory*
Este es un patrón de diseño que me podría servir para la creación de objetos de un tipo determinado, como las lineas, dibujo libre, cuadros, etc, etc.
Ventajas:
Desventajas:
Diagrama de mi proyecto:

*Composite*

*Memento*

Ventajas
Es facil volver a estados anteriores o recientes.
Desventajas
Los mementos son costosos, es costoso crear los objetos Memento si se tiene que almacenar todas las partes del estado del Originator.
Sitios de referencia:
Clase Programación Orientada a Objetos
Patrones de diseño
Los patrones de diseño representan una solución a problemas comunes en el desarrollo de softwares y al diseño de interfaces.
Son métodos probados efectivos en la revolución de problemas, reusables es decir que puedes ser utilizados para resolver problemas parecidos en circunstancias distintas, flexibilidad, estandarización y organización en el código, así como evitar la búsqueda de soluciones a problemas que ya fueron resueltos, entre otras ventajas más.
Categoría de patrones
- Patrones de arquitectura.-Tratan sobre la estructura fundamental de un sistema de software.
- Patrones de diseño.-Ayudan con la estructura de diseño de un sistema de software.
- Dialectos.-Son llamados de bajo nivel porque sirven para algún lenguaje de programación o entorno en especifico.
Además también existen los patrones de:
- Interacción: Ayudan con el diseño de interfaces web.
Plantillas de patrones
Son las características principales que describen a los patrones como: Nombre del patrón, Clasificación del patrón, Intención, También conocido como(otros nombres para el patrón), Motivación, Aplicabilidad, Estructura, Código ejemplo, Usos conocidos, entre otros.
Son clasificados de acuerdo a sus objetivos en estructurales, de comportamiento y creacionales.
- Estructurales: Estos patrones describen como relacionar clases y objetos para formar nuevas estructuras mas grandes y añadir funcionalidades.
- De comportamiento: Ayudan a definir la comunicación entre los objetos de un sistema.
- Creacionales: Hablan de la forma de como crear instancias de objetos su propósito es ocultar la manera en que se crea e inicializa un objeto.
Estructurales
- Adapter(Adaptador): Como su nombre lo dice se encarga de adaptar(en vez de tener que cambiar el código) por ejemplo algún código ya existente en nuestro programa a alguna librería.
- Bridge(Puente): Separa una abstracción de su implementación.
- Composite(Objeto compuesto): Deja tratar objetos compuestos como si fueran simples.
- Decorator(Envoltorio): Proporciona funcionalidades a una clase dinamicamente.
- Facade(Fachada): Proporciona una interfaz simple para acceder a un grupo de interfaces de un sistema.
- Flyweight(Peso ligero): Disminuye la repetición cuando muchos objetos poseen información idéntica.
- Proxy: Es como un intermediario que se encarga de llamar a el método de la clase real pero primero habiendo pasado por el mismo para asegurar que el que llama a el objeto realmente tiene permisos para realizar la acción.
De comportamiento
- Chain of Responsibility(Cadena de responsabilidad): Deja establecer la linea que necesitan llevar los mensajes para que los objetos sean capaces de realizar la tarea indicada.
- Command(Orden): Encapsulamiento de una operación en un objeto.
- Interpreter(Interprete): En un lenguaje, determina una gramática para dicho lenguaje, y las herramientas que se ocupan para interpretarlo.
- Iterator(Iterador): Deja recorrer objetos compuestos sin importar su implementación.
- Mediator(Mediador): Especifica como un objeto puede coordinar a objetos de diferentes clases, funcionando como un conjunto.
- Memento(Recuerdo): Es como un tipo "restauración del sistema".
- Observer(Observador): Establece dependencias entre objetos, así cuando un objeto cambia se mande un mensaje y se modifiquen los demás objetos relacionados.
- State(Estado): Deja que un objeto cambie su comportamiento cada vez que se modifique su estado interno.
- Strategy(Estrategia): Permite tener varios métodos para resolver un problema, y elegir en tiempo de ejecución el método adecuado.
- Template Method(Método plantilla): Determina en un procedimiento la estructura de un algoritmo, repartiendo en las subclases ciertos pasos.
- Visitor(Visitante): Define otras operaciones sobre una jerarquía de clases sin cambiar las clases sobre las que funciona.
Creacionales
- Abstract Factory(Fabrica abstracta): Deja trabajar con objetos de diferentes familias de manera que las familias no se mezclan entre ellas.
- Builder(Constructor y virtual): Separa el proceso de crear un objeto complejo, enfocando dicho proceso en un punto.
- Factory Method(Método de fabricación): Crea objetos de una clase de un subtipo determinado.
- Prototype(Prototipo): Se utiliza para "clonar" objetos.
- Singleton(Instancia única): Asegura que exista una instancia para una clase y la creación de una forma de acceso global a dicha instancia.
Patrones de diseño en mi Proyecto
*Prototype*
Que como ya lo describí anteriormente, este patrón permite "clonar" instancias de objetos creando nuevos objetos idénticos.
En mi proyecto el Editor de Dibujo lo utilizaría principalmente en la función "copiar" de mi programa. Cuando por ejemplo se selecciona algún objeto un circulo, cuadro, etc. y se quiere crear un objeto exactamente igual. Esa sería la función que yo le daría a el patrón Prototype.

Este patrón permite la creación del objeto en distintas variantes cuando el programa lo necesita, en donde el código que utiliza los objetos, solicitará una copia del objeto que necesite. La copia significa otra instancia del objeto, cada objeto prototipo debe implementar el método clone().

Los participantes
Prototipo: Declara una interfaz para la colación en sí.
ConcretePrototype: Implementa una operación de clonación en sí.
Cliente: Crea un nuevo objeto haciendo un prototipo para clonarse a sí mismo.
Ventajas
- Añadir y eliminar productos en tiempo de ejecución.
- Especificar nuevos objetos variando los valores.
- Especificar nuevos objetos variando la estructura.
- Reducción de subclases.
- Configuración de una aplicación con clases dinamicamente.
Aplicado a mi proyecto:

*Factory*
Este es un patrón de diseño que me podría servir para la creación de objetos de un tipo determinado, como las lineas, dibujo libre, cuadros, etc, etc.
Ventajas:
El principal beneficio de utilizar el patrón de la fábrica es que se puede desacoplar los objetos. Usando el método fabrica en lugar de la nueva palabra clave y una clase concreta que permite centralizar la creación de instancias de código en un solo lugar. Esto hace que sea mucho más fácil que cambiar las categorías, o asignar a clases dinámicamente en tiempo de ejecución. También permite una mayor flexibilidad a la hora de subclases.
Todos estos beneficios están relacionados con dos de los principios de diseño orientado a objetos: hacer que sus objetos están debidamente acoplados, y evitar la duplicación de código.
Desventajas:
Es tentador tratar de usar métodos de fábrica en todas partes, en lugar de los constructores normales, pero esto rara vez es útil. La mayoría de creación de instancias de clases es mejor hacerlo al aire libre, con la palabra clave new y un constructor. Esto hace que el código más simple y más fácil de seguir, en lugar de tener que localizar este metodo para ver qué clase se crea una instancia, se puede ver inmediatamente lo que se llama constructor. Pueden ser muy útiles cuando son necesarias, pero asegúrese de no abusar de ellos.
Diagrama de mi proyecto:

*Composite*
Y este patrón me parece que lo podría implementar en mi código en la parte en la que quiero seleccionar algún objeto u objetos que ya haya hecho, ya que la idea que tengo en mente es poder seleccionar ya hechas las figuras cualquiera de ellas, entonces si selecciono varias figuras para copiar todas se copien y se comporte como si fuera un solo objeto, pero que también se puedan separar.
Entonces tengo cada objeto por no repetir todos solo pongo tres que son Cuadrado, Triángulo y Circulo, en donde todos ellos forman un GrupoImagenes que a la vez varios o uno solo GrupoImagenes pueden formar un gráfico.
Este es el diagrama de mi proyecto:

Ventajas:
Mejora la realización de código y facilita la refactorización.
Los objetos compuestos son excelentes estructuras jerárquicas. Cada vez que se ejecuta una operación en un compuesto de alto nivel, que son esencialmente de realizar una búsqueda en profundidad sobre la estructura completa para encontrar los nodos. Es muy fácil añadir, eliminar y buscar los nodos dentro de la jerarquía.
Desventajas:
Puede afectar el rendimiento del programa por el hecho de que cualquier operación llamada en un compuesto se transmite a todos sus hijos, el rendimiento puede sufrir si la jerarquía es demasiado grande ya que no es muy obvio para un programador que el método topGallery.show () inicia un recorrido completo de un árbol.
*Memento*
Este es el ultimo del que hablaré y su uso es bastante obio y aplicable a mi proyecto al menos asi es como lo veo.
Este patron tiene como finalidad guardar un objeto en un momento dado pero de modo que se puedan recuperar los estados anteriores.

Ventajas
Es facil volver a estados anteriores o recientes.
Desventajas
Los mementos son costosos, es costoso crear los objetos Memento si se tiene que almacenar todas las partes del estado del Originator.
Sitios de referencia:
http://www.apwebco.com/gofpatterns/creational/Prototype.html
http://java.ciberaula.com/articulo/diseno_patrones_j2ee/
http://java.ciberaula.com/articulo/diseno_patrones_j2ee/
http://www.apwebco.com/gofpatterns/creational/Prototype.html
lunes, 28 de marzo de 2011
Incorporación de patrones de diseño
Semana 9
Taller de Programación Orientada a Objetos

Y este es el código:
Patrón Factory
Bueno el Patrón Factory lo elegí porque me permite hacer muchos objetos que es lo que necesito para mi editor de dibujo, pero es importante para mi aclararles que la verdad me revuelve un poco esta manera de crear objetos a como yo los creaba antes, entonces el código aquí esta, sin embargo, no es seguro que sea el definitivo, esto es en el caso de Factory.
Este es el diagrama:

Y este es el código:
Patrón prototype
Este es otro más que me parece adecuado para mi para que a la hora que se quieran copar los objetos se haga de manera eficiente.
Este es el diagrama:

Y este es el código:
Taller de Programación Orientada a Objetos
Ahora la implementación en código de los patrones de Diseño que creo adecuados para mi proyecto, aunque no es definitivo que se queden en el código, ya que hay algunas cosas que me parecen mas sencillas si las implemento con mi propio código, pero usaré lo que mas me simplifique el código.
El patrón Composite
Este no es el caso de lo que dije arriba, ya que tenia solo pensado que quería poder agarrar las cosas individualmente ya después de haberlas hecho por ejemplo un circulo, una raya, etc., para poderlos mover, copiar, borrar pero no tenia ni idea de como, siento que este patrón me abrió bastante la mente.
Este es el diagrama:

Y este es el código:
#include "GrupoImagenes.js"
Grafico = function ()
{
this._init ();
}
Grafico.prototype._init = function ()
{
}
Grafico.prototype.pintar = function ()
{
}
#include "Grafico.js"
GrupoImagenes = function ()
{
this._init ();
}
GrupoImagenes.prototype = new Grafico ();
GrupoImagenes.prototype._init = function ()
{
this.m_cantidad = "";
}
GrupoImagenes.prototype.pintar = function ()
{
}
#include "Grafico.js"
Triangulo = function ()
{
this._init ();
}
Triangulo.prototype = new Grafico ();
Triangulo.prototype._init = function ()
{
this.m_base = "";
this.m_altura = "";
}
Triangulo.prototype.pintar = function ()
{
}
#include "Grafico.js"
Cuadrado = function ()
{
this._init ();
}
Cuadrado.prototype = new Grafico ();
Cuadrado.prototype._init = function ()
{
this.m_lado = "";
}
Cuadrado.prototype.pintar = function ()
{
}
#include "Grafico.js"
Circulo = function ()
{
this._init ();
}
Circulo.prototype = new Grafico ();
Circulo.prototype._init = function ()
{
this.m_radio = "";
}
Circulo.prototype.pintar = function ()
{
}
Patrón Factory
Bueno el Patrón Factory lo elegí porque me permite hacer muchos objetos que es lo que necesito para mi editor de dibujo, pero es importante para mi aclararles que la verdad me revuelve un poco esta manera de crear objetos a como yo los creaba antes, entonces el código aquí esta, sin embargo, no es seguro que sea el definitivo, esto es en el caso de Factory.
Este es el diagrama:

Y este es el código:
//parte de codigo
#include "Factory.js"
Factory = function ()
{
this._init ();
}
Factory.prototype._init = function ()
{
}
Factory.prototype.crearCirculo_Circulo = function ()
{
}
Factory.prototype.crearRectangulo_Rectangulo = function ()
{
}
Factory.prototype.crearLinea_Linea = function ()
{
}
Factory.prototype.crearPoligono_Poligono = function ()
{
}
#include "Factory.js"
#include "Circulo1_Concreta.js"
#include "Linea1_Concreta.js"
#include "Poligono1_Concreta.js"
#include "Rectangulo1_Concreta.js"
FactoriaConcreta_1 = function ()
{
this._init ();
}
FactoriaConcreta_1.prototype = new Factory ();
FactoriaConcreta_1.prototype._init = function ()
{
}
FactoriaConcreta_1.prototype.crearCirculo_Circulo = function ()
{
}
FactoriaConcreta_1.prototype.crearRectangulo_Rectangulo = function ()
{
}
FactoriaConcreta_1.prototype.crearLinea_Linea = function ()
{
}
FactoriaConcreta_1.prototype.crearPoligono_Poligono = function ()
{
}
Patrón prototype
Este es otro más que me parece adecuado para mi para que a la hora que se quieran copar los objetos se haga de manera eficiente.
Este es el diagrama:

Y este es el código:
//parte de codigo
#include "FigGeom.js"
Dibujo = function ()
{
this._init ();
}
Dibujo.prototype._init = function ()
{
}
Dibujo.prototype.dibujar = function ()
{
}
Dibujo.prototype.rellenar = function ()
{
}
Dibujo.prototype.agregarClick = function ()
{
}
#include "FigGeom.js"
Circulo = function ()
{
this._init ();
}
Circulo.prototype = new FigGeom ();
Circulo.prototype._init = function ()
{
}
Circulo.prototype.clone = function ()
{
}
FigGeom = function ()
{
this._init ();
}
FigGeom.prototype._init = function ()
{
}FigGeom.prototype.clone = function ()
{
}
#include "FigGeom.js"
Ovalo = function ()
{
this._init ();
}
Ovalo.prototype = new FigGeom ();
Ovalo.prototype._init = function ()
{
}
Ovalo.prototype.clone = function ()
{
}
miércoles, 23 de marzo de 2011
Demostraciones de avance parcial
Taller de Programación Orientada a Objetos
Semana 8
Este es el código html:


Ahora unas capturas de pantalla:
Así es como se ve el editor de dibujo:

El menú:

Las herramientas:
Semana 8
Primero que nada les mostrare mi código html, que consta de una lista a seleccionar que formará el menú y las herramientas, por ahora menú solo contiene las opciones para dibujar lineas, libre, rectángulos y la opción herramientas contiene guardar, nuevo, salir y exportar, también contiene el elemento canvas que esta formado de 700 por 500 pixeles, y le activo los eventos de el mouse para cuando se pase por encima de el "onmouseover", "onmouseout" y "onclick" a cada uno le puse el nombre de la función mouseAdentro, mouseAfuera y click, lo que hace cada uno es detectar cuando el ratón pasa por el canvas.
Por ahora están juntos el css y el html.
Este es el código html:


Ahora les muestro mi código en javascript, por ahora esta muy simple ya que solo detecta los movimientos de mouse con las funciones ya mencionadas, y hace lineas simples aunque aun no de la forma que quisiera, este es el código:
var canvas=null;
var contexto=null;
var empiezo = false;
var guardo = new Array();
window.onload = function() {
canvas=document.getElementById("paint");
contexto=canvas.getContext("2d");
evento("clickkkk plis");
}
function evento(str) {
contexto.clearRect(0,0,canvas.width,canvas.height);
contexto.font="9pt Calibri";
contexto.textAlign="center";
contexto.fillText(str, 288, 100);
}
function mouseAdentro(evt) {
evento("estas adentro del canvas");
}
function mouseAfuera(evt) {
evento("estas fuera");
}
function click(evt) {
var mouseX = evt.clientX - canvas.offsetLeft;
var mouseY = evt.clientY - canvas.offsetTop;
evento("estas clickeando " + mouseX + " " + mouseY);
if (!empiezo) {
contexto.beginPath();
contexto.moveTo(mouseX, mouseY);
empiezo = true;
} else {
contexto.lineTo(mouseX, mouseY);
contexto.stroke();
}
}
function nuevo(){
ctx.fillStyle = "white";
ctx.fillRect(0, 0, 500, 500);
}
Las partes más importantes del código considero que son la función click ya que es la encargada de hacer las lineas al sentir el evento de click, tiene un booleano que es el que ayuda a identificar si es la primera vez que se esta haciendo la linea o no,
otra función es la de nuevo,que se encarga de limpiar todo el canvas de una manera muy simple, dibuja un rectangulo blanco en todo el área del canvas, y aun tengo en el código una función que me imprime las coordenadas del mouse, esto es solo como prueba aún.
Ahora unas capturas de pantalla:
Así es como se ve el editor de dibujo:

El menú:

Las herramientas:

jueves, 17 de marzo de 2011
Presentación diagramas UML
Semana 8
Clase Programación Orientado a Objetos
Creo importante mencionar que durante la semana cambie el diagrama de secuencia, debido a algunas sugerencias que recibí:

Bueno todo lo demás quedo aclarado en la presentación en clase. Saludos
Clase Programación Orientado a Objetos
Diagramas UML
View more presentations from cecyurbina.
Creo importante mencionar que durante la semana cambie el diagrama de secuencia, debido a algunas sugerencias que recibí:

Bueno todo lo demás quedo aclarado en la presentación en clase. Saludos
miércoles, 16 de marzo de 2011
Código autogenerado y comparación
Semana 6
Taller Programación Orientado a Objetos
Primero que nada creo que es importante mencionar que los diagramas que mostré en la entrada pasada fueron hechos por mi, no fué un diagrama autogenerado ya que mi proyecto esta basado en Html5 y Javascript y aunque encontré una herramienta en Eclipse para hacer código en Javascript este no soporta las etiquetas de Html5 es por esta razón que yo hice los diagramas a mano y por la misma causa no se podrá generar código en Html5 así que mostraré primero que nada como es que utilicé las herramientas para generar los diagramas, y por ultimo autogenerar el código.
Diagrama de clase

Lo cree con Umbrello, que es una herramienta para crear diagramas UML que ayudan en la creación de un software, se pueden hacer los diagramas manualmente o importarlos de códigos como Java, Python, C++, Javascript entre otros y viceversa es decir ya creado el diagrama pasarlo al código correspondiente.

El diagrama de clase que muestro en la presentación lo realicé en una aplicación online http://www.gliffy.com/ , es bastante cómodo de usar aunque se utiliza simplemente para representaciones gráficas con el no sería posible generar un código a partir del diagrama.
Diagrama de secuencia
El diagrama de secuencia lo genere en dos distintos sitios online http://www.websequencediagrams.com/ en donde a partir de esta entrada:

se genera el siguiente diagrama:

y también hice uno en http://www.gliffy.com/ que es el que muestro en la presentación

Codigo autogenerado
El codigo lo autogenere en Umbrello a partir del diagrama de clases, una vez que se tiene el diagrama:

nos tenemos que ir a la pestaña de Code y luego en Generated All Code, una vez que se hicieron estos pasos aparecerá una ventana diciendonos que no encuentra la carpeta llamada "uml-generated-code" que debe de estar en /home/ubuntu/, entonces en el terminal creo la carpeta con ese nombre:
ubuntu@ubuntu:~$ mkdir uml-generated-code
Y ahora si no tendremos problemas para generar el código.Aquí estan algunas capturas de pantalla:

Aqui podemos elegir el lenguaje al que se quiere hacer el código

Estos son los archivos generados en la carpeta que acababamos de crear
Esta es una parte de código generado en C++ para la clase dibujo:
dibujo.cpp
#include "Dibujo.h"
// Constructors/Destructors
//
Dibujo::Dibujo ( ) {
initAttributes();
}
Dibujo::~Dibujo ( ) { }
//
// Methods
//
// Accessor methods
//
// Other methods
//
void Dibujo::initAttributes ( ) {
}
dibujo.h
#ifndef DIBUJO_H
#define DIBUJO_H
#include
#include vector
/**
* class Dibujo
*
*/
class Dibujo
{
public:
// Constructors/Destructors
//
/**
* Empty Constructor
*/
Dibujo ( );
/**
* Empty Destructor
*/
virtual ~Dibujo ( );
// Static Public attributes
//
// Public attributes
//
int color;
int transparencia;
int coordenadaX;
int coordenadaY;
int grosor;
// Public attribute accessor methods
//
// Public attribute accessor methods
//
/**
* Set the value of color
* @param new_var the new value of color
*/
void setColor ( int new_var ) {
color = new_var;
}
/**
* Get the value of color
* @return the value of color
*/
int getColor ( ) {
return color;
}
/**
* Set the value of transparencia
* @param new_var the new value of transparencia
*/
void setTransparencia ( int new_var ) {
transparencia = new_var;
}
/**
* Get the value of transparencia
* @return the value of transparencia
*/
int getTransparencia ( ) {
return transparencia;
}
/**
* Set the value of coordenadaX
* @param new_var the new value of coordenadaX
*/
void setCoordenadaX ( int new_var ) {
coordenadaX = new_var;
}
/**
* Get the value of coordenadaX
* @return the value of coordenadaX
*/
int getCoordenadaX ( ) {
return coordenadaX;
}
/**
* Set the value of coordenadaY
* @param new_var the new value of coordenadaY
*/
void setCoordenadaY ( int new_var ) {
coordenadaY = new_var;
}
/**
* Get the value of coordenadaY
* @return the value of coordenadaY
*/
int getCoordenadaY ( ) {
return coordenadaY;
}
/**
* Set the value of grosor
* @param new_var the new value of grosor
*/
void setGrosor ( int new_var ) {
grosor = new_var;
}
/**
* Get the value of grosor
* @return the value of grosor
*/
int getGrosor ( ) {
return grosor;
}
/**
*/
void redibujar ( )
{
}
/**
*/
void rellenar ( )
{
}
/**
*/
void agregarClick ( )
{
}
protected:
// Static Protected attributes
//
// Protected attributes
//
public:
// Protected attribute accessor methods
//
protected:
public:
// Protected attribute accessor methods
//
protected:
private:
// Static Private attributes
//
// Private attributes
//
public:
// Private attribute accessor methods
//
private:
public:
// Private attribute accessor methods
//
private:
void initAttributes ( ) ;
};
#endif // DIBUJO_H
Código generado en Javascript para la clase Dibujo
/**
* class Dibujo
*
*/
Dibujo = function ()
{
this._init ();
}
/**
* _init sets all Dibujo attributes to their default value. Make sure to call this
* method within your class constructor
*/
Dibujo.prototype._init = function ()
{
/**
*
*/
this.m_color = "";
/**
*
*/
this.m_transparencia = "";
/**
*
*/
this.m_coordenadaX = "";
/**
*
*/
this.m_coordenadaY = "";
/**
*
*/
this.m_grosor = "";
/**Aggregations: */
/**Compositions: */
}
/**
*
*/
Dibujo.prototype.redibujar = function ()
{
}
/**
*
*/
Dibujo.prototype.rellenar = function ()
{
}
/**
*
*/
Dibujo.prototype.agregarClick = function ()
{
}
Y mi código de la clase Dibujo:
/**
*Esta clase es para crear figuras geometricas, lineas o libre
* @class
*/
function Dibujo (){
var color;
var intensidad;
var cor_x;
var cor_y;
function transparencias();
function mov_raton();
}
/**
*Esta es una clase hija de Dibujo(), se encarga de la estructura de las figuras geometricas
*@class
*@augments Dibujo
*/
function FigGeom (){
var relleno;
var contorno;
}
FigGeom.prototype = new Dibujo();
/**
*Esta es una clase hija de Dibujo(), se encarga de crear lineas de rectas y curvas.
*@class
*@augments Dibujo
*/
function Linea (){
var grosor;
}
Linea.prototype = new Dibujo();
/**
*Esta es una clase hija de Dibujo(), define las caracteristicas y las funcionalidades del dibujo libre.
*@class
*@augments Dibujo
*/
function Libre (){
}
Libre.prototype = new Dibujo();
/**
*Esta es una clase hija de FigGeom(), define las caracteristicas y las funcionalidades de que se tendran al crear un elipse.
*@class
*@augments FigGeom
*/
function Elipse (){
}
Elipse.prototype = new FigGeom();
/**
*Esta es una clase hija de FigGeom(), define las caracteristicas y las funcionalidades de que se tendran al crear un rectangulos.
*@class
*@augments FigGeom
*/
function Rectangulos (){
}
Rectangulos.prototype = new FigGeom();
/**
*Esta es una clase hija de FigGeom(), define las caracteristicas y las funcionalidades de que se tendran al crear poligonos.
*@class
*@augments FigGeom
*/
function Poligonos (){
}
Poligonos.prototype = new FigGeom();
/**
*Esta es una clase hija de Linea(), define las caracteristicas y las funcionalidades de que se tendran al querer hacer una linea curveada.
*@class
*@augments Linea
*/
function Curva (){
}
Curva.prototype = new Linea();
/**
*Esta es una clase hija de Linea(), define las caracteristicas y las funcionalidades de que se tendran al querer hacer una linea recta.
*@class
*@augments Linea
*/
function Recta (){
}
Recta.prototype = new Linea();
Suscribirse a:
Entradas (Atom)