Práctica de Modelo Conceptual (Ingeniería I)

De Cuba-Wiki
Revisión del 03:10 2 oct 2007 de 200.89.166.122 (discusión) (→‎Ejercicio 06)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

Ejercicio 01

Ejercicio 02

Ejercicio 03

Ejercicio 04

Ejercicio 05

Ejercicio 06

Dado el modelo conceptual, modelar con OCL los siguientes puntos:

a)

  1. 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).
  2. Un invariante que garantice un tanque de combustible nunca tenga más combustible que su capacidad máxima.
  3. 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.
  4. 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:

  1. 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.
  2. Un invariante que garantice que ninguna pócima puede bloquear a un hechizo y a su contrahechizo.
  3. 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).
  4. 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

Ejercicio 10

Ejercicio 11