Está en la página 1de 98

Modelado Conceptual

de Sistemas de Informacin
Object Constraint Language (OCL)

Vegetti-Gonnet-Leone, 2012 - 2
OCL Object Constraint Language
http://www.uml.org/
UML Resource Page
Object Constraint Language Specification,
version 2.2 (Feb 2010)
http://www.omg.org/spec/OCL/2.2/
Vegetti-Gonnet-Leone, 2012 - 3
OCL: Object Constraint Language

Object Constraint Language (OCL) es un
lenguaje formal utilizado para describir
expresiones en modelos UML, basado en la
teora de conjuntos y
lgica de predicados de primer orden.

OCL no utiliza notacin matemtica

Vegetti-Gonnet-Leone, 2012 - 4
OCL: Object Constraint Language
Las expresiones en OCL generalmente especifican:
invariantes que deben ser cumplidas por el sistema que est
siendo modelado
consultas sobre objetos del modelo
operaciones / acciones que, cuando son ejecutadas, alteran el
estado del sistema
pre / pos-condiciones en operaciones y mtodos

Expresiones OCL no poseen efectos colaterales
La evaluacin de expresiones OCL no altera el estado del
sistema

Vegetti-Gonnet-Leone, 2012 - 5
Por qu un Lenguaje para Especificar Restricciones?
Por qu un Lenguaje para Especificar Restricciones?
Vegetti-Gonnet-Leone, 2012 - 6
Usualmente un modelo en UML no provee todos los
aspectos relevantes de una especificacin
Necesidad de especificar restricciones sobre los
objetos y relaciones del modelo para eliminar
interpretaciones ambiguas
Vegetti-Gonnet-Leone, 2012 - 7
OCL: Object Constraint Language
OCL es un lenguaje de especificacin
OCL no es un lenguaje de programacin
No es posible escribir la lgica del programa o el flujo de control
en OCL
OCL es un lenguaje tipado
Cada expresin en OCL posee un tipo
Una expresin OCL debe cumplir con las reglas de escritura del
lenguaje
La evaluacin de una expresin de OCL es atmica
No es posible que los objetos en el modelo cambien de estado
durante la evaluacin de una expresin OCL.
Estructura Bsica de una Expresin OCL
Vegetti-Gonnet-Leone, 2012 - 8
Encabezado
Establece la entidad
UML sobre la que se
aplica
Conjunto de restricciones
que se aplican sobre la
entidad UML del
encabezamiento
Cuerpo
restriccin 1
restriccin 2



restriccin n
Vegetti-Gonnet-Leone, 2012 - 9
OCL se basa en los tipos (clases, interfaces, etc.) definidos en un modelo UML
La vinculacin entre una entidad en un diagrama UML y una
expresin OCL se denomina definicin de contexto de la expresin.
El nombre de la entidad que define el contexto es precedida por
la palabra clave context.
Las expresiones OCL se evaluan para un solo objeto, el cual es
una instancia del contexto
Especificacin del Contexto UML de una Expresin OCL
Vegetti-Gonnet-Leone, 2012 - 10
context Socio
inv: dni > 0 and dni <= 99999999
Especificacin del Contexto UML de una Expresin OCL
Vegetti-Gonnet-Leone, 2012 - 11
Especificacin del Contexto UML de una Expresin OCL
En algunas situaciones es necesario indicar explcitamente la instancia
del contexto. Esto se expresa mediante la palabra clave:
self
En el ejemplo se referencia una instancia del contexto (Socio)

Si el contexto es obvio puede omitirse
context Socio
inv: dni > 0 and dni <= 99999999
context Socio
inv: self.dni > 0 and self.dni <= 99999999
Vegetti-Gonnet-Leone, 2012 - 12
Especificacin del Contexto UML de una Expresin OCL
En OCL se utiliza la notacin de punto:
<objeto>.<propiedad>
para hacer referencia al valor de atributos y
operaciones.

Con el trmino:
self.dni
se hace referencia al valor del atributo dni del
objeto de Socio.
context Socio
inv: self.dni > 0 and self.dni <= 99999999
inv: self.obtPlazoPrestamo( ) > 0
Vegetti-Gonnet-Leone, 2012 - 13
Especificacin del Contexto UML de una Expresin OCL
En OCL se utiliza la notacin de punto:
<objeto>.<propiedad>
para hacer referencia al valor de atributos y
operaciones.

Con el trmino:
self.obtPlazoPrestamo( )
se hace referencia a la operacin obtPlazoPrestamo( )
de Socio.

Los parntesis diferencian una operacin de un atributo
context Socio
inv: self.dni > 0 and self.dni <= 99999999
inv: self.obtPlazoPrestamo( ) > 0
Vegetti-Gonnet-Leone, 2012 - 14
Es posible dar un nombre particular a las instancias del
contexto (Socio) y a las restricciones

