Diferencia entre revisiones de «Práctica de Modelo Conceptual (Ingeniería I)»
Línea 34: | Línea 34: | ||
[[Image:Ej2McIng1.PNG]] | [[Image:Ej2McIng1.PNG]] | ||
Nota del 28 - 4 - 08 Faltaria modelar la cuestion de los análisis ? | |||
No es posible modelar sin uso de OCL que las formulas son respetadas, es decir, que un lote de un medicamento se compone por los lotes de las formulas correspondientes. | No es posible modelar sin uso de OCL que las formulas son respetadas, es decir, que un lote de un medicamento se compone por los lotes de las formulas correspondientes. |
Revisión del 20:28 28 abr 2008
Ejercicio 01
En un restaurante trabajan cocineros, mozos y empleados de limpieza. Para todos ellos
se desean guardar los siguientes datos: nombre, documento, dirección y teléfono. El
restaurante ofrece una variada cantidad de platos y los cocineros pueden
especializarse en distintos de ellos, como por ejemplo: platos franceses, italianos,
griegos, zulúes, etc. Además los platos se pueden separar en fríos o calientes. Los
empleados de limpieza pueden estar encargados de la limpieza general del restaurante
o ser lavadores de cacharros. Los primeros trabajan por horas y para los segundos es
necesario guardar la cantidad de cacharros rotos para descontarlos luego de su sueldo.
Los mozos están asignados a mesas determinadas. Esta asignación cambia todos los
meses. Cada mesa puede pedir varios platos, bebidas y postres.
Realice un modelo conceptual del anterior enunciado.
Rta:
Ejercicio 02
En una droguería se fabrican medicamentos. Cada medicamento se obtiene a partir de la combinación de distintas drogas, las cuáles están descriptas en su fórmula. Las drogas son suministradas por proveedores. Las drogas se compran de a lotes. Cuando un nuevo lote de una droga (siempre los lotes son de una sola droga) ingresa a la droguería, éste permanece en cuarentena hasta tanto se certifique mediante distintos análisis que su calidad es satisfactoria. Los resultados de los análisis pueden ser consultados en cualquier momento. Tras superar los análisis, el lote deja de estar en cuarentena y pasa a estar en producción. A partir de los lotes de drogas en producción se fabrican los lotes de medicamentos que finalmente se venderán. Los lotes de medicamentos poseen un tratamiento similar a los de drogas: inicialmente se encuentran en cuarentena hasta tanto un conjunto de análisis certifican su buen estado. Es importante saber, dado un lote de medicamentos, de cuáles lotes de drogas provienen sus componentes. Realice un modelo conceptual que permita modelar lo mencionado en el enunciado. Justifique las entidades, relaciones y cardinalidades utilizadas. ¿Existen restricciones que no ha podido modelar con su modelo?. Justifique utilizando ejemplos instanciados en el problema.
Nota del 28 - 4 - 08 Faltaria modelar la cuestion de los análisis ?
No es posible modelar sin uso de OCL que las formulas son respetadas, es decir, que un lote de un medicamento se compone por los lotes de las formulas correspondientes.
Notar que faltan atributos como ser cantidades, y nombres de roles en todas las asociaciones. Deberian incluirse para que el ejercicio sea completo.
Ejercicio 03
Ejercicio 04
Ejercicio 05
Ejercicio 06
Dado el modelo conceptual, modelar con OCL los siguientes puntos:
a)
- Un invariante que asegure que en ningún caso se vendan más litros que la capacidad máxima del tanque de combustible del automóvil (por razones de seguridad está prohibido vender combustible en bidones).
- Un invariante que garantice un tanque de combustible nunca tenga más combustible que su capacidad máxima.
- Un invariante que asegure que el importe de cada venta de combustible sea el correcto en función de los litros vendidos y según que tipo de surtidor lo haya expedido.
- Un invariante que asegure que el 60% de los automóviles que compran combustible en una estación de servicio, sean de un modelo superior al año 2000.
Modifique el diagrama presentado (agregando clases, agregando/cambiando relaciones, agregando/cambiando atributos, utilizando OCL, pero respetando las clases dadas) con el fin de que se adecue al siguiente enunciado:
Una estación de servicio puede tener dos tipos de surtidores, de nafta o diesel. Existen automóviles nafteros y de motor diesel. Según corresponda, cada automóvil utiliza el surtidor correspondiente. Los comprobantes de venta (ticket) siempre se hacen a nombre del dueño del automóvil, el cual puede o no ser socio del plan "clientes VIP" de la estación de servicio.
El plan "clientes VIP" es un plan que permite que durante un período de tiempo (seis meses), un cliente obtenga un 10% de descuento en todas sus compras de combustible.
Respuestas
Invariantes con OCL
context TicketVentaCombustible -- No se venden más litros que la capacidad máxima del tanque de combustible del automóvil. inv VentaEntraEnTanque: self.litrosVendidos < self.cliente.tieneUn.tanque.capacidadMaxima
context TanqueCombustible -- Un tanque de combustible nunca tenga más combustible que su capacidad máxima inv CantidadMenorACapacidad: self.cantidad <= self.capacidadMaxima
context TicketVentaCombustible -- El importe de cada venta de combustible es el correcto. inv ImporteCorrecto: self.importe = self.litrosVendidos * self.expedidoPor.precioXLitro
context EstacionServicio -- El 60% de los automóviles que compran combustible en una estación de servicio, sean de un modelo superior al año 2000. inv AutosNuevos: self.surtidores.ticketEmitidos.cliente.tieneUn->select(Automovil a | a.modelo > 2000).size / self.surtidores.ticketEmitidos->size >= 0.6
b)
Ejercicio 07
Dado el modelo conceptual, modelar con OCL los siguientes puntos:
- Un invariante que garantice que un mago sea más poderoso que otro, sólo si conoce algún hechizo tal que el otro mago no conoce su contrahechizo.
- Un invariante que garantice que ninguna pócima puede bloquear a un hechizo y a su contrahechizo.
- Un invariante que garantice que ningún mago puede elaborar una pócima que bloquee a todos los hechizos conocidos (lo cual no implica que dicha pócima no exista).
- El atributo derivado esJovenMaravilla. Se dice que un mago es un joven maravilla, cuando es el mago más joven que más hechizos conoce. Es decir, de aquellos magos que poseen la menor edad, el que conoce más hechizos.
Modificar el modelo (agregando / quitando entidades, relaciones y / o predicados en OCL) de manera tal de contemplar el siguiente texto:
El bloqueo de un hechizo por parte de una pócima, no es indefinido. Según cuál sea el hechizo, el efecto de bloqueo tiene una duración determinada.
Las pócimas están compuestas por ingredientes, que las componen con ciertas cantidades. Los ingredientes pueden ser de origen animal, vegetal o mineral. Aquellas pócimas que están compuestas sólo por ingredientes de origen mineral, no son capaces de bloquear a ningún hechizo.
Existen magos que no son capaces de elaborar ninguna pócima, y sólo son capaces de realizar hechizos. Estos magos son conocidos como hechiceros.
Respuestas
Invariantes y atributos derivados
context Mago --Un mago es más poderoso que otro, sólo si conoce algún hechizo tal que el otro mago no conoce su contrahechizo inv DebilSiNoSabeContrahechizo: self.masPoderosoQue->forAll(Mago m | self.conoce->exists(Hechizo h | not m.conoce->exists(Hechizo c | h.contraHechizo = c) ) )
context Hechizo --Ninguna pócima puede bloquear a un hechizo y a su contrahechizo inv PocimaNoBloqueaHechizoYContraHechizo: self.esBloqueadoPor->intersection(self.contraHechizo.esBloqueadoPor)->isEmpty
context Mago --Ningún mago puede elaborar una pócima que bloquee a todos los hechizos conocidos (lo cual no implica que dicha pócima no exista) inv NoElaboraSuperPocima: self.sabeElaborar->forAll(Pocima p | p.puedeBloquear->size < Hechizo.allInstances->size)
context Mago::esJovenMaravilla::Boolean --Un mago es un joven maravilla, cuando es el mago más joven que más hechizos conoce derive: Mago.allInstances->forAll(Mago m | (self = m) OR (self.edad < m.edad) OR (self.edad = m.edad AND self.conoce->size > m.conoce->size) )
Nuevas funcionalidades:
El bloqueo de un hechizo por parte de una pócima, no es indefinido. Según cuál sea el hechizo, el efecto de bloqueo tiene una duración determinada.
Agregar una clase de asociación para la asociacion entre Pocima y Hechizo para la asociación Bloqueo, con el atributo Duración de dominio tiempo o tipo Real.
Las pócimas están compuestas por ingredientes, que las componen con ciertas cantidades. Los ingredientes pueden ser de origen animal, vegetal o mineral. Aquellas pócimas que están compuestas sólo por ingredientes de origen mineral, no son capaces de bloquear a ningún hechizo.
Agregar una clase Ingrediente, con el atributo Tipo que se corresponda a un tipo enumerado TipoIngrediente, con los valores Animal, Vegetal y Mineral. Armar una clase de asociación entre Ingrediente y Pocima de 0..* a 1..* (toda pocima debe tener al menos un ingrediente), con el atributo Cantidad de tipo Integer. Además, incluir el siguiente invariante.
context: Pocima --Las pócimas compuestas sólo por ingredientes de origen mineral, no son capaces de bloquear a ningún hechizo. inv MineralesNoBloquean: self.compuestaPor->forAll(Ingrediente i | i.tipo = Mineral) implies self.puedeBloquear->isEmpty
Existen magos que no son capaces de elaborar ninguna pócima, y sólo son capaces de realizar hechizos. Estos magos son conocidos como hechiceros.
Agregar una clase Hechicero, que tenga las asociaciones masPoderosoQue/masDebilQue y conoce. Quitar esas asociaciones de la clase Mago, y hacer que Mago herede de Hechicero.
Ejercicio 08
Ejercicio 09
Ver [Link a PDF]
Ejercicio 10
Ejercicio 11
Modele un sistema de reservas aéreas. La empresa realiza vuelos directos entre dos ciudades. En caso de querer hacer un viaje de varios tramos, el pasajero deberá realizar una reserva por cada tramo. Por razones caprichosas del director de la empresa sólo se puede realizar un trasbordo cómo máximo.
La empresa tiene distintos modelos de aviones, por lo que los vuelos tienen distintas capacidades. Se pueden reservar pasajes de ida o de ida y vuelta. El sistema debe incluir operaciones para:
- registrar un nuevo vuelo
- cancelar un vuelo
- efectuar una reserva
- consultar vuelos entre dos ciudades
Cada vuelo tiene número de vuelo, fecha y hora de partida y fecha y hora de llegada. En caso de no existir un vuelo que una las ciudades requeridas por el pasajero, o que el vuelo requerido esté completo, el sistema deberá emitir un mensaje informativo. Se puede asumir que el número de vuelo identifica a un solo vuelo, que todo el sistema expresa los datos utilizando la hora de una ciudad y que la fecha se representa por un natural.
Exprese un invariante del tipo todos los vuelos arriban en un horario posterior al de salida y entre dos arribos de vuelos de la compañía al mismo aeropuerto, deben transcurrir por lo menos 20 minutos.
TODO: Faltan cosas en el modelo, como las responsabilidades, algunos invariantes y representar los ida y vuelta.
Modelo Conceptual:
OCL:
Si un viaje tiene dos reservas, entonces el origen de una es el destino de la otra.
context: Viaje
inv: let res = self.reservas->asOrderedSet() in
self.reservas->size() = 1 or
res->first().vuelo.origen = res->last().vuelo.destino or
res->first().vuelo.destino = res->last().vuelo.origen or
Un vuelo no es un loop
context: Vuelo
inv: not self.origen = self.destino
El avion no es magico
context: Vuelo
inv: self.AsientosOcupados <= self.avion.Capacidad