Sei sulla pagina 1di 19

Object constraint language

OCL Version 2.3.1 - OMG An alisis y dise no de sistemas


Depto de Cs. e Ing de la Computaci on Universidad Nacional del Sur

Junio 2012

Qu e es OCL?
OCL (Object Constraint language) es un lenguaje. Puede verse como un agregado a la especicaci on 2.0 de UML. Provee una manera de expresar restricciones y l ogica sobre los modelos.

Ejemplo
En un modelo sobre empleados y sucursales de una empresa, podemos querer expresar algunas restricciones adicionales a las que el modelo permite expresar. la edad de una persona debe ser mayor a cero cada sucursal debe tener una secretaria cada 10 empleados el legajo de un empleado no puede ser un valor nulo

Es un lenguaje

Sintaxis, keywords No expresa ujo de control No modica (ejecuta) el modelo. Es un lenguaje query-only Sirve para expresar precondiciones, postcondiciones, invariantes, condiciones de guarda, resultados de la llamada a m etodos. Se pueden usar expresiones OCL virtualmente en cualquier lugar de los modelos UML, generalmente asociadas a un Clasicador. la evaluaci on de considera instant anea. Esto es, el clasicador asociado no cambia durante la evaluaci on de la expresi on

Ejemplo

responsable -> notEmpty() sueldo > 0

Profesor nombre : String sueldo : Integer 1 responsable

dicta 1..* cursosAcargo

Curso

Tipos b asicos
OCL predene tipos b asicos t picos Boolean (and, or, xor, not, implies, if-then-else) Integer (*, +, -, /, abs) Real (*, +, -, /, oor) String (concat, size, substring) Adem as, todo clasicador en UML es reconocido como un tipo en OCL. Por ejemplo si el modelo cuenta con la clase Curso, para OCL Curso es un tipo. OCL es fuertemente tipado, por lo tanto no se pueden comparar valores de un tipo directamente con valores de otro tipos. OCL soporta casting de objetos.

OCL sintaxis: Restricciones sobre clasicadores


Una expresi on OCL debe tener un Contexto denido donde evaluarse. Frecuentemente el contexto se determina seg un d onde se escribe la expresi on, por ejemplo con una nota asociada a un clasicador. Se puede hacer referencia al clasicador que determina el contexto utilizando del keyword self.

self.sueldo > 0

Profesor nombre : String sueldo : Integer

OCL sintaxis: Restricciones sobre clasicadores


Se pueden seguir las asociaciones entre clasicadores, y usar los end-names (roles) como si fuesen atributos del clasicador de origen.

Ejemplo
La siguiente puede ser una invariante denida en el contexto de la clase Curso: self.responsable.sueldo > 0
Profesor nombre : String sueldo : Integer dicta responsable Curso

cursosAcargo

Si el rol no est a especicado, se puede usar el nombre del clasicador. En el ejemplo anterior, ser a: self.Profesor.sueldo > 0

OCL sintaxis: Restricciones sobre clasicadores


A veces es necesario explicitar el contexto de una expresi on usando el keyword context. context Curso inv: self.responsable.sueldo > 0 En vez de usar el keyword self se puede asignar un nombre al clasicador context p: Profesor inv: p.sueldo > 0 Tambi en se puede nombrar la expresi on con una etiqueta context p: Profesor inv SueldoMayorACero: p.sueldo > 0

OCL sintaxis: Ejemplo


En lo que sigue consideramos el siguiente modelo UML

Instituto nombre : String arancel : float fechaFundacin : Date

0..* Titulo : String pre-req nivel : Int 1..*

Curso

registrarAlumno(s : Alumno) : Boolean getAlumnosDestacados() : Alumno[0..*] 1..* 0..1 Alumno promedio : float fechaNac : Date 1 aoGraduacion : int arancelPagado : Boolean edad : int aoIngreso : int

cursos Profesor nombre : String sueldo : float 0..1 responsable alumnos