context s:Socio
inv dniValido: s.dni > 0 and s.dni <= 99999999
Especificacin del Contexto UML de una Expresin OCL
nombre de restriccin
nombre de instancia
Formas de Referenciar a la Instancia de un Contexto
Vegetti-Gonnet-Leone, 2012 - 15
context Socio
inv: self.dni > 0 and self.dni <= 99999999
La instancia del contexto (Socio) se referencia explcitamente
mediante self.
context Socio
inv: dni > 0 and dni <= 99999999
La instancia del contexto (Socio) se referencia implcitamente
context asociado:Socio
inv dniValido: asociado.dni > 0 and asociado.dni <= 99999999
Se le asigna un nombre particular a la instancia del contexto.
Vegetti-Gonnet-Leone, 2012 - 16
OCL: Invariantes
context <Typename>
inv [<inv name>]: -- expresin booleana que debe verificarse
Una expresin invariante (invariant) debe ser cierta para cada
instancia del contexto asociado en todo momento
Una expresin invariante (invariant) debe ser cierta en todo
estado consistente del sistema (mientras se est ejecutando una
operacin el sistema no se encuentra en un estado consistente)
Todas las expresiones invariantes de OCL son del tipo Boolean
Una invariante es una restriccin que debe ser cierta para un
objeto durante todo su ciclo de vida
Vegetti-Gonnet-Leone, 2012 - 17
OCL: Invariantes
context r:Reserva
inv fechasVlidas: r.fechaInicio < r.fechaFin
context Revista
inv: ao > 1900
Vegetti-Gonnet-Leone, 2012 - 18
OCL: Valores Iniciales
El valor inicial de un atributo o el rol de una asociacin puede ser
especificado mediante una expresin de OCL.
El valor inicial slo debe satisfacerse cuando la instancia del
contexto es creada, luego, el atributo puede asumir cualquier valor.
context Typename::attributeName: Type
init: -- expresin que especifica un valor inicial
context Ejemplar::enBiblioteca : Boolean
init: true
Vegetti-Gonnet-Leone, 2012 - 19
context Typename::attributeName: Type
init: -- expresin que especifica un valor inicial
OCL: Valores Iniciales
context Ejemplar::enBiblioteca : Boolean

context Ejemplar::enBiblioteca : Boolean
init: true
Vegetti-Gonnet-Leone, 2012 - 20
OCL: Valores Derivados
Un modelo puede incluir valores de atributos derivados y
asociaciones derivadas. OCL permite especificar como se calculan
los elementos derivados.

Una regla de derivacin especifica que el elemento del contexto
(atributo o extremo de asociacin) siempre debe ser igual al valor
dado por la evaluacin de la misma.
Vegetti-Gonnet-Leone, 2012 - 21
OCL: Valores Derivados
Un modelo puede incluir valores de atributos derivados y
asociaciones derivadas. OCL permite especificar como se calculan
los elementos derivados.

Una regla de derivacin especifica que el elemento del contexto
(atributo o extremo de asociacin) siempre debe ser igual al valor
dado por la evaluacin de la misma.
context Typename::attributeName: Type
derive: -- expresin que especifica la regla de derivacin

context Typename::assocRoleName: Type
derive: -- expresin que especifica la regla de derivacin
Vegetti-Gonnet-Leone, 2012 - 22
context Ejemplar::enBiblioteca : Boolean
init: true
derive: if self.prestamo->size() = 0 then true else false endif
OCL: Valores Derivados
context Typename::attributeName: Type
derive: -- expresin que especificar la regla de derivacin
Vegetti-Gonnet-Leone, 2012 - 23
context Biblioteca::publicacion: Set(Publicacin)
derive: self.ejemplar.pub->asSet()
OCL: Valores Derivados
context Typename::assocRoleName: Type
derive: -- expresin que especificar la regla de derivacin
+publicacion
/TienePublicacion
Ejercicio
Vegetti-Gonnet-Leone, 2012 - 24
Libro
+titulo: String
+/cantPaginas: Integer
+/cantCapitulos: Integer
Captulo
+nmero: Integer
+titulo: String
+pagInicial: Integer
+pagFinal: Integer
+/cantPaginas: Integer
1 1..*
Autor
+nombre: String
1..*
0..*
Biblioteca
+agregarEjemplar(l: Libro): Ejemplar
Ejemplar
+id: Integer
*
*
1..*
Definir el valor derivado: +/ cantPaginas de Libro
context Libro::cantPaginas: Integer
derive: self.capitulo->collect(cantPaginas)->suma()
Vegetti-Gonnet-Leone, 2012 - 25
A partir de un objeto (e) es posible navegar por las asociaciones
para referir a otros objetos y sus propiedades
(e.associationEndName)

object.associationEndName

