Los atributos son propiedades las cuales es posible definir reglas de negocio, comparaciones
o clculos para restringir valores posibles que puede tomar la propiedad.
Ejemplo: 'la edad de una persona es siempre mayor o igual a 18'.
context Person
inv: self.age >= 18
Las operaciones son propiedades similares a los atributos, con la diferencia que pueden tener
parmetros, por lo que un valor de la propiedad es expresado como funcin de los parmetros.
Ejemplo:
aPerson.income(aDate)
Un extremo de asociacin es un nombre de rol que se otorga de acuerdo a una asociacin,
de ese modo se puede hacer referencia desde un objeto hacia otro objeto asociado
denominado como extremo opuesto de la asociacin.
Ejemplo:
forAll(): Permite especificar una expresin booleana que debe ser verdadera para todos
los elementos de una coleccin. La operacin forAll tiene como resultado un valor
booleano.
context Proyecto
inv: self.participa->forAll(edad <= 65)
Indica que todos los participantes del proyecto deben tener 65 aos o menos
exists(): Indica la existencia de al menos un elemento de una coleccin que verifica una
condicin, por lo que devuelve un booleano (verdadero si existe, falso si no).
context Cuenta
inv: self.mTitulares->exists(c:Cliente| c.mEdad>=18)
Indica que debe existir al menos un titular de la cuenta con 18 aos o ms.
count(): Indica el nmero de veces que una coleccin self incluye un objeto object.
Bag{1, 2, 3, 2, 4, 2}->count(2) = 3
Indica que contando los objetos "2" en la coleccin "Bag{}" da como resultado 3 objetos
Ejercicios
A partir del siguiente diagrama de clases, establecer las siguientes restricciones
utilizando OCL
1) Para cada tipo de avin, el nmero de asientos para tripulantes no puede ser
mayor al nmero de asientos para pasajeros
context TipoAvin
inv: self.nroTripulantes < self.nroAsientos
2) Los viajes no pueden tener el mismo destino que el origen
context Viaje
inv: self.origen <> self.destino
3) La cantidad de horas de vuelo de un avin debe ser menor a 1000
context Avin
inv: self.horasVuelo < 1000
4) Para aviones del tipo Delta de la serie A, la cantidad de asientos para los
pasajeros debe ser de 40
context Avin
inv: self.tipo.tipo=Delta and self.tipo.serie=A implies self.tipo.nroAsientos=40
context tipoAvin
inv: self.tipo=Delta and self.serie=A implies self.nroAsientos=40
5) Los pasajeros de los viajes deben ser mayores de 3 aos y menores de 95
context Viaje
inv: self.pasajero -> forAll(edad>3 and edad<95)
6) Un viaje debe tener ms de 5 pasajeros
context Viaje
inv: self.pasajero -> size() > 5
7) La cantidad de tripulantes de un viaje debe ser menor o igual a la cantidad de
pasajeros
context Viaje
inv: self.tripulante -> size() <= self.pasajero -> size()
8) La cantidad de pasajeros de un viaje debe ser menor o igual a la capacidad de
asientos del avin asignado al vuelo
context Viaje
inv: self.pasajero -> size() <= self.avin.tipo.nroAsientos
9) Un avin no puede tener mas de 500 viajes asignados en su vida til si es del
tipo Delta
context Avin
inv: self.tipo.tipo=Delta implies self.viaje -> size() < 500
10) Para los viajes que tengan asignados aviones con una cantidad de horas de vuelo
superior a 500 hs, la edad de los tripulantes deben ser mayores a 50 aos
context Viaje
inv: self.avin.horasVuelo > 500 implies self.tripulante -> forAll(edad > 50)