viernes, 24 de julio de 2009

Práctico 3 - Análisis - OCL y Modelado del Dominio

Parte 1 - OCL

Ejercicio 1 (básico, imprescindible)

Un analista realizó tres Modelos de Dominio diferentes, presentados en los siguientes diagramas:



Especificar utilizando OCL las restricciones al Modelo de Dominio (a) de forma que permita solamente las instancias válidas para los modelos (b) y (c).

Solución:

• Convertir (a) en (b):

context A inv:
-- todo A se relaciona con exactamente 33 instancias de B
self.b->size()=33

context B inv:
-- todo B se relaciona con exactamente 1 A
self.a->size()=1

• Convertir (a) en (c):

context A inv:
let cant:Integer = self.b->size()
in
cant >= 2 and cant <= 4

context B inv:
let cant:Integer = self.a->size()
in
cant >= 8 and cant <= 11


Ejercicio 2 (básico, imprescindible)

Considerar el Modelo de Dominio presentado en el siguiente diagrama:




a) Especificar en OCL la restricción que indica que el atributo ci de la clase Persona identifica a las instancias de Persona, es decir, no hay dos personas con igual cédula de identidad.
b) Expresar de otra forma la misma restricción, utilizando también OCL.

Solución:

a)
context Persona inv:
Persona.allInstances()->isUnique(ci)

b)
Lo mismo, más complicado:

context Persona inv:
Persona.allInstances()->forAll(p1, p2:Persona | p1 <> p2 implies p1.ci <> p2.ci)

ó, aún más retorcido :

context Persona inv :
Persona.allInstances()->forAll(p1, p2 :Persona | p1.ci = p2.ci implies p1 = p2)


Ejercicio 3 (básico, imprescindible)

Un analista construyó el Modelo de Dominio presentado en el siguiente diagrama.
Como información adicional, se sabe que el precio de un auto se calcula como la suma de los precios de todas sus partes.



a) Indicar en OCL, de dos formas diferentes, cómo se calcula el precio de un auto.
b) Indicar en OCL la propiedad que indica que el precio de un auto es mayor que el precio de sus partes.
c) Indicar en OCL la restricción que exige que todo auto cuenta, entre sus partes, con exactamente una parte cuyo precio es mayor a la mitad del precio del auto.

Solución:

a)

context Auto inv :
self.precio=self.parte.precio->sum()

Otra forma:

context Auto inv:
self.precio = self.parte->iterate(p:Parte; suma:Real = 0 |
suma = suma + p.precio)

b)
context Auto inv:
self.parte->forAll(p:Parte | self.precio > p.precio)

ó, self.parte->forAll(self.precio > precio)

c)
context Auto inv:
self.parte->select(precio > self.precio / 2)->size() = 1



Ejercicio 4 (básico, imprescindible)

Considerar el Modelo de Dominio presentado en el siguiente diagrama:




a) Expresar en OCL la restricción que exige que un vendedor solamente vende un producto de la empresa para la que trabaja.
b) Expresar dicha restricción considerando que un vendedor vende uno o más productos de la empresa para la que trabaja.
c) Expresar dicha restricción asumiendo que un vendedor trabaja en una o más empresas y vende uno o más productos de éstas.

Solución:

a)
context Vendedor inv:
self.empresa.producto->includes(self.producto)

b)
context Vendedor inv:
self.empresa.producto->includesAll(self.producto)

c)
context Vendedor inv:
self.empresa->forAll(e:Empresa | e.producto->includesAll(self.producto))

ó, equivalentemente:

empresa->forAll(producto->includesAll(self.producto))
(1) (2)

ya que (página 32 del pdf sobre OCL):

- dentro de todo el invariante, está implícita la variable self, de tipo Vendedor (self:Vendedor).

Por lo tanto, donde aparece la propiedad empresa, se asume que es self.empresa.

- el forAll define otra variable implícita, llamémosla iter1, de tipo Empresa.

Por lo tanto, la propiedad producto (1) debe ser o de self o de iter1. Como ambos tienen una propiedad llamada producto, se asuma que pertenece a la variable de alcance más interno: iter1.
De esta forma, producto (1) implica navegar desde la Empresa y no desde el Vendedor.

- el includesAll define una tercer variable implícita, llamémosla iter2, de tipo Producto.

Si en (2) pusiera sólo producto, se buscaría dicha propiedad en self, iter1 e iter2. iter2 no tiene una propiedad con ese nombre, pero sí la tienen self e iter1. Al igual que en (1), se asumiría que es iter1.producto (navegación desde la Empresa), lo que no es correcto (yo quiero navegación desde Vendedor).

Eso me obliga a poner explícitamente self.producto.



Ejercicio 5 (medio, imprescindible)

El Modelo de Dominio presentado en el siguiente diagrama representa a las
selecciones de fútbol que participan de los mundiales. Expresar en OCL la restricción que impone la FIFA de que todas las selecciones deben tener exactamente 3 arqueros.



Solución:

context Seleccion inv:
self.jugador-> select(j:Jugador | j.oclIsTypeOf(Arquero))-> size() = 3

ó

context Seleccion inv:
jugador -> select( oclIsTypeOf(Arquero)) -> size() = 3


Ejercicio 6 (medio, imprescindible)

a) Realizar dos Modelos de Dominio consistentes con la siguiente restricción y
presentarlos en diagramas utilizando UML.

context A inv:
self.r1.c.p > 0 and self.r2.c.p <>

b) Realizar dos Modelos de Dominio consistentes con la siguiente restricción y
presentarlos en diagramas utilizando UML.

context A inv:

self.r1->includesAll(self.r2)

Solución:





Ejercicio 7 (medio, imprescindible)