El valor es el conjunto de objetos en el otro lado de la
asociacin, identificando el extremo por el associationEndName.
Cuando no posee nombre un fin de la asociacin es posible acceder a
la misma por el nombre de la clase (o entidad) con su primera
letra en minsculas. Si el resultado es ambiguo, el nombre del rol es
obligatorio.
OCL: Navegacin
Vegetti-Gonnet-Leone, 2012 - 26
OCL: Navegacin
context Ejemplar
inv: self.pub->size()= 1
context Publicacion
inv: self.ejemplar->notEmpty()
Vegetti-Gonnet-Leone, 2012 - 27
OCL: Navegacin
Por defecto la navegacin resulta en un Set, si la asociacin es
declarada {ordered}, el tipo resultante de la navegacin es un
OrderedSet.
Una propiedad de una coleccin se accede por `->
(self.ejemplar->notEmpty())
Vegetti-Gonnet-Leone, 2012 - 28
OCL: Navegacin
context Usuario::prestar(p: Publicacion, fecha: Date): Prestamo
pre: p.ejemplar->exists(e| e.prestamo->size() = 0 )
Para especificar navegacin en una asociacin de clase, OCL utiliza el
nombre de la asociacin de clase con su primera letra en minsculas.
Vegetti-Gonnet-Leone, 2012 - 29
La navegacin desde una asociacin de clase siempre retorna un nico
objeto. De todos modos se puede utilizar como conjunto utilizando `->
Navegacin desde Asociaciones de Clase
context Reserva
inv: self.publicacion.ejemplar->size() > 0
Vegetti-Gonnet-Leone, 2012 - 30
context Revista::obtenerNumeroAutores( )
body: self.articulo.autor->size( )
La operacin de consulta planteada retorna el nmero de autores?
Cuando se navega a travs de ms de
una relacin (con cardinalidad 1 a n),
se obtiene un valor de tipo Bag y no un
valor de tipo Set, como ocurre en la
navegacin que recorre una nica
relacin
OCL: Navegacin
Vegetti-Gonnet-Leone, 2012 - 31 Vegetti-Gonnet-Leone, 2012 - 31
Navegacin hacia Asociaciones de Clase
Para especificar la navegacin hacia clases de
asociacin se utiliza un punto y el nombre de la
asociacin de clase:
context Persona
inv: self.Empleo
La subexpresin self.Empleo es un conjunto de todos
los puestos de trabajo (objetos de empleo) que una
persona tiene con las empresas que son su
empleador.
Vegetti-Gonnet-Leone, 2012 - 32 Vegetti-Gonnet-Leone, 2012 - 32
Navegacin hacia Asociaciones de Clase
En el caso de una asociacin recursiva, que es una
asociacin de una clase consigo misma, el nombre de la clase
de asociacin por s sola no es suficiente.
context Persona
inv:self.RankingEmpleado[jefes]->sum() > 0
Al navegar a RankingEmpleado hay dos posibilidades
dependiendo de la direccin.
Se puede navegar hacia el extremo subordinados, o
el extremo jefes. S se utiliza slo el nombre de la
clase de la asociacin, estas dos opciones no se
pueden distinguir.
Se debe utilizar el nombre de rol de la direccin en la
que se que se desea navegar.
Vegetti-Gonnet-Leone, 2012 - 33
En OCL, cada valor, tiene un cierto Tipo que define las
operaciones que pueden ser aplicadas al objeto
OCL: Elementos Bsicos y Tipos
Los Tipos en OCL se clasifican en:
Tipos predefinidos
Tipos bsicos (Integer , Real , String y Boolean)
Tipos collection (Collection , Bag , Set , OrderedSet y
Sequence)
Tipos definidos por el usuario, cada elemento instanciable
del modelo, definido por el usuario, es automticamente un
tipo en OCL.
Vegetti-Gonnet-Leone, 2012 - 34
Operaciones Primitivas para el Tipo Boolean
context s:Socio
inv dniValido: s.dni > 0 and s.dni <= 99999999
Operacin Notacin Tipo del resultado
or a or b Boolean
and a and b Boolean
exclusive or a xor b Boolean
Iguales a = b Boolean
no iguales a <> b Boolean
implica a implies b Boolean
Vegetti-Gonnet-Leone, 2012 - 35
Operacin Notacin Tipo resultante
iguales a =b Boolean
no iguales a <>b Boolean
menor a <b Boolean
mayor a >b Boolean
menor o igual a <=b Boolean
mayor o igual a >=b Boolean
suma a +b Integer o Real
resta a b Integer o Real
multiplicacin a * b Integer o Real
divisin a / b Real
mdulo a.mod(b) Integer
divisin entera a.div(b) Integer
valor absoluto a.abs() Integer o Real
mximo de a y b a.max(b) Integer o Real
mnimo de a y b a.min(b) Integer o Real
redondeo a.round() Integer
base a.floor() Integer
Operaciones Primitivas para los Tipos Integer y Real
Vegetti-Gonnet-Leone, 2012 - 36
Operacin Notacin Tipo del resultado
concatenacin string.concat(string) String
longitud string.size() Integer
a minscula string.toLower() String
a mayscula string.toUpper() String
substring string.substring(int,int) String
iguales string1 = string2 Boolean
no iguales string1 <> string2 Boolean
Operaciones Primitivas para el Tipo String
Vegetti-Gonnet-Leone, 2012 - 37
Ejercicio
Plantear una expresin que permita derivar el atributo subtotal de Item. El
subtotal de un Item es igual al precio del producto por la cantidad.
context Typename::attributeName: Type
derive: -- expresin que especificar la regla de derivacin
context Typename::assocRoleName: Type
derive: -- expresin que especificar la regla de derivacin
Vegetti-Gonnet-Leone, 2012 - 38 Vegetti-Gonnet-Leone, 2012 - 38
Tipos de enumeracin
Las enumeraciones son tipos de datos en UML, que
tienen un nombre, al igual que cualquier otro clasificador.
Una enumeracin define un nmero de literales que son
los posibles valores de la enumeracin.
En OCL se puede hacer referencia al valor de una
enumeracin.
<nombre_enumeracion>::<valor_enumeracion>
En el ejemplo tenemos el tipo de dato
Sexo, con valores masculino y
femenino, el cual se puede utilizar de
la siguiente forma:
context Persona
init: genero = Sexo::masculino
Vegetti-Gonnet-Leone, 2012 - 39
OCL: Pre y post-condiciones
Una Precondicin es una expresin booleana que debe ser cierta
(true) en el momento en que la operacin comienza su ejecucin.

