Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
self.sueldo > 0
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
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
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
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: ...
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
False IMPLIES
cualquier cosa
context Alumno inv: self.promedio < 1.0 IMPLIES self.a~ noGraduaci on=0000
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.
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)
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