Construir el Modelo de Dominio para las siguientes realidades y presentarlo
utilizando UML y OCL. Su modelo debe representar completa y fielmente lo que el texto dice.

a) Todas las personas comen comida. En general, las personas comen tanto verduras como carne. Las personas vegetarianas sólo comen verduras mientras que las personas carnívoras sólo comen carne.

b) El padre de Juan se llama Alberto. José es el abuelo de Juan. Alberto tiene 40 años, le lleva 25 años a su hijo y es 25 años menor que su padre. Es regla general que cada padre es mayor que todos sus hijos. Además, para cada persona que se conozca el abuelo se conoce el padre. José tiene otro hijo llamado Luis de 42 años, quien no tiene hijos, por lo que el único nieto de José es Juan.

c) Los exámenes pueden contener preguntas y/o problemas. Cada uno de ellos
lleva puntos. Cada examen tiene un total de 100 puntos si se suman los puntos de todas sus preguntas y problemas. En cada examen, cada pregunta tiene menos puntos que cada uno de los problemas del mismo examen. Ningún examen puede repetir dos o más preguntas de otro examen. Los problemas aparecen en un examen solamente.

Solución:





Parte 2 - Modelado del Dominio

Ejercicio 1 (básico, de práctica)

Se cuenta con el siguiente anexo al documento de Visión del problema presentado en el ejercicio 2 del práctico 2 referente al sistema de información del control hospitalario.

Las salas tienen un conjunto de camas que interesa individualizar mediante un número. Existen salas de cuidados especiales y salas comunes. Para las salas de cuidados especiales, interesa conocer un detalle de los elementos de que dispone, mientras que de las salas comunes interesa saber si tiene o no capacidad para admitir acompañantes. Para los pacientes internados se desea conocer la fecha de internación y su ubicación en el hospital (la cama a la que están asignados). Acerca de todos los pacientes interesa saber cuáles son los médicos que los tratan, y en cada caso tener una descripción del tratamiento; un paciente puede estar bajo distintos tratamientos con diferentes médicos.

Modificar el Modelo de Dominio realizado previamente incorporando la nueva información y presentarlo en un diagrama utilizando UML y OCL.


Solución:





Ejercicio 2 (medio, imprescindible)

Construir el Modelo de Dominio a partir del siguiente documento de Visión del problema y presentarlo en un diagrama utilizando UML y OCL.

En una empresa de transporte se dispone de una flota de vehículos, de cada uno de los cuales se conoce un número que lo identifica, la marca y el modelo. Estos vehículos pueden ser camiones, en cuyo caso se conocen además la capacidad de carga en toneladas y la cantidad de ejes; existen camionetas, de las cuales se conocen su capacidad de carga en toneladas y si es doble cabina o no; ómnibus, de los que se conocen la cantidad de asientos y si tiene o no baño. Además la empresa cuenta con automóviles, de los cuales se conoce la cantidad máxima de pasajeros que admite. La empresa cuenta con un plantel de conductores. De estos se conoce su documento de identidad y la edad. Los conductores de primera categoría son asignados a manejar camiones, camionetas u ómnibus. Los de segunda categoría solo se asignan a automóviles. En el caso de los conductores de primera categoría, se asignan en forma fija e interesa representar a que vehículo está asignado cada conductor. Los de segunda categoría cambian su asignación diariamente, interesando saber a que auto se asignó cada día. Todos los conductores tienen asignado (de dicha forma) un solo vehículo. No todos los vehículos tienen un conductor asignado, pero se les puede asignar varios conductores.

Solución:




Ejercicio 3 (medio, de práctica)

Se desea modelar la realidad referente a los movimientos de dinero en la plaza financiera, descritos en el siguiente documento de Visión del problema.

Una persona puede realizar transacciones tanto en una ventanilla de un banco como en un cajero automático. Los cajeros automáticos tienen un código, un saldo de dinero en efectivo y la cantidad dispensada hasta el momento. Cada cajero se encuentra conectado en red con la empresa que lo administra, pudiendo haber más de una empresa administradora. Esta empresa se conecta a su vez con los distintos bancos que mantienen las cuentas que pueden ser accedidas.

Los bancos tienen un nombre y un código, y cada cuenta tiene un saldo y un límite de crédito. Cada ventanilla de banco tiene a su vez un código.

Cuando alguna de las terminales realiza una transacción, interesa saber si corresponde a un depósito o a un retiro, la fecha, hora y terminal en que se realizó, el importe y la cuenta.

Construir el Modelo de Dominio y presentarlo en un diagrama utilizando UML y OCL.

Solución:




Ejercicio 4 (medio, de práctica)

Se desea modelar un sistema de información relativo a las obras proyectadas por
un organismo estatal, descrito por el siguiente documento de Visión del problema.

El organismo dispone de distintas secciones y son cada una de ellas las que proyectan directamente las obras. Una sección contrata a una empresa para la realización de una obra interesando la fecha del contrato.
Las empresas pueden ser públicas o privadas. Existen a su vez dos tipos de obras; las obras de adjudicación directa y las que deben ser sometidas a licitación. Por reglamento, de las obras de adjudicación directa se puede encargar solamente una empresa pública, mientras que las empresas privadas solo se pueden encargar de las obras licitables. En cuanto a las obras directas, cuando una sección contrata a una empresa para realizarla se debe conocer para que obra. En cuanto a las obras licitables, pueden estar publicadas o no. Cuando una obra se publica, en el pliego de la
licitación debe figurar su información y (en cuanto se sepa) la información referente al contrato entre la sección y la empresa que la realizará.

Construir el Modelo de Dominio y presentarlo en un diagrama utilizando UML y OCL.

Solución:




No hay comentarios:

Publicar un comentario