Una Postcondicin es una expresin booleana que debe ser cierta
(true) en el momento en que la operacin finaliza su ejecucin.
context Typename::operationName(param1 : Type1, ): ReturnType
pre nombrePreOpcional: param 1 >
post nombrePostOpcional: result =
self referencia un objeto en el cual la operacin fue invocada
Los nombres de los parmetros (param1) se pueden utilizar en la
expresiones OCL de las pre y/o postcondiciones
result ; palabra clave que indica el valor que retornar la operacin.
El tipo de result es definido por el tipo definido como retorno de la
operacin (ReturnType).
Vegetti-Gonnet-Leone, 2012 - 40
Constructores para Postcondiciones
@pre
Indica el valor de un atributo o asociacin antes de la ejecucin de
una operacin. @pre es sufijo del nombre de la propiedad.
context Biblioteca::addEjemplar(e:Ejemplar)
pre: not (self.ejemplar->includes(e))
post: self.ejemplar = self.ejemplar@pre->including(e)
Vegetti-Gonnet-Leone, 2012 - 41
Constructores para Postcondiciones
oclIsNew
Permite determinar si un objeto se cre durante la
ejecucin de una operacin.
context Libro::addAutor(nombre:String, apellido:String) : AutorPublicacion
post: result.oclIsNew() and
result.nombre = nombre and
result.apellido = apellido and
self.autor = self.autor@pre->including(result)
Vegetti-Gonnet-Leone, 2012 - 42
Ejercicio
Plantear pre y postcondiciones para la insercin de un Item en una Venta
(agregarProducto(p: Producto, cantidad: Integer): Item). Considerar en la
precondicin que el stock del Producto que se est vendiendo es suficiente
para la cantidad requerida. Por medio de la postcondicin se debe garantizar
que se ha agregado un nuevo Item del producto en la venta, con la cantidad
requerida. Adems considerar que el stock del producto vendido fue
decrementado en la cantidad deseada.
context Typename::operationName(param1 : Type1, ): ReturnType
pre nombrePreOpcional: param 1 >
post nombrePostOpcional: result =
Vegetti-Gonnet-Leone, 2012 - 43
Operaciones de Consulta
Las operaciones de consulta no cambian el estado del sistema.
Slo retornan un valor o un conjunto de valores.
En OCL es posible definir una operacin de consulta mediante una
body expression.
context Biblioteca::getTitulos(): Set(String)
body: publicacion->collect(titulo)->asSet()
context Typename::operationName(param1 : Type1, ... ): ReturnType
body: -- some expression
Vegetti-Gonnet-Leone, 2012 - 44
OCL: Variables locales - Expresiones Let
Una expresin Let permite definir una variable local en una
restriccin.
context Socio::obtPlazoPrestamo(e: Ejemplar) : Integer
pre existeEjemplar:
let noPrestado : Boolean = if e.prestamo->size() = 0 then true
else false endif
in
noPrestado
post: if e.pub.oclIsTypeOf(Libro) then result= 14 else result= 7
endif
Vegetti-Gonnet-Leone, 2012 - 45
Definicin de nuevos Atributos y Operaciones
La definicin de variables y/o operaciones permite su empleo en
otras expresiones OCL como cualquier otra propiedad del Classifier.
context Ejemplar
def: noPrestado : Boolean =
if self.prestamo->size() = 0 then true else false endif
Un atributo definido por medio de una clusula def es un atributo
derivado. Su definicin incluye el nombre del atributo, su tipo, y la
regla de derivacin.
Vegetti-Gonnet-Leone, 2012 - 46
Definicin de nuevos Atributos y Operaciones
La definicin de variables y/o operaciones permite su empleo en
otras expresiones OCL como cualquier otra propiedad del Classifier.
context Ejemplar
def: hasTitle() : String = self.pub.titulo
Una operacin definido por medio de una clusula def es una
operacin de consulta. La expresin que sucede al signo = es la
expresin del cuerpo de la operacin de consulta.
Vegetti-Gonnet-Leone, 2012 - 47
Propiedades Definidas en Todos los Objetos
La biblioteca estndar de OCL define el tipo OclAny.
OclAny es el supertipo de todos los tipos en un modelo, sus
operaciones estn definidas para todos los objetos OCL.
Expresin Tipo del resultado
objeto = (objeto2 : OclAny) Boolean
objeto <> (objeto2 : OclAny) Boolean
objeto.oclIsUndefined() Boolean
objeto.oclIsKindOf(tipo : OclType) Boolean
objeto.oclIsTypeOf(tipo : OclType) Boolean
objeto.oclIsNew() Boolean
objeto.oclAsType(tipo : OclType) Tipo
objeto.oclInState(nombre : StateName) Boolean
Vegetti-Gonnet-Leone, 2012 - 48
Expresin Tipo del resultado
objeto = (objeto2 : OclAny) Boolean
objeto <> (objeto2 : OclAny) Boolean
objeto.oclIsUndefined() Boolean
objeto.oclIsKindOf(tipo : OclType) Boolean
objeto.oclIsTypeOf(tipo : OclType) Boolean
objeto.oclIsNew() Boolean
objeto.oclAsType(tipo : OclType) Tipo
objeto.oclInState(nombre : StateName) Boolean
Propiedades Definidas en Todos los Objetos
La biblioteca estndar de OCL define el tipo OclAny.
OclAny es el supertipo de todos los tipos en un modelo, sus
operaciones estn definidas para todos los objetos OCL.
context Publicacion
inv: self.oclIsKindOf(Publicacion) = true
inv: self.oclIsTypeOf(Publicacion) = true
inv: self.oclIsKindOf(Libro) = false
inv: self.oclIsTypeOf(Libro) = false
Vegetti-Gonnet-Leone, 2012 - 49
Expresin Tipo del resultado
objeto = (objeto2 : OclAny) Boolean
objeto <> (objeto2 : OclAny) Boolean
objeto.oclIsUndefined() Boolean
objeto.oclIsKindOf(tipo : OclType) Boolean
objeto.oclIsTypeOf(tipo : OclType) Boolean
objeto.oclIsNew() Boolean
objeto.oclAsType(tipo : OclType) Tipo
objeto.oclInState(nombre : StateName) Boolean
Propiedades definidas en todos los objetos
La biblioteca estndar de OCL define el tipo OclAny.
OclAny es el supertipo de todos los tipos en un modelo, sus
operaciones estn definidas para todos los objetos OCL.
context Libro
inv: self.oclIsKindOf(Publicacion) = true
inv: self.oclIsTypeOf(Publicacion) = false
inv: self.oclIsKindOf(Libro) = true
inv: self.oclIsTypeOf(Libro) = true
Vegetti-Gonnet-Leone, 2012 - 50
Acceso a Propiedades de Clase
context Ejemplar
inv: Ejemplar.allInstances()->forAll(e1, e2| e1 <> e2 implies e1.id <> e2.id)

