viernes, 3 de julio de 2009

OCL - Ejercicios resueltos

Práctico 3 - Parte 1



context A inv:
(self.b->size() >= 2 and self.b->size() <= 4) or (self.b->size() = 33)


context B inv:
(self.a->size() >= 8 and self.a->size() <= 11) or (self.a->size() = 1)



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

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


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

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

Aqui "." no es navegacion sino abrevia a collect (no se me ocurre otra forma)


b) context Auto inv:

self.parte->forAll (self.precio>= precio)

c) context Auto inv:

self.parte->select(p/ p.precio > self.precio / 2) -> size() = 1




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

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


c) context Vendedor
-- Vende uno o mas productos de la empresa para la que trabaja
inv: self.empresa.producto->includesAll(self.producto)

-- Al menos vende un producto para cada empresa
inv: self.producto->forAll(p | p.empresa -> intersection (self.empresa)->notEmpty())



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

Ejercicio 7 ¡Nuevo!




Ejercicio 8 ¡Nuevo!






Parte 2: Modelado del Dominio


Ejercicio 1 ¡Nuevo!




Ejercicio 2 ¡Nuevo!




Ejercicio 3 ¡Nuevo!


4 comentarios:

  1. En el select(p / p.precio > self.precio/2) ..., no sería:

    select(p | p.precio .... ??

    Lo mismo en el forAll ...

    Sobre el ejercicio 3 parte (a), a ver qué te parece esta otra forma:

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

    El iterate está en la página 29 del pdf sobre OCL.

    ResponderEliminar
  2. No habia visto hasta el momento sumar asi.
    Aca va otra forma y van...

    context Auto inv:
    self.precio=self.parte->iterate(p:Parte;acc:Bag(Real)| acc->including(p.precio)->sum())

    En cuanto al pipe (|) estoy de acuerdo, esta como decis en el manual.

    Saludos!

    ResponderEliminar
  3. Para 7.c (no resuelto):
    context Examen inv:
    self.Pregunta->forAll(p:Pregunta | p.Examen->size()<2)

    Tal vez podria ser una sol. sencilla!;)

    ResponderEliminar
  4. Si, excelente!
    La pregunta está asociada como máximo a un examen.
    Gracias por el aporte.

    ResponderEliminar

Gracias por dejar su comentario. Carpe diem!