OCL sintaxis: Restricciones sobre operaciones

Las expresiones OCL pueden asociarse a las operaciones para capturar pre y post condiciones, utilizando los keywords pre y post respectivamente. Para hacer referencia al resultado de una operaci on, en una expresi on de poscondici on se utiliza el keyword result Al igual que con las invariantes se puede dar un nombre a las expresiones. context Curso::registrarAlumno(a: Alumno): Boolean pre yaPagoArancel: a.arancelPagado = true post registracionExitosa: result = true

OCL sintaxis: Restricciones sobre atributos

Se pueden expresar restricciones especiales sobre los atributos de un calicador. Por ejemplo, el valor inicial de un atributo, o la forma de derivar (calcular) su valor. context Instituto::arancel:float init: 2500.00 context Alumno::edad:int derive: ...

OCL sintaxis: Restricciones sobre atributos

Se puede utilizar el keyword @pre para referenciar el valor de un elemento antes de la ejecuci on de una operaci on context Contador::incrementar():void post: self.count = self.count@pre + 1

OCL: Otros constructores


Expresiones booleanas if-then-else-endif context Alumno if arancelPagado = true then a~ noGraduaci on = a~ noInicio+5 else a~ noGraduaci on = 0000 Reglas l ogicas de OCL True OR False AND cualquier cosa cualquier cosa es true es false es true

False IMPLIES

cualquier cosa

context Alumno inv: self.promedio < 1.0 IMPLIES self.a~ noGraduaci on=0000

OCL: Otros constructores


Declaraci on de variables y expresiones let Se pueden declarar variables en expresiones let, indicando su tipo y su valor, para construir expresiones m as complejas. context Curso inv: let salario:float = self.responsable.sueldo in if self.nivel > 400 then salario > 80000.00 else salario < 80000.00 endif

OCL: Otros constructores

Se pueden declarar variables en un contexto para reutilizarlas en cualquier expresi on dentro del contexto. context Curso: def salario:float = self.responsable.sueldo context Curso inv: if self.nivel > 400 then salario > 80000.00 else salario < 80000.00 endif

OCL: Colecciones
Las colecciones representan muchas instancias de un clasicador. Soportan operaciones select() y reject() cuyo resultado es tambi en una colecci on. La invocaci on de una operaci on sobre una colecci on se denota con una echa (->) COLECCION -> select ( EXPRESION-BOOLEANA ) COLECCION -> reject ( EXPRESION-BOOLEANA ) context Curso::getAlumnosDestacados(): Alumno[0..*] body: self.alumnos -> select(promedio>5) context Curso::getAlumnosDestacados(): Alumno[0..*] body: (self.alumnos -> select(promedio>5)) -> reject(arancelPagado=false) Obs: el keyword body se utiliza para especicar el resultado de una operaci on de consulta (query operation).

OCL: Colecciones

En los ejemplos anteriores, el contexto de las operaciones select y reject, pueden explicitarse, dando un nombre y un tipo al elemento que conforma el resultado.

context Curso::getAlumnosDestacados(): Alumno[0..*] body: self.alumnos -> select(e:Alumno | e.promedio>5)

Hay adem as otras operaciones sobre colecciones forAll - exists - isEmpty - notEmpty

OCL: Colecciones

context Curso inv: self.alumnos -> exists(e:Alumno | e.arancelPagado = true) context Curso inv: self.alumnos -> forAll(e:Alumno | e.arancelPagado = true)

context Instituto inv: self.Curso -> notEmpty

Referencias

1. OMG Object Constraint Language (OCL) http://www.omg.org/spec/OCL/2.2/ 2. UML 2.0 in a Nutshell - Dan Pilone, Neil Pitman - 2005 / Appendix B. The Object Constraint Language 3. Learning UML 2.0 - Russ Miles, Kim Hamilton - 2006 / Appendix A. Object Constraint Language

Potrebbero piacerti anche