context Libro
inv: Libro.allInstances()->forAll(l1, l2| l1 <> l2 implies l1.ISBN <> l2.ISBN)
Vegetti-Gonnet-Leone, 2012 - 51
Reglas de Precedencia
@pre
. y ->
operadores unarios not y -
* y /
+ y -
if-then-else-endif
<, >, <=, >=
=, <>
and, or y xor
implies
Parntesis ( y ) permiten alterar el orden de precedencia
>

p
r
e
c
e
d
e
n
c
i
a

Vegetti-Gonnet-Leone, 2012 - 52
Colecciones de Objetos
Muchas veces la multiplicidad de una asociacin es
mayor que uno. Un objeto se puede vincular con una
coleccin de objetos de la clase asociada.
OCL provee diferentes tipos de colecciones (Set, Bag, OrderedSet,
Sequence) y distintas operaciones para manipularlas (size, select,
reject, forAll, exists, isEmpty, collect, iterate).
Vegetti-Gonnet-Leone, 2012 - 53
Colecciones de Objetos
Colecciones Constantes
Set {1, 2, 3, 5, 7}
Set {1..(6+4)}
Set {nicolas, maria sol, lucas, matias, clara}
OrderedSet {matias, maria sol, lucas, nicolas, clara}
Sequence {1, 3, 45, 2, 3}
Bag {4, 7, 10, 7, 3}
Expresiones de Tipo de Coleccin
Set(Publicacion)
Bag(Publicacion)
Vegetti-Gonnet-Leone, 2012 - 54
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->count(objeto) Cantidad de veces que ocurre objeto en
coleccin
coleccion->excludes(objeto) true si objeto no pertenece a coleccion
coleccion->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 55
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->count(objeto) Cantidad de veces que ocurre objeto en
coleccin
coleccin->excludes(objeto) true si objeto no pertenece a coleccion
coleccin->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccin->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 56
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->count(objeto) Cantidad de veces que ocurre objeto en
coleccin
coleccin->excludes(objeto) true si objeto no pertenece a coleccion
coleccin->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccin->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 57
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->excludes(objeto) true si objeto no pertenece a coleccion
coleccion->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 58
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->excludes(objeto) true si objeto no pertenece a coleccion
coleccion->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 59
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 60
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->excludesAll(coleccion2) true si todos los elementos de coleccion2
no estn presentes en coleccion
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 61
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 62
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->includes(objeto) true si objeto est en coleccion
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 63
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 64
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->includesAll(coleccion2) true si todos los elementos de coleccion2
estn presentes en coleccion
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 65
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->isEmpty() true si coleccion no posee elementos
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 66
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->notEmpty() true si coleccion contiene uno o mas
elementos
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 67
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccion->size() El nmero de elementos en coleccion
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 68
Operaciones Comunes a Todas las Colecciones
Operacin Descripcin
coleccin->sum() La suma de todos los elementos de
coleccion. Los elementos deben ser de un
tipo que admite la suma
Vegetti-Gonnet-Leone, 2012 - 69
Operaciones con Variantes segn la Coleccin
Set
Operacin Descripcin (self es de tipo Set(T))
union(s: Set(T)) : Set(T) unin de self y s
union(b: Bag(T)) : Bag(T) unin de self y b. Bolsa que contiene a todos los
elementos de self y b
= (s:Set(T)) : Boolean es true si self y s poseen los mismos elementos
intersection(s: Set(T)): Set(T) conjunto formado por los elementos que estn en self y s
intersection(b: Bag(T)): Set(T) conjunto formado por los elementos que estn en self y b
including(o:T): Set(T) conjunto formado por self + o
excluding(o:T): Set(T) conjunto formado por self sin el elemento o
symmetricDiference(s:Set(T)):
Set(T)
conjunto formado por los elementos que estn en self o
s, pero no en ambos
count(o:T): Integer nmero de ocurrencias de o en self (0 o 1)
flatten() : Set(T2) si el tipo de self no es un tipo de coleccin, entonces el
resultado es self. Sino, el resultado es el conjunto que
contiene todos los elementos de Self
Vegetti-Gonnet-Leone, 2012 - 70
Operaciones con Variantes segn la Coleccin
Set
Operacin Descripcin (self es de tipo Set(T))
asSet(): Set(T) self
asOrderedSet():
OrderedSet(T)
conjunto ordenado que contiene todos los elementos de
self (en un orden indefinido)
asSequence(): Sequence(T) secuencia que contiene todos los elementos de self (en
un orden indefinido)
asBag(): Bag(T) bolsa que contiene todos los elementos de self
Vegetti-Gonnet-Leone, 2012 - 71
Operaciones con Variantes segn la Coleccin
OrderedSet
Operacin Descripcin (self es de tipo OrderedSet(T))
append(o: T): OrderedSet(T) conjunto ordenado que consiste de todos los elementos
de self, seguido por o
prepend(o: T): OrderedSet(T) conjunto ordenado que consiste de todos los elementos
de self, precedido por o
insertAt(i: Integer, o: T):
OrderedSet(T)
self con o insertado en la posicin i
subOrderedSet(l: Integer, u:
Integer): OrderedSet(T)
subconjunto de self, contiene los elementos desde l
hasta u inclusive
at(i: Integer): T i-simo elemento de self
indexOf(o: T): Integer la posicin de o en la secuencia
first(): T primer elemento en self
last(): T ltimo elemento en self
Vegetti-Gonnet-Leone, 2012 - 72
Operaciones con Variantes segn la Coleccin
Bag
Operacin Descripcin (self es de tipo Bag(T))
union(s: Set(T)) : Bag(T) unin de self y s . Bolsa que contiene a todos los
elementos de self y s
union(b: Bag(T)) : Bag(T) unin de self y b. Bolsa que contiene a todos los
elementos de self y b
= (b:Bag(T)) : Boolean es true si self y b poseen los mismos elementos, el
mismo nmero de veces
intersection(s: Set(T)): Set(T) conjunto formado por los elementos que estn en self y s
intersection(b: Bag(T)):Bag(T) bolsa formada por los elementos que estn en self y b (la
cantidad mnima de cada uno de los elementos)
including(o:T): Bag(T) bolsa formada por self + o
excluding(o:T): Bag(T) bolsa formada por self sin ocurrencias del elemento o
count(o:T): Integer nmero de ocurrencias de o en self
flatten() : Bag(T2) si el tipo de self no es un tipo de coleccin, entonces el
resultado es self. Sino, el resultado es la bolsa que
contiene todos los elementos de Self
Vegetti-Gonnet-Leone, 2012 - 73
Operaciones con Variantes segn la Coleccin
Bag
Operacin Descripcin (self es de tipo Bag(T))
asSet(): Set(T) conjunto que contiene todos los elementos de self,
eliminando duplicados
asOrderedSet():
OrderedSet(T)
conjunto ordenado que contiene todos los elementos de
self, eliminando duplicados (en un orden indefinido)
asSequence(): Sequence(T) secuencia que contiene todos los elementos de self (en
un orden indefinido)
asBag(): Bag(T) self
Vegetti-Gonnet-Leone, 2012 - 74
Operaciones con Variantes segn la Coleccin
Sequence
Operacin Descripcin (self es de tipo Sequence(T))
count(o:T): Integer nmero de ocurrencias de o en self
= (s:Sequence(T)) : Boolean es true si self y s poseen los mismos elementos, en el
mismo orden
union(s: Sequence(T)) :
Sequence(T)
secuencia formada por todos los elementos de self,
seguida por todos los elementos de s
flatten() : Sequence(T2) si el tipo de self no es un tipo de coleccin, entonces el
resultado es self. Sino, el resultado es la secuencia que
contiene todos los elementos de self (el orden de los
elementos es parcial)
append(o: T): Sequence(T) secuencia que consiste de todos los elementos de self,
seguida por o
prepend(o: T): Sequence(T) secuencia que consiste de todos los elementos de self,
precedida por o
insertAt(i: Integer, o: T):
Sequence(T)
self con o insertado en la posicin i
subSequence(l: Integer, u:
Integer): Sequence(T)
subconjunto de self, contiene los elementos desde l
hasta u inclusive
Vegetti-Gonnet-Leone, 2012 - 75
Operaciones con Variantes segn la Coleccin
Sequence
Operacin Descripcin (self es de tipo Sequence(T))
at(i: Integer): T i-simo elemento de self
indexOf(o: T): Integer la posicin de o en la secuencia
first(): T primer elemento en self
last(): T ltimo elemento en self
including(o:T): Sequence secuencia conteniendo todos los elementos de self mas
o como ltimo elemento
excluding(o:T): Sequence secuencia conteniendo todos los elementos de self
excepto o
Vegetti-Gonnet-Leone, 2012 - 76
Operaciones con Variantes segn la Coleccin
Sequence
Operacin Descripcin (self es de tipo Sequence(T))
asSet(): Set(T) conjunto que contiene todos los elementos de self,
eliminando duplicados
asOrderedSet():
OrderedSet(T)
conjunto ordenado que contiene todos los elementos de
self, en el mismo orden, eliminando duplicados
asSequence(): Sequence(T) self
asBag(): Bag(T) bolsa que contiene todos los elementos de self, incluso
los duplicados
Vegetti-Gonnet-Leone, 2012 - 77
Operacin forAll
La operacin forAll permite especificar una expresin que debe ser
cierta para todos los objetos de una coleccin

