OCL Internet
OCL Internet
de la Laguna a Objetos
Lenguaje de expresión
El OCL es un lenguaje de expresión puro. Por lo tanto, garantiza que una expresión OCL
no tendrá efectos colaterales; no puede cambiar nada en el modelo. Esto significa que el estado
del sistema no cambiará nunca como consecuencia de una expresión OCL, aun cuando una
expresión OCL puede usarse para especificar un cambio de estado, por ejemplo, en una post-
condición. Todos los valores, de todos los objetos, incluyendo todos los enlaces, no cambiarán,
cuando una expresión OCL es evaluada, simplemente devuelve un valor.
Lenguaje de modelado
Lenguaje Formal
El OCL ha sido desarrollado para cubrir esa brecha. Es un lenguaje formal, fácil de leer y
escribir. Ha sido desarrollado como un lenguaje de modelado para negocios dentro de la división
Seguros de IBM, y tiene sus raíces en el método Syntropy.
Dentro del documento Semántica del UML, el OCL es usado en la sección reglas bien
formuladas, como constantes estáticas sobre las meta-clases en la sintaxis abstracta. En varios
lugares también es usado para definir operaciones ‘adicionales’, que son tomadas en cuenta en la
formación de reglas.
Laberinto
Borde
1 Contiene
Tiene 1
*
Pacman Fantasma
Posicion : entero = 0 Posicion : entero = 0
Puntos : entero = 0 Valor : entero = 10
Vida : entero = 3
Velocidad : entero = 20 1 4
Camina_Fantasma(Posicion)
Aparece_Fantasma(Posicion)
Aparece_Pacman(Posicion) Come
Cambia_ Direccion(Fantasma,Posicion)
Camina_Pacman(Posicion) Cambia_Color(Fantasma)
Come_Pildora(valor)
Aumenta_Velocidad(vel)
Come_Pildora_M(Valor,Posicion)
Come_Fantasma(Valor)
Come_Fruta(Valor)
Figura # 2
self: Cada expresión OCL está escrita en el contexto de una instancia de un tipo en
particular. En una expresión OCL el nombre self es usado para referirse a dicha instancia.
Características Estáticas: Una expresión OCL puede ser parte de una característica
estática, que es una Restricción estereotipada con «invariant». Cuando una Característica
estática está asociada a un Clasificador, la expresión es una invariante del tipo, y debe ser
verdadera para todas las instancias de ese tipo, en todo momento. Si el contexto es
Pacman, entonces self se refiere a una instancia de Pacman. En la expresión
self.Posicion
Pre y Post-condiciones:
• un Atributo,
• un Extremo de Asociación,
• una Operación con isQuery en verdadero,
• un Método con isQuery en verdadero
Propiedades
El valor de una propiedad para un objeto que está definido en un diagrama de clases se
especifica con un punto seguido del nombre de la propiedad:
UnTipo
self.propiedad
Propiedades: atributos
El valor de esta expresión es el valor del atributo vida para Pacman. El tipo de esta expresión es el
tipo del atributo vida, que es del tipo básico Entero.
Propiedades:operaciones
unPacman.Camina_Pacman(Posición)
El valor de esta expresión es el conjunto de objetos que están del otro lado de la
asociación nombreDeRol. Si la multiplicidad del extremo de la asociación tiene un máximo de uno
(“0..1” o “1”), entonces el valor de la expresión es un objeto. En el diagrama de clases del ejemplo,
si empezamos en el contexto de Pacman (self es una instancia de Pacman), podemos escribir :
Pacman
self.Come -- es de tipo Set(Fantasma)
El ejemplo aplica la propiedad tamaño al Set self.Come, que da como resultado el número de
Fantasmas que come Pacman.self
Pacman
self.Come->esVacio
Este ejemplo aplica la propiedad esVacio al Set self.Come. El resultado es verdadero si el conjunto
de Fantasmas es vacío, y falso si no lo es.
Para especificar la navegación en asociaciones como clase, OCL usa el punto y el nombre
de la asociación como clase comenzando con minúscula. Las asociaciones como clase no tienen
un nombre de rol específico en el diagrama de clases.
Se puede navegar desde la asociación como clase hacia el objeto que participa en la
asociación. Esto se hace utilizando el punto y el nombre de rol del extremo de la asociación.
La navegación desde una asociación como clase a uno de los objetos de la asociación
siempre entregará exactamente un objeto. Este es el resultado de la definición de una asociación
como clase. Por lo tanto el resultado de esta navegación es exactamente un objeto, aunque
también puede usarse como un Conjunto utilizando la flecha (->).
Expresiones generales
Cualquier expresión OCL puede ser usada como valor para un atributo en una expresión
de una clase del UML o sus subtipos. En este caso, el documento Semántica del UML describe el
significado de la expresión.
Se define dentro del OCL los tipos de datos básicos, así como las operaciones que pueden
realizar, los cuales son mostrados en la siguiente tabla:
• Real
• Entero
• Cadena
• Boolean
Real:
En OCL el tipo Real representa el concepto matemático de Real. Tome en cuenta que Entero es
subclase de Real, por lo tanto en cada parámetro de tipo Real, puede usar un Entero.
Características de Real, una instancia de Real es llamada r.
Operación Interpretación
Tabla # 2
Integer:
Operación Interpretación
Tabla # 3
String:
Operación Interpretación
string.substring (lower : Integer, upper : Integer) El substring de string que comienza en la letra
: String número inferior, hasta la letra número superior
inclusive.
string.concat(string2 : String) : String La concatenación de string y string2.
Post: result.size = string.size + string2.size
Tabla # 4
Boolean
Operación Interpretación
Tabla # 5
Los tipos básicos usados son Integer, Real, String, y Boolean. Son suplementados con
OclExpression, OclType y OclAny.
OclType:
Todos los tipos definidos en un modelo UML, o predefinidos dentro del OCL tienen un tipo. Este
tipo es una instancia del tipo OCL llamado OclType. El acceso a este tipo le permite al modelador
acceder al meta-nivel del modelo. Esto puede ser útil para modeladores avanzados.
Características de OclType, una instancia de OclType es llamada type.
Operación Interpretación
Tabla # 6
OclAny:
En el contexto del OCL, el tipo OclAny es el supertipo de todos los tipos del modelo. Las
características de OclAny están disponibles para cada objeto en todas las expresiones OCL.
Todas las clases en un modelo UML heredan todas las características definidas para OclAny. Para
evitar conflictos de nombres entre características del modelo y características heredadas de
OclAny, todos los nombres de las características de OclAny comienzan con ‘ocl’. De todas
maneras, teóricamente aún podrían existir conflictos de nombres, pero pueden evitarse usando las
construcciones con caminos para referirse explícitamente a las propiedades de OclAny.
Características de OclAny, una instancia de OclAny es llamada object.
Operación Interpretación
Tabla # 7
OclExpression:
Operación Interpretación
Dentro de los tipos predefinidos para OCL también se encuentran las Colecciones que
juegan un rol muy importante en las expresiones OCL debido a que una navegación frecuente da
como resultado una Colección.
TIPO EJEMPLO
SET Set { 1, 2, 5, 8 }
Tabla # 9
A continuación se describe una lista completa de las operaciones de Collection y sus subtipos.
Collection:
Operación Interpretación
Tabla # 10
Set:
Operación Interpretación
Tabla # 11
Bag:
Una bag es una colección en la que los duplicados están permitidos. Esto es, un objeto puede ser
un elemento de una bag muchas veces. No hay un orden preestablecido para los elementos de
una bag.
Características de Bag, una instancia de Bag es llamada bag.
Operación Interpretación
bag = (bag2 : Bag) : Boolean Verdadero si bag y bag2 contienen los mismos
elementos, la misma cantidad de veces.
post: result = T.allInstances->forAll(elem |
bag->count(elem) = bag2->count(elem))
Tabla # 12
Sequence:
Una sequence es una colección donde los elementos están ordenados. Un elemento puede ser
parte de una sequence más de una vez.
Características de Sequence(T), una instancia de Sequence es llamada sequence.
Operación Interpretación
Tabla # 13