Modelado, hilos, Sockets y RMI | Camilo Andrs Ferrer Bustos EAM NOTAS DE CLASE PROGRAMACION AVANZADA I 2 INTRODUCCION
CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
INTRODUCCION Uno de las principales metas de la programacin orientada a objetos es modelar sistemas del mundo real tal y de una forma similar en la que la gente piensa. Las entidades u objetos del modelo pensado se abstraen en lo que se denominan clases. Una clase es una abstraccin de un objeto del mundo real en la cual se encapsulan los datos y el comportamiento del objeto en cuestin as como las relaciones de los otros objetos presentes en el modelo. Estas interacciones deben comportarse de manera similar que aquellas del mundo real, por esta razn los diseadores y programadores deben hacer hincapi en que las clases que construyan garanticen este comportamiento. Este captulo pretende mostrar los pasos mnimos que se deben tomar antes de empezar con la etapa de implementacin de un sistema del mundo real, as como algunas prcticas sanas en el proceso de modelado orientado a objetos. Tambin se introducir el modelado de sistemas usando el mtodo de notacin UML (Unified modelling Lenguage).
GUIA DE DISEO ORIENTADO A OBJETOS Antes de empezar el proceso de programacin de una solucin basada en software es necesario seguir una metodologa de diseo la cual nos lleve a entender el problema a solucionar y sobre todo saber exactamente lo que se debe hacer en el proceso de codificacin. El proceso de diseo es un proceso iterativo el cual tiene como objetivo que en cada iteracin del proceso el mismo sea ms preciso y vislumbre de manera ms clara una solucin ptima al dicho problema a solucionar. Metodologas hay muchas, pero la mayora siguen ciertos pasos mnimos que son:
Anlisis del problema El primer paso para resolver un problema con la metodologa orientada a objetos es analizar el problema en cuestin. En esta etapa el desarrollador y el usuario final de la solucin deben tener una comunicacin intensa la cual debe llevar al encargado de solucionar el problema entenderlo a cabalidad teniendo en cuenta los deseos y necesidades del cliente. En esta etapa no se debe pensar en la solucin del problema sino meramente en entender lo que piensa hacer. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Definicin de los requerimientos. 3
Definicin de los requerimientos. Los requerimientos definen lo que el usuario quiere que el sistema haga. Estos requerimientos deben expresar las necesidades del cliente. En la etapa de anlisis los requerimientos pueden llegar a ser la parte ms importante y la solucin final debe cumplir cada uno de los requerimientos para estar completamente terminada.
Desarrollo de un prototipo de la interfaz de usuario Una de las mejoras cosas que pueden asegurar que los usuarios y desarrolladores estn entendiendo el sistema es crear un prototipo. U prototipo puede ser cualquier cosa, pero una aproximacin podra ser el diseo de la interfaz de usuario al crear las ventanas y como fluyen unas con otras. Esto podra dar una idea de cmo el sistema lucir y cmo ser la interaccin con el usuario. Cualquier prototipo creado no debe contemplar ninguna funcionalidad final. En el diseo de la interfaz de usuario deben aplicarse principios de usabilidad los cuales permitan una interaccin ms natural entre el usuario final y la solucin diseada.
Identificacin De Las Clases. Ya definidos los requerimientos del sistema se puede seguir identificando las clases del mismo. Una manera fcil de identificar las clases es tomar los requerimientos e identificar los sustantivos. Se pueden subrayar todos los sustantivos presentes en los requerimientos y luego de un anlisis posterior se pueden filtrar los sustantivos innecesarios hasta llegar un conjunto mejor definido. Hay que recordar que el proceso de diseo es iterativo y en dicho proceso se puede aadir o eliminar clases segn sea la necesidad.
Determinar Las Responsabilidades De Cada Clase. Ya determinadas las clases es necesario asignarles responsabilidades entre las cuales se encuentran que datos va almacenar y cules son las operaciones sobre dichos datos.
Determinar Como Las Clases Se Colaboran Unas A Otras. Las clases no existen en el modelo aisladamente. Como en los sistemas del mundo real, las entidades del modelo deben interactuar entre ellas para reflejar el comportamiento del sistema que modelan. El medio por el cual las clases se comunican entre s es envindose mensajes.
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
4 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
Crear Un Modelo De Clases Para Describir El Sistema. Cuando todas las clases estn determinadas juntos con sus responsabilidades y colaboraciones, se puede usar una notacin para representar toda esta informacin de manera ms grafica. Una notacin muy utilizada para este fin es el UML el cual es un medio muy eficiente para representar las clases de un modelo.
Caso de estudio I: JUEGO DE BLACK JACK. El resto de este captulo se enfocara en aplicar los conceptos anteriores a travs de ejemplos o casos de estudio. El primer caso de estudio ser un juego de BLACK JACK. Lo primero que se debe entender es el problema el cual esta a continuacin: Se desea implementar un juego de BLACK JACK. En el Black Jack varios jugadores juegan contra un Dealer o casa. Desde la perspectiva del jugador, el objetivo del juego tomar cartas de un mazo de cartas hasta que la suma de las cartas de 21 o lo ms cercano posible sin exceder este valor. El Dealer juega solo con los jugadores, baraja las cartas, da cartas a los jugadores, muestra las manos, calcula el valor de una mano y cuantas cartas posee, determinar el ganador , recibir una apuesta de un jugador, pagar apuesta al ganador y empezar un nuevo juego. Una carta tiene un valor y una pinta y debe ser capaz de reportar ese valor aunque para este juego en particular la pinta no tiene importancia. Todas las cartas deben ser miembros de un mazo de cartas. El mazo debe tener la posibilidad de barajar las cartas, dar la siguiente carta y reportar cuantas cartas quedan en el mazo. El rey, prncipe y la reina valen 10 y el as vale 1 u once. Las otras cartas. Durante el juego un jugador puede pedir una carta para aadir a su mano. El jugador debe mostrar, calcular el valor y las cartas de su mano. Cuando el Dealer pida empezar otra mano, el jugador debe responder. Adems el jugador posee una cantidad de dinero que apostar. las reglas del juego contemplan que si la suma de una mano de un jugador suma 21 o llega los ms cerca posible gana 3:2 de la apuesta hecha, pero si esa suma excede el 21 la apuesta se pierde. Si el Dealer y el jugador quedan empate y excede la suma en 17 hay empate y el jugador se queda con su apuesta. Al principio del juego los jugadores deben hacer su apuesta. Cuando el Dealer recibe apuestas, debe saber de quin vienen y cuanto es el valor de la misma.
Identificar Clases. Como primera medida se identificaran las clases presentes en el enunciado del problema. Una tcnica fcil es tomar el enunciado y resaltar los sustantivos que en ella se encuentran. Hay que recordar que este es un proceso iterativo en el cual las primeras clases que se identifiquen puedan no sobrevivir al proceso y otras nuevas aparecer. A continuacin se muestran los sustantivos del problema:
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Identificar Clases. 5
Se desea implementar un juego de BLACK JACK. En el Black Jack varios jugadores juegan contra un Dealer o casa. Desde la perspectiva del jugador, el objetivo del juego tomar cartas de un mazo de cartas hasta que la suma de las cartas de 21 o lo ms cercano posible sin exceder este valor. El Dealer juega solo con los jugadores, baraja las cartas, da cartas a los jugadores, muestra las manos, calcula el valor de una mano y cuantas cartas posee, determinar el ganador , recibir una apuesta de un jugador, pagar apuesta al ganador y empezar un nuevo juego. Una carta tiene un valor y una pinta y debe ser capaz de reportar ese valor aunque para este juego en particular la pinta no tiene importancia. Todas las cartas deben ser miembros de un mazo de cartas. El mazo debe tener la posibilidad de barajar las cartas, dar la siguiente carta y reportar cuantas cartas quedan en el mazo. El rey, prncipe y la reina valen 10 y el as vale 1 u once. Las otras cartas. Durante el juego un jugador puede pedir una carta para aadir a su mano. El jugador debe mostrar, calcular el valor y las cartas de su mano. Cuando el Dealer pida empezar otra mano, el jugador debe responder. Adems el jugador posee una cantidad de dinero que apostar. las reglas del juego contemplan que si la suma de una mano de un jugador suma 21 o llega los ms cerca posible gana 3:2 de la apuesta hecha, pero si esa suma excede el 21 la apuesta se pierde. Si el Dealer y el jugador quedan empate y excede la suma en 17 hay empate y el jugador se queda con su apuesta. Al principio del juego los jugadores deben hacer su apuesta. Cuando el dealer recibe apuestas, debe saber de quin vienen y cuanto es el valor de la misma. Los sustantivos encontrados son: Jugadores jugador Dealer Cartas Mazo Mano Carta apuesta rey reina prncipe As ganador Black Jack pinta casa
Lo que sigue es determinar cul de estas clases deben sobrevivir para eso hay que analizarlas una a una. Jugador: es uno de los actores principales del juego, es obvia su permanencia en el modelo. Jugadores: son varias instancias de jugador. No es necesario ya que jugador est definido. Dealer: tambin es un actor principal, no se puede hacer nada sin el Dealer. Cartas: pasa lo mismo que entre jugador y jugadores. Carta: este es un juego de cartas, tambin es esencial la permanencia de esta clase. Casa: es el mismo Dealer. Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
6 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
Mazo: muchas de las tareas del juego necesitan el mazo, es por eso que es necesaria esta clase. Pinta: la pinta es un atributo de una carta al igual que el valor.
Black Jack: es el juego en s. Ganador: es un jugador. Reina, Prncipe, as: son tipos de cartas. Mano: el jugador juega sobre una mano lo que hace que esta entidad sea de gran utilidad. Apuesta: es lo que apuesta el jugador. Esto est presente en el juego y por eso debe ser otra clase del modelo. Este anlisis deja seis clases sobrevivientes:
Jugador Mazo Mano Dealer Apuesta Carta
Identificar Responsabilidades. Ya con las clases identificadas hay que determinar que debe hacer cada una de las clases. Un mtodo fcil para determinar las responsabilidades de una clase es mirando los verbos del enunciado del problema o de los requerimientos. Hay que tener en cuenta ciertos aspectos para determinar responsabilidades: No todos los verbos llegan a ser responsabilidades. Si varias clases comparten la misma responsabilidad, ambas son responsables de dicha responsabilidad. Debido a la naturaleza iterativa del proceso de diseo, hay que revisar si faltan o sobran responsabilidades. A continuacin se toma cada clase y leyendo el enunciado del problema se establecen los verbos asociados a ella.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Identificar Responsabilidades. 7
Carta. Dar el valor Dar la pinta Saber si es un comodn Saber si es un as Mazo. Barajar Dar una carta Determinar el nmero de cartas en el mazo Mano Saber cuntas cartas hay en la mano. Saber el valor de la mano Mostrar la mano. Dealer Dar una carta Barajar el mazo Mostrar la mano de un jugador Calcular el valor de la mano de un jugador Saber el nmero de cartas en la mano del Dealer Pedir una carta Determinar el ganador Empezar una mano Recibir apuestas Pagar premio
Jugador Pedir una carta al dealer Mostrar la mano Calcular el valor de su mano Saber cuntas cartas hay en la mano Saber si hay Black Jack Saber si se perdi. Hacer una apuesta. Recibir premio
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
8 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
Apuesta Saber el valor de la apuesta. Saber el jugador que hizo la apuesta.
En general, una clase debe ser responsable de administrar sus propios atributos ya sea dando a conocer su valor o cambiando el valor del mismo.
Determinar Como Las Clases Se Colaboran Unas A Otras. Para identificar las colaboraciones entre las clases del modelo se necesita tener muy claras las responsabilidades de las mismas y para as determinar cmo las clases interactan entre ellas, lo que se puede resumir respondiendo la siguiente pregunta: Qu otras clases necesita este objeto para cumplir todas sus responsabilidades y hacer su trabajo completo? En este proceso se puede llegar a la conclusin que faltan clases o sobran clases para que el modelo quede lo mejor expresado posible. Una manera muy til de determinar las colaboraciones entre las clases del modelo es identificar en el enunciado del problema las interacciones que hay entre los diferentes actores del mismo y luego determinar que operaciones deben llevarse a cabo para completar dicha interaccin. Veamos lo anterior aplicado a nuestro caso de estudio: 1. El Dealer Inicia el juego 2. Dealer Baraja el mazo 3. Jugador hace apuestas 4. El dealer toma una carta del Mazo 5. El Dealer reparte las cartas inciales 6. El jugador aade cartas a su mano 7. El dealer aade cartas a su mano 8. La mano informa al jugador su valor 9. La mano retorna al dealer su valor 10. El dealer pide el jugador si desea jugar ms 11. El dealer reparte otra carta al jugador 12. Dealer pregunta al jugador si quiere otra carta 13. Dealer pide al jugador el valor de su mano 14. El Dealer pide o enva apuestas 15. El jugador enva apuestas al Dealer
Examinando estas oraciones se pueden establecer que clases colaboran entre si y como lo hacen. Lo que sigue es determinar qu pasos son necesarios para lo anterior sea posible.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Determinar Como Las Clases Se Colaboran Unas A Otras. 9
Inicio del Juego.
Tomar una Carta del Mazo
El Dealer pide al jugador el valor de su mano
Dealer barajarMazo Mazo Dealer reiniciarMazo Mazo Dealer darCarta Jugador Dealer pedirCarta Mazo RetornarCarta Dealer pedirValorMano Jugador Jugador pedirValorMano Mano darValorMano Dealer Jugador darValorMano Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
10 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
Crear Un Modelo De Clases Para Describir El Sistema. Ya que estn determinadas todas las operaciones que se llevan a cabo por todas las entidades del sistema se puede pensar es crear un representacin grafica del mismo en l cual se expresen las relaciones entre las entidades del mismo. Antes de eso, es necesario tener claro cules son las relaciones entre las clases de un modelo y como se expresa en notacin UML. UML define muchos tipos de diagramas para representar muchos aspectos en el desarrollo de la solucin. El diagrama a usar en el modelado Orientado a objetos es el diagrama de clases. Un diagrama de clases es el principal diagrama en el diseo orientado a objetos y su importancia yace en el hecho que contiene los elementos principales que tendr el cdigo de la aplicacin que en nuestro caso en particular sern las clases de Java. Un diagrama de clases es aquel que contiene todos los objetos y las relaciones entre ellos
Relaciones entre clases Un conjunto de objetos aislados tiene escasa capacidad para resolver un problema. En una Aplicacin til los objetos colaboran e intercambian informacin, mantienen distintos tipos de relaciones entre ellos. A nivel de diseo, podemos distinguir entre 5 tipos de relaciones bsicas entre clases de objetos: asociacin, agregacin, composicin y herencia 1 Asociacin
Como los objetos por lo general se necesitan los unos a los otros para cumplir con su tarea, deben estar estrechamente relacionados. Una de las ms importantes relaciones es la asociacin. Los objetos que estn relacionados se cooperan envindose mensajes. La asociacin es la relacin ms importante y ms comn. Refleja una relacin entre dos clases independientes que se mantiene durante la vida de los objetos de dichas clases o al menos durante un tiempo prolongado En UML suele indicarse el nombre de la relacin, el sentido de dicha relacin y las cardinalidades en los dos extremos.
El nombre de la relacin es titular el (* 1) indica que varias cuentas se pueden asociar a un cliente.
1 Tema tratado ms adelante. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Crear Un Modelo De Clases Para Describir El Sistema. 11
Relacin de muchos a muchos. Un estudiante puede tener varios tutores y un tutor varios estudiantes.
Asociacin recursiva: una madre puede tener varios hijos que tambin son personas.
Una asociacin se implementa en Java introduciendo referencias a objetos de la clase destino de la relacin como atributos de la clase origen Si la relacin tiene una cardinalidad superior a uno entonces ser necesario utilizar un array o una estructura de datos dinmica del paquete java.util como Vector o LinkedList. Normalmente la conexin entre los objetos se realiza recibiendo la referencia de uno de ellos en el constructor u otra operacin similar.
Agregacin La agregacin es un tipo especial de asociacin que define que una clase (todo) est conformada de otras clases (las partes). Esta relacin es llamada tambin tiene un o hace parte de. La agregacin define una relacin mucho ms fuerte que la asociacin ya que el todo no puede existir sin las partes y viceversa. Este tipo de relacin define lo siguiente: La destruccin del todo implica la destruccin de las partes. Las partes no pueden accederse fuera del todo. Los mensajes a las partes deben llegar a su todo y este se las enva.
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
12 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
El banco est conformado de cuentas. Sin las cuentas el banco no puede existir y las cuentas no pueden existir sin las cuentas.
Composicin Es un tipo de agregacin que aade el matiz de que la clase todo controla la existencia de las clases parte. Es decir, normalmente la clase todo crear al principio las clases parte y al final se encargar de su destruccin. Las composiciones tienen una implementacin similar a las asociaciones, con la diferencia de que el objeto principal realizar en algn momento la construccin de los objetos compuestos.
Ya aclarado este punto se puede crear el diagrama UML del caso de estudio. Las agregaciones y composiciones se especifican con un Rombo al final de las lneas. El rombo est en la clase Todo. En los extremos de las lneas se coloca la multiplicidad de la relacin. Uno: 1 Muchos: *, 0...*
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Crear Un Modelo De Clases Para Describir El Sistema. 13
Herencia Esta relacin indica que una clase puede ser una versin ms especializada de otra, es decir, una clase puede implementar todas las funcionalidades de otra. Si la clase A hereda sus caractersticas de una clase B, entonces se dice que la clase A es hija de la clase B o la clase B es superclase de la A.
En este diagrama vemos la organizacin jerrquica de la herencia. La clase A es madre de B y a su vez esta es madre de C y D. otro aspecto importante es que A al ser la superclase de B, es a su vez la superclase de C y D tambin. Diagrama de clases El diagrama de clases es aquel donde se muestran todas las relaciones entre las clases, los atributos y mtodos de estas. Dealer Jugador BlackJack -tiene un 1 -hace parte de 1 1 * -los jugadores * -administra 1 Mano -J uega con una 1 -hace parte de 1 Mazo -tiene un 1 -hace parte de 1 Carta -esta compuesto de 1 -componen 0..* -esta compuesto de 1 -componen 0..* Apuesta -tiene varias 1 -son recibidas 0..* -realiza 1 *
Fig. 1: Diagrama UML del Black Jack Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
14 Caso de estudio I: JUEGO DE BLACK JACK. | EAM
Para que este modelo este totalmente completo, es necesario identificar los atributos y mtodos de cada una de las clases del mismo. Esto se puede determinar del enunciado del problema y de las responsabilidades de cada entidad.
Carta Atributos o Nombre: cadena o Pinta:cadena o Valor:numrico Metodos o darNombre:cadena o darPinta:cadena o darValor:numerico
Mano atributos o cards:carta mtodos o darValor:numrico o agregarCarta:void o mostrarMano:carta[0..n] o numCartas:numerico +agregarCarta(entrada card : Carta) +darValor() : int +mostrarMano() : Carta +numCartas() : int -cards : Carta Mano
Mazo Atributos o lasCartas:Carta[0..n] o cartasBarajadas:carta[0..n] Metodos o reiniciarMazo:void o barajarMazo:void o numCartas:numrico o darCarta():carta +reiniciarMazo() : void +barajarMazo() : void +numCartas() : int +darCarta() : Carta -lascartas : Carta -cartasBarajadas : Carta Mazo
Jugador Atributos o Mano:hand o Dinero: doubl Metodos o agregarCartaMano(card:carta) o mostrarMano():carta o valorMano():int o pedirCartaDealer() +agregarCartaaMano(entrada card : Carta) : void +mostrarMano() : Carta[0..n] +numCartasMano() : int +valorMano() : int +pedirCartaDealer() : void +apostar(entrada valor : double) : void -Hand : Mano -dinero : double Jugador
Lo mismo se hace con todas las clases identificadas. Al final, el diagrama UML se completa con este anlisis. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Crear Un Modelo De Clases Para Describir El Sistema. 15
+iniciarJ uego() : void +repartirRonda() : void +indicarGanador() : J ugador +recibirApuesta(entrada bet : Apuesta) : void -jugadores : J ugador -deck : Mazo -apuestas : Apuesta Dealer +agregarCartaaMano(entrada card : Carta) : void +mostrarMano() : Carta[0..n] +numCartasMano() : int +valorMano() : int +pedirCartaDealer() : void +apostar(entrada valor : double) : void -Hand : Mano -dinero : double Jugador -players : J ugador[0..n] -dealer : Dealer BlackJack -tiene un 1 -hace parte de 1 1 * -los jugadores * -administra 1 +agregarCarta(entrada card : Carta) +darValor() : int +mostrarMano() : Carta +numCartas() : int -cards : Carta Mano -J uega con una 1 -hace parte de 1 +reiniciarMazo() : void +barajarMazo() : void +numCartas() : int +darCarta() : Carta -lascartas : Carta -cartasBarajadas : Carta Mazo -tiene un 1 -hace parte de 1 +darValor() : double +darNombre() : string +darPinta() : string -nombre : string -pinta : string -valor : int Carta -esta compuesto de 1 -componen 0..* -esta compuesto de 1 -componen 0..* -valor : double -player : J ugador Apuesta -tiene varias 1 -son recibidas 0..* -realiza 1 *
Fig. 2: Diagrama de Clases Completo
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
16 Caso de estudio II: JUEGO DE PARQUES. | EAM
Caso de estudio II: JUEGO DE PARQUES. Es un juego de mesa que consiste en llevar todas las fichas del mismo color, hasta la meta final, antes que los dems contrincantes lo hagan. Si otro jugador llega al espacio que no es denominado "seguro", en donde se encuentra una ficha de otro color, este tiene la oportunidad de enviarlo a la crcel, haciendo devolver la ficha al inicio del juego. En caso de no enviar las fichas del contrincante a la crcel el jugador que avanza recibe un castigo y debe regresar su ficha al punto de partida. A esta situacin se le llama soplar.
El juego consta de un tablero, que puede tener espacio para cuatro o seis jugadores, divididos por colores, cada jugador tiene cuatro fichas y los espacios a mover estn definidos por una pareja de dados. Todos los jugadores comienzan con sus fichas en las respectivas crceles. El primer turno se escoge por medio de los dados: el jugador que saque el mayor nmero es el que comienza el juego. Tiene tres oportunidades para sacar sus fichas de la crcel y posicionarlas en la casilla de salida. Se sacan fichas con las presadas, es decir, cuando ambos dados tienen el mismo valor. Por ejemplo, 1-1 y 3-3 son presadas. La presadas 1-1 o 6-6 sacan todas las fichas de la crcel; las restantes, como 3-3, sacan slo dos. Existe una variacin a esta regla, que debe ser acordada al comienzo del juego: Si el jugador obtiene 1-1 o 6-6 en los dados, podr sacar de la crcel, si quiere, dos fichas y en este caso tendr de opcin de mover una de las fichas el valor que tenga un dado, es decir, mover 1 o mover 6.
Si puede sacar alguna ficha tiene que lanzar de nuevo y pasar el turno. El turno se pasa al jugador en la derecha. Despus de que haya salido de la crcel, el jugador debe decidir cmo distribuir su puntaje: puede "correr" ("mover") todo con una sola ficha o mover lo de cada dado con una ficha. La mecnica del juego contina de esta manera hasta que algn jugador lleve todas sus fichas hasta la casilla final. En este momento, habr ganado el juego. Las fichas son similares a los peones del ajedrez y cada jugador posee fichas de un color especfico, lo mismo que su crcel y sus casillas de llegada. Como se juega con dados normales, el menor valor a sacar es 2 y el mximo 12. Cuando se saca el mismo valor en ambos dados, tiene un significado especial.
Para capturar fichas (comer fichas, mandar a la crcel), hay que poner la ficha de uno en la misma casilla de la ficha del oponente. La ficha se captura y se devuelve a la crcel. Hay casillas de "seguro" donde no se puede mandar a la crcel. Despus de comer una ficha, se debe avanzar lo que le queda en el otro dado con otra de las fichas que se encuentre en la tabla de juego, excepto si es la nica ficha con la que se cuenta; slo en ese caso se puede avanzar con el mismo dado. Cada vez que un jugador se coma una ficha de un oponente tiene derecho a un nuevo lanzamiento de los dados slo cuando saca pares. Si el jugador tiene una ficha en la crcel y saca pares tiene que salir de la crcel, obligatoriamente. No ser soplado si tiene una ficha para comer con el valor de los dos dados o no sale de la crcel y come la ficha. Pero ser soplado si no come o sale de la crcel. Tambin se pueden comer fichas en la casilla de salida si hay una ficha ajena en la salida y el otro jugador sale de la crcel.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Identificar Clases 17
Identificar Clases Observando los sustantivos del enunciado y realizando el proceso de filtrado se encuentran las siguientes entidades: Ficha: son con las que se juega y las que recorren el tablero. Tablero: es el rea de juego y sobre el cual se hacen muchas operaciones. Dado: el que determina los movimientos de los jugadores. Las reglas del juego los involucran mucho. Casilla: donde se posicionan las fichas del tablero. Hay varios tipos de casillas y en ellas se llevan a cabo muchas tareas relevantes. Crcel: rea especial del tablero en la cual se llevan muchas operaciones importantes. Jugador: es el actor principal del juego. Identificar Responsabilidades. Revisar verbos y asociarlos a las entidades del problema. Ficha Mover la ficha Indicar su posicin en el tablero Ir a la crcel Salir de la crcel Indicar en qu casilla esta Coronar ficha Dado Lanzar dado Dar valor sacado Crcel Agregar ficha Sacar ficha Jugador Lanzar dados Mover sus fichas Comer otra ficha Soplar la ficha del contrincante Coronar ficha Saber si gano
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
18 Caso de estudio II: JUEGO DE PARQUES. | EAM
Casilla Agregar fichas a la casilla. Dar fichas puestas en la casilla Quitar fichas de la casilla. Buscar ficha de un jugador
Tablero Sacar ficha de la crcel Enviar ficha a la crcel Mover ficha Indicar ganador Indicar par en los dados Determinar quien saca Avanzar o pasar el turno Lanzar dados. Determinar salida de la crcel. Coronar ficha. Esta clase en particular ser la responsable de hacer cumplir todas las reglas del juego.
Determinar Como Las Clases Se Colaboran Unas A Otras. En este punto como se ha explicado en varias ocasiones se determinan las interacciones entre las clases del modelo y los mensajes que se deben enviar las unas a las otras. Primero es til determinar los escenarios o situaciones que se presentaran en el caso de estudio. El Jugador Usa Su Turno
Estos dibujos muestran las relaciones y mensajes que se envan entre cada una de las entidades. Otra tcnica que se puede usar son las tarjetas CRC (Class-Responsabilities- Collaboration) en las cuales se puede expresar de manera ms rpida estas relaciones. Existe tambin otro mtodo los cuales son los diagramas de secuencia que principalmente muestran los mensajes que se envan las clases entre s.
Tablero Crcel aadirFicha Tablero Casilla numeroFichasCasilla 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Determinar Como Las Clases Se Colaboran Unas A Otras. 21
Diagrama de Secuencia. Usar turno J UGADOR FICHA DADO TABLERO lanzarDado lanzarDado valorDado valorDados darCasilla casilla moverFicha CASILLA quitarFicha ponerFicha
Las entidades que participan en la situacin de estudio se ponen en la cabeza del diagrama seguido de las cuales salen las lneas de vida (en naranja). De estas lneas se desprenden los mensajes que envan la entidad a otras entidades. Las lneas punteadas son las respuestas a esos mensajes. Los cuadros azules son los tiempos de activacin de las entidades. En este tiempo la entidad est realizando alguna tarea y cuando termine el trabajo de la entidad en esta operacin ha terminado. Salir de la crcel DADO J UGADOR TABLERO CARCEL lanzarDados lanzarDado valorDado verificarPar sacarFichas[3 pares]
Lnea de vida activacin mensaje respuesta Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
22 Caso de estudio II: JUEGO DE PARQUES. | EAM
Crear Un Modelo De Clases Para Describir El Sistema. Aqu se crea el modelo UML del sistema analizado en las etapas anteriores. Ficha Casilla Tablero Carcel Jugador Dado parques -los dados 1 * -esta compuesto 1 * -contiene 1 * -fichas 1 * 1 1 -jugadores 1 * * -fichas 1 -fichas * * El diagrama expresa que el tablero est compuesto de las casillas, crcel y dados. El parqus lo forman los jugadores y el tablero. Las fichas tienen una asociacin con las fichas y la crcel. Observando las responsabilidades y las colaboraciones se pueden inferir los mtodos y atributos que tendr cada entidad.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
23
Caso de estudio III: Tienda Autoservicio de Msica. En este caso de estudio se pretende modelar una tienda autoservicio de Msica. Una tienda de esta naturaleza e aquella en la que todo el proceso de pago y facturacin est a cargo del mismo cliente. En esta clase de tiendas solo pueden comprar clientes que ya se hayan registrado previamente en el almacn. Los clientes se identifican con su nmero de cedula y La nica forma de pago con la que cuentan es con tarjeta crdito o debito. Estas tarjetas deben ser registradas en el almacn previamente para su uso. Solo se pueden registrar hasta 3 tarjetas por cliente y el registro consta del nmero de la tarjeta, su tipo y su fecha de expiracin. Un cliente no puede comprar con tarjetas que hayan caducado. Cuando llega un cliente a realizar una compra, este puede llevar DVDs, libros o CDs de msica. Cualquier producto est identificado por un cdigo nico. En el momento de realizar una compra, el cliente puede agregar o quitar elementos de la misma a voluntad, lo que debe reflejarse en el costo total de la venta. Estos elementos definen el producto y la cantidad del mismo que se est comprando. Los productos en general tienen un precio. En caso de los libros, tienen un autor, un ISBN y un ao de publicacin, los CDs de msica tienen un artista y una productora y los DVD la productora. Cuando se confirma la venta por parte del cliente, debe quedar registrada en esta la tarjeta que uso. En todas las compras debe estar presente el registro del cliente y la fecha de dicha compra. Todas las compras tienen un nmero de identificacin nico. Una compra tiene derecho a muchos descuentos dependiendo de la naturaleza de la misma. Cuando se usa tarjeta debito, se aplica un descuento del 4% sobre el total de dicha compra. Para este caso de estudio se presentara el patrn de diseo Modelo-vista-controlador adems de todo el proceso de anlisis de la solucin ya abarcado anteriormente.
Identificar Entidades Leyendo el ejercicio se encuentran los siguientes sustantivos. Tienda, pago, facturacin, cliente, cedula, tarjeta de crdito, tarjeta debito, almacn, registro, nmero de tarjeta, tipo, fecha expiracin, compra, DVD, CD, libro, compra, elemento, producto, autor, ISBN, ao de publicacin, artista, productora, venta, numero de id, descuento. Con una lectura cuidadosa del caso de estudio se puede ver que los siguientes sustantivos son atributos de otro sustantivo: cedula, nmero de tarjeta, tipo, fecha de expiracin, autor, ISBN, ao de publicacin, numero de id. Lo que deja los siguientes: Tienda, pago, facturacin, cliente, tarjeta de crdito, tarjeta debito, almacn, registro, compra, DVD, CD, libro, compra, elemento, producto, venta, descuento.
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
24 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
De estos se puede ver que: venta y compra es lo mismo visto desde el punto de vista del cliente y la tienda, solo una debe ser entidad. Descuento es algo que se puede calcular. Facturacin es la representacin de una compra o una venta. Registro es lo que debe tener la compra con respecto al cliente. Despus de esto las entidades del problema se reducen a:
Tienda Tarjeta Compra Elemento Producto
DVD CD Libro cliente
Responsabilidades De Las Entidades. Para cada entidad hay que identificar las responsabilidades. Producto, DVD, Libro, CD Administrar sus atributos, es decir, dar y establecer el valor de los mismos. Para quienes estn familiarizados con el lenguaje de programacin Java, esto se hace a travs de los setter y getters. Tarjeta Administrar atributos Indicar fecha de expiracion Cliente Pagar cuenta Aadir elemento a la compra. Quitar elemento de la compra Aadir tarjeta de crdito Indicar expiracin tarjeta de crdito Compra Calcular total comprado Calcular descuento Agregar elemento Quitar elemento Asignar tarjeta Asignar cliente
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Colaboraciones Entre Las Clases Luego de establecer las entidades y sus relaciones es momento de determinar como estas se comunican las unas con las otras para satisfacer las necesidades del sistema que modelan. Como se explico con anterioridad estas colaboraciones se pueden apreciar mediante el diagrama de secuencia. Primero se deben identificar los escenarios o casos de uso en la aplicacin. La aplicacin debe permitir: 1. Crear una compra al cliente 2. Pagar una compra 3. Agregar y quitar elementos de una compra
Pagar una compra Objeto2 Objeto1 compra Paquete superior::cliente calcularTotal elemento tarjeta calcularTotal totalElemento tipo getTipo calcularDescuento totalCompra
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
26 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
Crear Un Modelo De Clases Para Describir El Sistema. El modelo representa el corazn de la aplicacin, en el est la lgica de la misma, las reglas y restricciones en el manejo de la informacin. Como el modelo est enfocado solo en la informacin de la aplicacin, solo se convierten en mtodos las responsabilidades que administren de alguna manera algn atributo.
Para definir el modelo es necesario establecer los atributos, mtodos y relaciones entre las entidades. El elemento define el producto y la cantidad. Atributos: o Prod:producto o Cantidad:int Mtodo: o totalElem:double
Una compra
Atributos o Cdigo:String o Cadr:tarjeta o Client:cliente o Elemens: elemento[0*]
Metodos o agregarElemento(elemento item) o calcularTotal():doubl o calcularDescuento():doubl o quitarElemento(String codProd) o getters y setters en general
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Crear Un Modelo De Clases Para Describir El Sistema. 27
Atributo: o Atributos o fechaExpiracion:Date o tipo:int o numero:String o o Metodos o indicarExpiracion(fechaActual:date):boolean o getters y setters en general.
A continuacin se muestra el diagrama de clases de las entidades. fjese que los mtodos de las entidades solo buscan la administracin de los atributos de las mismas. Tambin estn definidas las relaciones entre las clases. Tarjeta-cliente: composicin. La vida de las tarjetas es responsabilidad del cliente. Tarjeta-compra: Agregacin: la Compra necesita una tarjeta pero no es responsable de la vida de la misma Elemento-Producto: Agregacin. Producto-DVD-CD-Libro: Herencia Elemento-Compra: Composicin: los elementos solo tienen razn de existir dentro de una compra.
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
28 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
Nota: Este diagrama de clases esta hecho en netbeans. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
PATRON DE DISEO ARQUITECTONICO MODELO-VISTA-CONTROLADOR 29
PATRON DE DISEO ARQUITECTONICO MODELO-VISTA- CONTROLADOR
Un patrn es una disciplina de diseo que rene las experiencias de expertos en algn tema. El patrn captura las experiencias bien probadas de estos expertos para definir buenas prcticas en el proceso de anlisis e implementacin de una solucin basada en software. Cuando los expertos trabajan en una nueva solucin es muy comn que la manera de abordarla se haya hecho en ocasiones anteriores, es decir, la estructura general de la solucin siempre es la misma, este comportamiento y manera de resolver los problemas se puede estructurar en un patrn de diseo. Un representante muy famoso de los patrones de diseo de software es el denominado Modelo-Vista-Controlador. Para el diseo de aplicaciones con sofisticados interfaces se utiliza el patrn de diseo Modelo- Vista-Controlador. La lgica de un interfaz de usuario cambia con ms frecuencia que los almacenes de datos y la lgica de negocio. Si realizamos un diseo ofuscado, es decir, un pastiche que mezcle los componentes de interfaz y de negocio, entonces la consecuencia ser que, cuando necesitemos cambiar el interfaz, tendremos que modificar trabajosamente los componentes de negocio. Mayor trabajo y ms riesgo de error. Cuando se desarrolla usando GUI hay que tener en cuenta lo siguiente: Cambios en la interfaz deben ser fciles e incluso pueden pasar en tiempo de ejecucin Los cambios en la interfaz no deben afectar el cdigo que sea el ncleo de la aplicacin. Para resolver el problema se suele dividir la solucin del problema en tres partes fundamentales: Modelo: componente que encapsula el comportamiento y los datos de la informacin. El modelo debe ser independiente de la manera en cmo se represente. Vista: componentes que muestran la informacin al usuario. Obtiene los datos del modelo y los muestra al usuario. Pueden haber varias vistas del modelo. Controlador: el controlador es el responsable de traducir los deseos del usuario que se dan a travs de eventos en cambios en el modelo. El usuario interacta con el modelo a travs del controlador. La separacin del modelo de la vista permite tener varias vista del mismo modelo. Si un controlador cambia el modelo en alguna de las vista, este modelo debe notificar a sus vistas el cambio. Las vistas atienden esta notificacin que debe traer los datos modificados para ser mostrados. Esta divisin tambin permite cambiar alguna de las partes sin causar mayores efectos sobre las otras, adems que permite el desarrollo de la aplicacin en equipos de trabajo dedicados a cada una de las partes mencionadas.
Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
30 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
Un esquema grafico del patrn de diseo es el siguiente:
Las responsabilidades de cada una de las partes son: Modelo: define los datos y las operaciones entre ellos. Idealmente el modelo debe ser independiente de la manera como se almacenen los datos. El modelo debe notificar a las vistas sus cambios. Controlador: si queremos que el modelo sea independiente de la manera como se persistan los datos, entonces el controlador debe gestionar los accesos a la base de datos o archivos que contengan la informacin que debe administra el modelo. El controlador debe registrar ante el modelo las vistas que este debe actualizar. Recibe los eventos y los traduce en cambios en el modelo. Cualquier cambio sobre el modelo se debe hacer a travs del controlador. Interfaz: la interfaz debe tener una referencia de su controlador para poder cambiar el modelo. Recibir notificaciones del modelo para actualizar la vista del mismo.
Modelo vista controlador en el caso de estudio III
En el caso de estudio ya se ha defino a cabalidad el modelo, falta definir la vista y el controlador. Idealmente cada entidad deber tener su controlador, pero para este caso en particular solo se creara un controlador para las operaciones ms recurrentes como son las compras, los clientes, los productos y la tienda en s, las tarjetas son administradas por los clientes, entonces es controlador de cliente podr implementar la persistencia de las tarjetas.
Modifica Vista Controlador Modelo
Notifica cambios Eventos 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
PATRON DE DISEO ARQUITECTONICO MODELO-VISTA-CONTROLADOR 31
Controladores
Tienda Este controlador gestiona la Connection a la base de datos y crea los controladores para cliente y compra.
Ntese que este controlador tiene un objeto de tipo Connection para establecer conexin con la base de datos que posee los datos.
controladorCliente
Esta clase administra la persistencia de la tarjetas para lo cual posee los mtodos de: cargarCliente: recibe la Cedula del cliente a cargar de la BD. En el proceso de carga se llama al mtodo prvate cargarTarjeta que lee en la BD las tarjetas del cliente y las almacena en un Hashtable. quitarTarjeta: mtodo para borrar una de las tarjetas del cliente, recibe el numero de la tarjeta a borrar. Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
32 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
PATRON DE DISEO ARQUITECTONICO OBSERVADOR- OBSERVABLE
En el patrn MVC se indico que el modelo debe informar a la vista o vistas de sus propios cambios. si varias vistas estn mostrando el mismo modelo, ambas deben mostrar la informacin actual del modelo, es decir, debe haber una sincronizacin entre las dos interfaces; si alguna de las interfaces modifica el modelo a travs del controlador, en la otra interfaz ese cambio debe reflejarse inmediatamente para que el usuario que ve esa interfaz vea la informacin actual del modelo. La sincronizacin de las interfaces se convierte en un problema cuando ellas no ese conocen mutuamente y no hay referencias entre ellas. Para resolver ese inconveniente se implementa en la aplicacin el patrn observador. El patrn observador define que es responsabilidad del modelo informar a quien les puedan interesar los cambios que se producen en l, y es responsabilidad de las interfaces estar monitoreando los mensajes que enva el modelo a cerca de sus cambios para mostrarlos en la interfaz. Usando este enfoque, el modelo se dice que es observable y la vista se dice que es observador. El lenguaje de programacin java implementa este patrn de diseo a travs de la clase Observable y la interfaz Observer. Usando este patrn, las clases del modelo deben heredar de Observable y la vista implementar la interfaz Observable.
Procedimiento para Implementar el patrn Observador en una aplicacin JAVA
Para ilustrar la implementacin del patrn observador consideremos el siguiente ejemplo:
Se desea que dos interfaces diferentes muestren el valor de un numero y que cualquier cambio de ese nmero en alguna de las interfaces se vea reflejado en la otra interfaz.
Cualquier cambio en el deslizador de la ventana1 debe reflejarse en la ventana2 y cualquier cambio en el numero en el campo de texto debe reflejarse en la ventana1 ya que ambas estn mostrando el mismo numero. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
PATRON DE DISEO ARQUITECTONICO OBSERVADOR-OBSERVABLE 33
Solucin:
Para solucionar el problema hay que tener en cuentea que las dos vistas deben mostrar el mismo modelo y si se usa MVC deben tener asociados el mismo controlador que modifique dicho modelo. El modelo se define como una clase que contiene un nmero y el setter y getter para manipularlo; La clase se muestra a continuacin:
Y el controlador de esta clase:
public class numero { private int valor;
public numero(int valor) { this.valor = valor; } //obtiene el valor del numero public int getValor() { return valor; } //establece el valor del numero public void setValor(int valor) { this.valor = valor; }
} public class controlNumero { private numero miNumero;
public controlNumero() { miNumero=new numero(0); }
public void cambiarNumero(int valor) { miNumero.setValor(valor); }
} Modelo que manejara el controlador Se instancia el modelo. Mtodo del controlador para cambiar el modelo. Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
34 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
Para que las dos interfaces controlen el mismo modelo deben tener el mismo controlador. Esto se consigue instancindolo en el Main del proyecto y envindolo como parmetro al constructor de las dos ventanas. Constructor Ventana1 y 2. private controlNumero control;
public ventana1(controlNumero control) { initComponents(); this.control=control; } private controlNumero control;
public ventana2(controlNumero control) { initComponents(); this.control=control; }
Fjese que se reciben como parmetro en el constructor. El main del proyecto entonces debe ser asi:
Hasta este punto la aplicacin ya esta operativa, pero cualquier cambio que se haga en la primera no afecta a las segunda y viceversa aunque ambas representen el mismo nmero. Para que esto ocurra se implementa en la aplicacin el patrn observador. Los pasos para aplicar el patrn son: 1. El modelo debe heredar Observable public class numero extends Observable Recuerde que la clase del modelo es la clase numero. 2. cuando el modelo cambie sus atributos debe notificarlos. Para que el modelo notifique los cambios se usa el mtodo setChange() y para enviar los cambios se usa notifyObservers(Object); que recibe el objeto que se va a notificar. Por lo general es una referencia a la clase con this o el valor como tal que cambio. El modelo cambia en el mtodo setValor, ah se escribe lo anterior.
public static void main(String[] args) { controlNumero control=new controlNumero(); //instancia el controlador ventana1 v1=new ventana1(control); //enva el controlador a ventana1 ventana2 v2=new ventana2(control); //enva el controlador a ventana2 } 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
PATRON DE DISEO ARQUITECTONICO OBSERVADOR-OBSERVABLE 35
3. la vista debe implementar la interfaz Observer y el mtodo update. public class ventana1 extends javax.swing.JFrame implements Observer update en ventana1.
update en ventana2.
El metodo update recibe dos parametros: Observable o: informa que objeto del modelo notifico el cambio. Object arg: recibe el valor que se enva desde el modelo a travs de notifyObserver. En nuestro caso el valor. Ver punto 2.
Como se recibe arg como object es necesario convertirlo a travs de un cast a entero porque lo que se envi fue un entero. La diferencia entre el update de Ventana1 y de Ventana2 es donde se muestra ese nmero. En una interfaz se hace en un JTextField y en otra en una barra de progreso.
public void setValor(int valor) { this.valor = valor; //cambia el valor setChanged(); //se notifica el cambio a quien le pueda interesar notifyObservers(valor); //se envia el cambio para que el que le interese lo //tome }
public void update(Observable o, Object arg) { Integer numero=(Integer)arg; TFVAlor.setText(numero+""); } public void update(Observable o, Object arg) { Integer numero=(Integer)arg; jProgressBar1.setValue(numero); jSlider1.setValue(numero); } Camilo Andrs Ferrer Bustos CAPITULO I: ANALISIS Y DISEO ORIENTADO A OBJETOS.
36 Caso de estudio III: Tienda Autoservicio de Msica. | EAM
4. Registrar los observadores. Los observadores son las ventanas. Hay que registrarlos en el modelo a travs del mtodo addObserver de la clase Observable que en este caso es la clase numero que heredo caractersticas dela clase en mencin. Este mtodo recibe como parmetro un objeto que haya implementado la interfaz Observer que en nuestro caso son las ventana1 y ventana2. Como se est usando MVC y la vista no conoce el modelo, esta operacin se hace a travs del controlador creando un mtodo en la clase controlNumero que agregue el observador a el objeto miNumero del controlador.
Cada vista debe llamar a este mtodo del controlador para registrarse ante el modelo. private controlNumero control;
public ventana2(controlNumero control) { initComponents(); this.control=control; control. agregarObservador (this) }
Se usa this por que son estas clases(las ventanas) las que son las observadores del modelo y como el controlador es el mismo en las dos vistas, estas se estarn registrando como observadores del mismo modelo. Los eventos de las ventanas1 y 2 se muestran a continuacin: Evento clic botn cambiar ventana 1.
Evento ItemStateChange del deslizador en la ventana 2.
public void agregarObservador(Observer obs) { miNumero.addObserver(obs); } int valor=Integer.parseInt(TFVAlor.getText()); control.cambiarNumero(valor); int valor=jSlider1.getValue(); control.cambiarNumero(valor); 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
PATRON DE DISEO ARQUITECTONICO OBSERVADOR-OBSERVABLE 37
Ya en este punto cualquier cambio realizado en la ventana1 o 2 se refleja en la otra automticamente.
Si se siguen los pasos anteriores en cualquier aplicacin, la implementacin de este patrn de diseo ser un xito.
Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
38 INTRODUCCION | EAM
CAPITULO II: HILOS Y CONCURRENCIA INTRODUCCION Un punto de vista muy simple de un sistema de computo es aquel que posee una CPU para realizar los clculos, una memoria que contiene el programa que la CPU ejecuta y una memoria que almacena los datos para la ejecucin del programa; desde este punto de vista solo se puede ejecutar una sola tarea. Un punto de vista ms actualizado nos provee la posibilidad de ejecutar ms de una tarea al mismo tiempo. Como programadores no hay que tener en cuenta el hecho que la CPU pueda ejecutar ms de una tarea, solo hay que pensar en las implicaciones que esto tiene, porque ejecutar ms de una tarea al tiempo significa tener ms de una CPU, lo cual en definitiva se convierte se una ventaja muy significativa. El hecho de poder ejecutar ms de una tarea a la vez se le denomina concurrencia. El lenguaje de programacin JAVA nos provee la concurrencia a travs de lo que se conoce como hilos. Un hilo se considera como un contexto de ejecucin que posee su propia CPU (virtual), sus datos y cdigo ejecutable. Los hilos estn representados principalmente por la clase Thread. Las caractersticas de un hilo son las siguientes: Un hilo se considera como una unidad independiente que encapsula datos y programa ejecutados por una CPU virtual Un hilo es creado y controlado por la clase Thread.
Un hilo entonces est compuesto por tres partes principales:
CPU virtual Datos Programa
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 39
IMPLEMENTANDO HILOS EN JAVA El lenguaje de programacin JAVA est diseado para ejecutar a hilos desde sus mismas bases. Es as como muchos procesos dentro del lenguaje se haces a travs de hilos. Un ejemplo claro de esto es en la ejecucin de la interfaz grafica que es un hilo que espera recibir eventos para procesar. Como se dijo anteriormente, los hilos en java se implementan a travs de la clase Thread y tambin por medio de la interfaz Runnable.
Clase Thread. Por medio de la clase Thread se puede crear un contexto de ejecucin independiente con sus datos y su cdigo ejecutable. La estructura bsica un hilo pro medio de Thread es la siguiente:
La manera ms fcil de implementar un hilo es crear una clase que herede todas las funciones definidas en Thread. Dentro de esta clase se definen los datos del mismo como atributos de esta clase y el cdigo ejecutable se escribe en el mtodo run. El mtodo run est definido en la clase Thread y permite ser redefinido en las subclases de esta. A los hilos tambin se les puede dar un nombre a travs del constructor de Thread: public Thread(String nombreHilo) public class hilo extends Thread { //los datos del hilo se implementan como //atributos de esta clase. /** * constructor. instancia la clase madre tambin * a travs del super. */ public hilo() { super(); } /** * En este mtodo se escribe el cdigo que se quiere * ejecutar en el hilo. */ public void run() { //. } } Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
40 IMPLEMENTANDO HILOS EN JAVA | EAM
El tiempo en el que se ejecute le mtodo run determina la vida del hilo, si este mtodo llega a su fin, entonces el hilo habr muerto y no se podr ejecutar de nuevo. Para ejecutar el hilo se debe llamar al mtodo start() de la clase Thread. A continuacin un ejemplo.
En este hilo se incrementa un contador indefinidamente y se muestra en la consola. Para correr el hilo se crea una instancia de la clase miHilo y se llama al mtodo start.
Lo interesante de esto es que se estn ejecutando dos procesos independientes cada uno un hilo aparte. La consola lucira algo asi: public class miHilo extends Thread {
private int valor;
public miHilo (String nombre) { super(nombre); valor=0; }
public void run() { while(true) { valor++; System.out.println(getName()+ "dice: valor->" +valor); } } } Llama al constructor de Thread que tiene un nombre Ciclo infinito para que el mtodo nunca termine y el hilo nunca muera. Se muestra en consola el nombre del hilo con getName() y el valor del contador. public static void main(String[] args) {
miHilo h=new miHilo ("camilo"); h.start();
miHilo p=new miHilo ("juan"); p.start();
} Se crean dos instancia de miHilo con nombre Camilo y Juan y se arrancan los hilos con start() 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 41
Fjese como en la consola van apareciendo el nombre del hilo y el valor presente en. En la consola aparecen los dos hilos, lo que es prueba de la ejecucin en simultnea de los dos hilos. El problema que se ve ac es la velocidad en la ejecucin ya que a los pocos segundos en la ejecucin de los hilos el valor del contador es muy alto. Cuando se quiere retrasar la ejecucin del hilo se utiliza el mtodo sleep(long milisegundos) de la clase Thread. Es mtodo introduce un tiempo de espera en el momento de su ejecucin, literalmente, duerme el hilo el numero de milisegundos que recibe como parmetro. El uso de este mtodo genera una excepcin del tipo InterruptedException que se explicara ms adelante. Un ejemplo de del uso de sleep se muestra a continuacin.
La consola en este caso la consola luce as:
public void run() { while(true) { try { valor++; sleep(100); System.out.println(getName() + "dice: valor->" + valor); } catch (InterruptedException ex) { ex.printStackTrace(); } } } Cuando la ejecucin del hilo llega a este punto, se crea un retardo de 100 milisegundos. Este mtodo se pone aqu en el run ya que aqu es donde se ejecuta el hilo. Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
42 IMPLEMENTANDO HILOS EN JAVA | EAM
Ejemplo: Animacin Pelotas. Se desea crear una aplicacin que permita ver en movimiento dos pelotas como se ve en esta figura: Se desea iniciar, finalizar, parar y reanudar la simulacin.
c
Primero se debe crear la pelota, esto se puede hacer en una clase JPanel que dibuje una pelota en su interior.
Hay que recordar que el JPanel como cualquier otro componente se ubica en el contenedor a travs del mtodo setLocation(x,y). en esta clase el radio define el tamao del JPanel. El mtodo especial en esta clase en el paint. paint es un mtodo de la clase Component que se puede sobrecargar para que en el componente dibuje lo que el desee. En esta clase se define el color de la pelota y su radio.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 43
Se desean mover N pelotas y eso se puede hacer mediante un hilo. Un hilo para cada pelota. La clase hiloPelota controlara el movimiento de la pelota en el contenedor que es un JPanel.
La idea es que las pelotas reboten en los bordes del contenedor. Eso obliga a que la clase hiloPelota conozca el contenedor y la pelota que controlara. Un diagrama de clases de la clase hiloPelota se muestra a continuacin.
en la clase hiloControlador que hereda sus caractersticas de la clase Thread se encuentran las referencias de la pelota a controlar y el contenedor donde se encuentra esta, variables booleanas para controlar la ejecucin del mtodo y sy y sx para controlar la direccin del movimiento en x y y. Contiene los mtodos para cambiar el valor de las variables booleanas y el mtodo redefinido run() de la clase Thread. El constructor de la clase recibe la pelota y el panel donde se encuentra esta. public void paint(Graphics g) { if (g!=null) { g.setColor(color); g.fillOval(0, 0, radio*2, radio*2); } } Contexto de dibujo. Cualquier dibujo que se quiera hacer se hace sobre este objeto Se dibuja un ovalo lleno con el color que se defini con setColor. el dibujo empieza en el origen (0,0) y el ancho y el alto son el dimetro del circulo. Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
44 IMPLEMENTANDO HILOS EN JAVA | EAM
La lgica del movimiento es la siguiente: Se sabe que las coordenadas en el panel aumentan de izquierda a derecha en X y de arriba abajo en Y, es as que el origen del componente se encuentra en la esquina superior izquierda y el fin en la esquina inferior derecha.
el siguiente dibujo muestra el movimiento de una pelota en el contenedor. Se muestra como se comporta X y Y en cada trayectoria.
Si se analiza bien las descripciones, los cambios de direccin de X y Y se dan cuando la posicin de la bola alcanza alguno de los bordes. De 1 a 2 toco el borde derecho y la direccin de X cambio y as mismo con Y. este punto es clave para disear el algoritmo de movimiento. El algoritmo de movimiento se escribe en el mtodo run() donde se implementa el cdigo que ejecuta el hilo.
2. Disminuye X y disminuye Y. fjese que Y va de abajo hacia arriba y X de izquierda a derecha 1. Aumenta X y disminuye Y. fjese que Y va de abajo hacia arriba y X de derecha a izquierda 3. Disminuye X y aumenta Y. Y va de arriba hacia abajo y X de izquierda a derecha 4. Aumenta X y disminuye Y. fjese que Y va de abajo hacia arriba y X de derecha a izquierda 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 45
Es de resaltar que cuando se alcanza alguno de los bordes sea en X o en Y, el valor de sx y de sy cambia de signo para que si estaba sumando, empiece a restar; y si estaba restando empiece a sumar las posiciones actuales. El constructor del hilo recibe como parmetro la pelota a mover y el contenedor donde se encuentra ya que estos son componentes de la interfaz de usuario.
public void run() { while(parar!=true) { if (pause==false) { try { if (ball.getX()>contenedor.getWidth() || ball.getX()<0) sx=-sx;
if (ball.getY()>contenedor.getHeight() || ball.getY()<0) sy=-sy;
ball.setLocation(ball.getX() + sx,ball.getY() + sy); sleep(1); } catch (Exception ex) { Logger.getLogger(hiloPelota.class.getName()).log(Level.SEVERE, null, ex); } } } } Cliclo que se acaba cuando parar =true, en cuyo momento se acaba el hilo. Si pause es true no se hace nada. El hilo no muere. Si la posicin de la bola es mayor que el ancho o alto del contenedor o es cero, indica que se toco un borde horizontal o vertical. Se ubica la bola en la posicin actual mas un desplazamiento dado por sx y sy. Si estas variables son negativas no se produce un incremento si no un decremento. Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
46 IMPLEMENTANDO HILOS EN JAVA | EAM
Ya definido el hilo que mover la pelota, lo nico que falta es usar en la interfaz el hilo y crear las pelotas para que se muevan. Esto se puede hacer en el constructor de la misma. Eso se muestra a continuacin.
Y por ltimo, en el evento del botn iniciar se inician los hilos.
public class ventana extends javax.swing.JFrame {
hiloPelota hBall; hiloPelota hBall2;
public ventana() { initComponents(); setVisible(true); pelota p=new pelota(50, 70, 20, Color.BLUE); pelota p2=new pelota(100, 20, 20, Color.RED); jPanel1.add(p);hBall2 =new hiloPelota(p,jPanel1); jPanel1.add(p2);hBall=new hiloPelota(p2,jPanel1); } . . . } Definicin de los hilos que movern las pelotas Instancia de las pelotas a mover. Se agregan las pelotas al contenedor y se instancian los hilos. El hilo recibe la pelota y el contenedor. public hiloPelota(pelota ball,JPanel contenedor) { this.ball=ball;//inicializa la pelota pause=false; //el hilo inicia corriendo parar=false; //el hilo inicia corriendo this.contenedor=contenedor; //inicializa el contendor sx=1; sy=1; } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { hBall.start(); //inicia el hilo de la primera pelota
hBall2.start(); //inicia el hilo de la segunda pelota. } 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 47
Ejemplo: Reloj con MVC y Patrn Observador. Se desea crear un reloj digital utilizando MVC y patrn observador. Para solucionar este problema se crea el modelo del reloj que es el siguiente.
Esta clase contiene los minutos, horas y segundos, el constructor sin parmetros inicializa los atributos de la clase con la hora actual. avanzarSegundo() implementa la lgica del valor de los atributos del reloj (hora, minuto y segundo).
Como se sabe los segundos, minutos y horas del reloj tienen un comportamiento especial y muy ligado el uno con el otro. Ya que se va a usar el patrn observador, esta clase debe heredar Observable para que pueda ser observada por una o varias vistas. El controlador es la clase que manipula el modelo, la manipulacin del reloj ser aumentar los segundos del reloj que controle, ese incremento en los segundos es una operacin peridica y continua, lo que indica que se puede implementar en un hilo. Los hilos muchas veces caben en la clasificacin de controladores porque tienen la posibilidad de cambiar el modelo de la aplicacin. El controlador es el siguiente:
El controlador hereda Thread por que va a ser un hilo y Como tal implementa el mtodo run. Una de las responsabilidades de un controlador es registrar los observadores del modelo, esto se hace en el mtodo agregarObservador. Este controlador tambin tiene el objeto tipo reloj a controlar. La vista diseada es la siguiente:
Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
48 IMPLEMENTANDO HILOS EN JAVA | EAM
Para aplicar el patrn observador la interfaz grafica de implementar la interfaz Observer y el mtodo update para recibir las notificaciones de los cambios en el modelo. El modelo debe notificar esos cambios cuando los haya. Para el caso de nuestro ejemplo, se notifica los cambios cuando se llama al mtodo de avanzarSegundo() que es el que implementa el cambio en los segundos, minutos y horas.
El update en la interfaz recibe esa notificacin y muestra los segundos, minutos y horas.
Cada vez que se llame el mtodo avanzarSegundo() el reloj notificara a la interfaz el cambio la cual lo muestra en los JTextField dispuesto. El hilo-controlador deber llamar este mtodo cada segundo. public void avanzarSegundo() { segundos++; if (segundos==60) { segundos=0; minutos++;
if (minutos==60) { minutos=0; horas++;
if (horas==12) horas=0; } } setChanged(); notifyObservers(this); } Notifica a los observadores a travs de notifyObserver que enva una referencia del objeto reloj. public void update(Observable o, Object arg) { reloj r=( reloj)arg;
TFMinuto.setText(r.getMinutos()+""); TFSegundo.setText(r.getSegundos()+""); TFHora.setText(r.getHoras()+""); } El parmetro arg recibe lo que se envi en notifyObserver en el modelo Se muestran los atributos del reloj El parmetro arg se transforma en reloj ya que es un Object 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
Clase Thread. 49
El llamado antes mencionado debe hacerse en el mtodo run() del hilo.
El constructor del hilo tiene la responsabilidad de crear el reloj que va a controlar.
public void run() { while(true) { try { clock.avanzarSegundo(); sleep(1000); } catch (InterruptedException ex) { ex.printStackTrace(); } } } Mtodo del reloj que incrementa los segundos y cuando sea necesario las horas y los minutos. Este mtodo notifica a la interfaz del cambio. Se esperan 1000 milisegundos (1 segundo) entre llamado y llamado del mtodo del reloj. Esto garantiza que los segundos avancen en el tiempo justo. sleep genera excepcin public class Timer extends Thread { private reloj clock;
public Timer() { super(); clock=new reloj(); } . .
} Instancia del reloj. Este constructor inicializa el reloj con la hora actual del sistema. Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
50 IMPLEMENTANDO HILOS EN JAVA | EAM
ESTADOS Y CICLO DE VIDA DE UN HILO
Los hilos al ser entidades activas en la aplicacin tienen un tiempo de vida o tiempo en el que estn activos. Bsicamente un hilo nace cuando se instancia y muere cuando despus de llamar al mtodo start() de Thread, el mtodo run() termina su ejecucin o retorna. Entre estos episodios el hilo pasa continuamente de un estado a otro ya sea por que el programador o los sistemas as lo decidieron, la siguiente figura muestra los estados de un hilo:
Un hilo puede estar en tres estados principalmente: Nuevo: Hilo recin instanciado, aun no se ha llamado al mtodo start(). Runnable: preparado para ejecutarse. El sistema operativo (SO) asigna a cada hilo un tiempo de ejecucin. Solo los hilos en este estado pueden ser llegar a ser ejecutados. Running: el hilo est corriendo. Cuando el SO decide ejecutar el hilo, pasa a este estado. Blocked: hilo bloqueado: cuando un hilo esta en este estado es porque dejo de correr por alguna razn, como puede ser un tiempo de espera con sleep, o que est esperando un dato de un Dispositivo de entrada y salida o de otro hilo. Cuando el hilo sale de este estado pasa al de Runnable para esperar a ser ejecuta en Running. Muerto: cuando el mtodo run() completa su ejecucin, este muere y no puede volver a ningn otro estado. El mtodo isAlive() indica por medio de un booleano si el hilo est vivo o muerto.
2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
SINCRONIZACIN DE HILOS. 51
SINCRONIZACIN DE HILOS. Considrese el escenario cuando dos hilos poseen una referencia a la misma instancia de una clase. Un hilo esta aadiendo elementos a una pila y otro los est sacando. En principio, los datos son agregados y sacados exitosamente. Sin embargo, esto tiene problemas potenciales. Supngase que el hilo a agrega elementos a una velocidad dada y el hilo b saca elementos a otra velocidad, eventualmente la pila se quedara sin elementos dado el caso que el hilo b saque a una mayor velocidad de lo que el hilo a produce, entonces, que hacer en esa situacin?. Una solucin a este problemas seria evitar que el hilo b saque elementos de la pila hasta que el hilo a haya producido alguno, pero como se le informa a b que ya puede sacar?
Cuando dos hilos manipulan un mismo objeto, cabe la posibilidad que uno de los hilos lo necesite usar cuando el primero todava lo est usando, dando la posibilidad que el segundo lea un dato invalido o cambie el comportamiento del primer hilo por esta accin, lo ideal para estos casos es que solo un hilo a la vez use los datos compartido con otros hilo. El lenguaje de programacin java provee la palabra syncronize para proteger los datos de accesos simultneos.
Ejemplo: Producto-Consumidor. Una bodega modelada mediante una pila (estructura de datos que indica que el primer elemento que sale es el ultimo que entro) es llenada por un productor con elementos y vaciada por varios consumidores. Las velocidades de produccin y de consumo son aleatorias. Resolver este problema usando MVC. El modelo que se manipulara es la pila. Se puede formar por un ArrayList que se le agregan elementos en la posicin cero y se le sacan de ah mismo . Este sera el modelo:
Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
52 IMPLEMENTANDO HILOS EN JAVA | EAM
La interfaz grafica para mostrar la bodega es muy simple y es la siguiente:
Esta interfaz implementa a Observer y debe tener el mtodo update para mostrar el contenido de la pila y los que los consumidores sacan de la pila.
public class pila extends Observable { private ArrayList<Integer> elementos; public pila() { elementos=new ArrayList<Integer>(); } /** * agrega un elemento en la pila * @param elem elemento a agregar. */ public void agregarElemento(int elem) { elementos.add(0, elem); setChanged(); notifyObservers(this); } /** * metodo para sacar un elemnto de la pila * @return ele elemento */ public int sacarElemento() { int elem=elementos.remove(0); setChanged(); notifyObservers(this); return elem; } public ArrayList<Integer> getElementos() { return elementos; } } Se agrega un elemento a la primera posicin del ArrayList. Se notifica a los observadores Se saca el primer elemento del ArrayList. Se notifica a los observadores Notificara a los Observadores. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
SINCRONIZACIN DE HILOS. 53
El productor se puede definir como un hilo que peridicamente agregue un elemento a la pila y el consumidor como otro hilo que los saque.
public class productor extends Thread { private pila stack;
public productor(pila stack) { super("Productor"); this.stack=stack;
} catch (InterruptedException ex) { ex.printStackTrace(); } } } Se genera un elemento aleatorio para agregarlo a la pila y se crea otro tiempo aleatorio de espera. El productor debe tener una referencia de la pila que llega como parmetro al constructor. Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
54 IMPLEMENTANDO HILOS EN JAVA | EAM
El consumidor como se dijo antes es otro hilo que saca los elementos de la pila en periodos de tiempo aleatorios.
public class consumidor extends Thread { private pila stack;
public consumidor(String nombre, pila stack) { super(nombre); this.stack=stack; } //-------------------------------------------------------------------------------------------------------- public void run() { while(true) { try { int d = stack.sacarElemento(); System.out.println(getName() + ":" + d); sleep((int) (Math.random()*1000)); } catch (InterruptedException ex) { Logger.getLogger(consumidor.class.getName()).log(Level.SEVERE, null, ex); } } }
Saca el elemento de la pila. Y espera un tiempo aleatorio. El consumidor recibe la pila de donde saca los datos. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
SINCRONIZACIN DE HILOS. 55
Para garantizar que el productor y el consumidor utilizan la misma pila, estas se reciben como parmetro en el constructor. El constructor de la interfaz instancia el productor y dos consumidores y se les asigna una pila.
El update de la interfaz muestra el ArrayList de la pila en el JList.
En este punto el problema est resuelto, lo nico que hay que determinar es que pasa cuando la pila no tenga elementos para entregar a alguno de los consumidores. Para resolver este dilema se tiene que conocer el significado de las palabras reservadas syncronize, wait y notify.
public ventana() { initComponents(); setVisible(true);
} Crea la pila y le agrega el observador que es esta interfaz. Se crea el productor y dos consumidores que reciben la misma pila. Inicia todos los hilos. public void update(Observable o, Object arg) { if (o==bodega) //revisa que el objeto que notifico es la pila. { ArrayList<Integer> elem=((pila)arg).getElementos(); jList1.setListData(elem.toArray()); } } Camilo Andrs Ferrer Bustos CAPITULO II: HILOS Y CONCURRENCIA
56 IMPLEMENTANDO HILOS EN JAVA | EAM
Los problemas que aqu se presentan son los siguientes: La bodega solo la puede usar un consumidor a la vez, si otro la necesita, debe esperar. Si la bodega esta vaca, el consumidor debe esperar a que haya otro elemento y la bodega le debe notificar al o a los consumidores que esperan que ya hay una existencia disponible. La pregunta que hay que responder es como comunicar el hilo del productor y el consumidor y como evitar que dos hilos no utilicen la bodega al tiempo?, para esto se utilizan syncronized, wait y notify. Para que un consumidor solo pueda sacar un producto de la pila a la vez se usa syncronized. Un bloque de cdigo con la etiqueta syncronized solo puede ser usado por un hilo a la vez. Para definir que un mtodo va a ser sincronizado se coloca la palabra syncronized despus del modificador de acceso.
Este mtodo solo puede ser usado por un hilo a la vez. Cuando un hilo consumidor llegue al mtodo sacarElemento, este debe esperar mientras la pila este vacia, ese tiempo de espera lo implementamos con wait.
} public synchronized int sacarElemento() { while(elementos.size()==0) { try { this.wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } int elem=elementos.remove(0); setChanged(); notifyObservers(this); return elem; } Dentro de este while se espera mientras la pila este vacia. Dentro del while se llama a notify para que la bodega ponga a esperar al hilo que pase por este mtodo Cuando se libera el hilo que usa este mtodo (recuerde que la pila no es un hilo, la usan los hilos de consumidor y productor) saca el elemento de la pila y lo retorna. 2009-I, Versin 4(20 de Marzo) NOTAS DE CLASE PROGRAMACION AVANZADA I
SINCRONIZACIN DE HILOS. 57
Cuando se debe liberar el hilo puesto a esperar con wait?. El hilo debe dejar de esperar cuando haya un nuevo producto y esto pasa cuando se agrega un elemento a la pila con el mtodo agregarElemento.
En resumen: Syncronized no permite que dos hilo utilicen el mismo bloque de cdigo. Wait pone al hilo a esperar. Notify saca al hilo de esa espera. Todo wait debe tener un notify ya que de no ser asi hilo tiene la posibilidad de nunca salir del estado de espera o lo que se llama un DeadLock. public synchronized void agregarElemento(int elem) { elementos.add(0, elem); this.notify(); //---------------------------------------- setChanged(); notifyObservers(this);
} Esta clase notifica al hilo que tiene esperando que ya puede continuar su ejecucin. Este mtodo saca al hilo que espera de este estado y como la pila ya tiene elementos el while(elementos.size()==0) de sacarElementos es falso y la ejecucin continua