collection->forAll(v : Type | boolean-expression-with-v)
collection->forAll(v | boolean-expression-with-v)
collection->forAll(boolean-expression)
context Libro inv:
self.autor->forAll(nombre.size()>0 and apellido.size()>0)
context Libro inv:
self.autor->forAll(a| a.nombre.size()>0 and a.apellido.size()>0)
Vegetti-Gonnet-Leone, 2012 - 78
Operacin forAll
Es posible emplear ms de un iterator

context Libro inv:
Libro.allInstances()->forAll(l1, l2| l1 <> l2 implies l1.ISBN <> l2.ISBN)
context Libro inv:
Libro.allInstances()->forAll(l1|
Libro.allInstances()->forAll(l2| l1 <> l2 implies l1.ISBN <> l2.ISBN))
Vegetti-Gonnet-Leone, 2012 - 79
Ejercicio
Libro
+titulo: String
+/cantPaginas: Integer
+/cantCapitulos: Integer
Captulo
+nmero: Integer
+titulo: String
+pagInicial: Integer
+pagFinal: Integer
+/cantPaginas: Integer
1 1..*
Autor
+nombre: String
1..*
0..*
Biblioteca
+agregarEjemplar(l: Libro): Ejemplar
Ejemplar
+id: Integer
*
*
1..*
Plantear una expresin que permita
derivar el atributo cantCapitulos de Libro.
El nmero inicial de pgina de un Captulo es menor que su
nmero final de pgina.
Plantear una restriccin que garantice que para todos los
Libros registrados en la Biblioteca, sus Ejemplares son parte de
la Biblioteca.
Plantear una consulta que permita conocer el nombre de los
autores de un Libro (Autores de los Captulos del Libro).
Plantear una restriccin que garantice que el numero de pagina inicial de un
capitulo sea uno ms que el nmero de pagina final del capitulo precedente
Vegetti-Gonnet-Leone, 2012 - 80
Operacin select
select especifica un subconjunto de una coleccin

collection->select(boolean-expression)

El resultado es una coleccin que contiene todos los elementos de
collection que satisfacen boolean-expression
collection->select(v | boolean-expression-with-v)

La variable v se denomina iterator
v itera sobre los elementos de collection y la expresin boolean-
expression-with-v es evaluada para cada valor de v

collection->select(v : Type | boolean-expression-with-v)

Vegetti-Gonnet-Leone, 2012 - 81
Operacin select
context Publicacion def: ejemplaresDisponibles() : Set(Ejemplar) =
self.ejemplar->select(enBiblioteca)
El contexto para la expresin en el argumento de select es un
elemento de la Collection donde select es invocado (enBiblioteca
es tomado del contexto de un Ejemplar).
context Publicacion def: ejemplaresDisponibles() : Set(Ejemplar) =
self.ejemplar->select(e| e.enBiblioteca)
context Publicacion def: ejemplaresDisponibles() : Set(Ejemplar) =
self.ejemplar->select(e:Ejemplar| e.enBiblioteca)
Vegetti-Gonnet-Leone, 2012 - 82
Operacin reject
reject especifica un subconjunto de una coleccin

collection->reject(v : Type | boolean-expression-with-v)
collection->reject(v | boolean-expression-with-v)
collection->reject(boolean-expression)

El resultado es una coleccin que contiene todos los elementos de
collection que no satisfacen boolean-expression
collection->reject(v : Type | boolean-expression-with-v)
collection->select(v : Type | not (boolean-expression-with-v))
Vegetti-Gonnet-Leone, 2012 - 83
Operacin collect
Permite especificar que una coleccin se deriva de otra coleccin.
Itera sobre la coleccin original, capturando en la nueva coleccin el
resultado de la evaluacin de la expresin.

collection->collect(v : Type | expression-with-v)
collection->collect(v | expression-with-v)
collection->collect(expression)

Cules son los ttulos de una biblioteca?
Vegetti-Gonnet-Leone, 2012 - 84
Operacin collect
self.ejemplar.pub->collect(titulo)
self.ejemplar.pub->collect(pub| pub.titulo)
self.ejemplar.pub->collect(pub:Publicacion| pub.titulo)
self.ejemplar.pub.titulo
collection.propertyname
self.ejemplar.pub->collect(titulo)->asSet()
collection->collect(propertyname)
Cules son los ttulos de
una biblioteca?
Vegetti-Gonnet-Leone, 2012 - 85
Operacin iterate
La operacin iterate es mas general.

collection->iterate(elem : Type; acc: Type= <expression> |
expression-with-elem-and-acc)
La variable elem es el iterator.
La variable acc es el acumulador, inicializado en el valor
<expression>
elem itera sobre los elementos de collection
La expresin expression-with-elem-and-acc se evala para cada
elem
Luego de cada evaluacin de expression-with-elem-and-acc, su
valor es asignado a acc.
Set{1,2,3}->iterate(i:Integer; sum: Integer = 0 | sum + i)
Vegetti-Gonnet-Leone, 2012 - 86
Ejercicio
Plantear una restriccin que garantice que todos los productos registrados
tengan cdigo nico.
Vegetti-Gonnet-Leone, 2012 - 87
Operacin exists
La operacin exists permite especificar una expresin que debe ser
cierta para al menos un objeto de la coleccin

collection->exists(v : Type | boolean-expression-with-v)
collection->exists(v | boolean-expression-with-v)
collection->exists(boolean-expression)
context Usuario::prestar(p: Publicacion, fecha: Date): Prestamo
pre: p.ejemplar->exists(e| e.enBiblioteca )
Vegetti-Gonnet-Leone, 2012 - 88
Operacin iterate
exists
source->exists(iterators | body) =

context Usuario::prestar(p: Publicacion, fecha: Date): Prestamo
pre: p.ejemplar->exists(e| e.enBiblioteca )
context Usuario::prestar(p: Publicacion, fecha: Date): Prestamo
pre: p.ejemplar->iterate(e; result: Boolean = false | result or
e.enBiblioteca)
source->iterate(iterators; result : Boolean = false | result or body)
Vegetti-Gonnet-Leone, 2012 - 89
Operacin iterate
forAll
source->forAll(iterators | body ) =

context Libro inv:
autor ->iterate(a; result : Boolean = true |
result and (a.nombre.size()>0 and a.apellido.size()>0))
context Libro inv:
autor->forAll(a| a.nombre.size()>0 and a.apellido.size()>0)
source->iterate(iterators; result : Boolean = true | result and body)
Vegetti-Gonnet-Leone, 2012 - 90
Operacin iterate select (Set)
select
source->select(iterator | body) =

context Publicacion def: ejemplaresDisponibles() : Set(Ejemplar) =
self.ejemplar->select(e| e.enBiblioteca)
context Publicacion def: ejemplaresDisponibles() : Set(Ejemplar) =
self.ejemplar->iterate(e; result: Set(Ejemplar) = Set{} |
if enBiblioteca then result->including(e) else result endif)
source->iterate(iterator; result : Set(T) = Set{}|
if body then result->including(iterator) else result endif)
Vegetti-Gonnet-Leone, 2012 - 91
Operacin iterate select (Bag)
select
source->select(iterator | body) =

context Biblioteca def: libros() :
Bag(Libro) =
self.ejemplar.pub->select(l|
l.oclIsTypeOf(Libro))
context Biblioteca def: libros() : Bag(Libro) =
self.ejemplar.pub->iterate(l; result:
Bag(Libro) = Bag{} | if l.oclIsTypeOf(Libro) then
result->including(l) else result endif)
source->iterate(iterator; result : Bag(T) = Bag{}|
if body then result->including(iterator) else result endif)
Vegetti-Gonnet-Leone, 2012 - 92
Otras operaciones predefinidas sobre iteradores
any
source->any(iterator|body) =
source->select(iterator | body)->asSequence()->first()

one
source->one(iterator|body) =
source->select(iterator | body)->size() = 1



Vegetti-Gonnet-Leone, 2012 - 93
Gua de Ejercicios OCL
Vegetti-Gonnet-Leone, 2012 - 94
Gua de Ejercicios OCL - Invariantes
I1) Todo monto que forma parte del salario debe ser positivo.
I2) Ningn empleado puede tener un salario mayor al de su jefe.
I3) Un Empleado debe ser mayor de 18 aos.
I4) Todo nombre de Empleado debe estar claramente registrado, no pudiendo
ser nulo.
Vegetti-Gonnet-Leone, 2012 - 95
Gua de Ejercicios OCL - Invariantes
I5) Todo salario de empleado debe poseer una y slo una componente de
salario bsico. En cambio puede poseer cero o ms componentes bonificables.
I6) Un empleado no puede ser gerente de ms de un departamento.
I7) Si el Empleado es Gerente entonces al menos posee una componente
bonificable en su salario de 2000 $.
I8) Todo empleado puede trabajar en ms de un departamento, pero con
distinto rol.
Vegetti-Gonnet-Leone, 2012 - 96
Gua de Ejercicios OCL Propiedades derivadas
D1) El salario de un empleado est conformado por un salario bsico ms
adicionales denominados bonificables, por lo cual, el salario se obtiene
sumando todos los montos de las componentes de su salario.
D2) La relacin entre empleado y jefe es derivable. Si un empleado trabaja en
un departamento, el gerente de tal departamento es el jefe del empleado.
D3) El nmero de empleados en un departamento es igual a la suma de
empleados que trabajan en l.
Vegetti-Gonnet-Leone, 2012 - 97
Gua de Ejercicios OCL Consulta
Q1) Obtener una consulta que permita conocer a todos los gerentes que son
jefes
Vegetti-Gonnet-Leone, 2012 - 98
Gua de Ejercicios OCL Pre/Postcondiciones
P1) Luego de ser ejecutada la operacin esCumple en la clase Empleado, la
edad debe haber sido incrementada en un ao.

P2) Un empleado puede incorporarse a un departamento (operacin reclutar) si
no trabaja ya en ese departamento. La operacin retorna una instancia de
TrabajaRol que vincula al empleado reclutado con el departamento.

También podría gustarte