Вы находитесь на странице: 1из 12

Introducción (1/5)

OCL: Object Constraint


Language Características
• Fácil de usar
– Legible y escribible por una amplia audiencia
Prof. Dr. Daniel Riesco
• Lenguaje de expresión pura
– Libre de efectos colaterales

• Lenguaje de Especificación
– Declarativo e independiente de la plataforma

• Preciso
1 3
.

Introducción Introducción (2/5)


Características
• Usado para construir modelos exactos • Lenguaje formal.
UML
• No es un lenguaje de programación (no hay flujo
– Lenguaje pequeño de control).
– Tipos Simples built-in • No se puede invocar procesos.
– Tipos de Colecciones
– Usa elementos del modelo

2 4
Introducción (3/5) Introducción (5/5)
• Con propósito de documentación
• OCL para expresiones de navegación
• Usado para verificación formal
• Usado para generación de testcases
context Copy
• Usado para chequeo en tiempo de ejecución inv: self.copyOfBook.authorsOfBook->size() > 0
– Puede producir excepciones
– Diseño por contrato
• Pre- and post-condiciones Copy copyOfBook Book authorsOfBook Author
1 *

5 7

Introducción (4/5) Conceptos Básicos


Context
• Propósito
Las expresiones OCL se escriben en el contexto
– especificar invariantes
de una instancia de un tipo específico
– especificar pre y post condiciones
– inicialización de código context Copy
– como lenguaje de navegación
Self
La palabra reservada “self” se refiere a la
instancia contextual
6 8
Conceptos Básicos Propiedades
• Tipos válidos tienen asociados propiedades.
• Tipos básicos:
– Boolean: and, or, not, implies, if-then-else
– atributos,
– Integer: *, +, /, abs, mod, min, max, ... – asociaciones finales,
– Real: *, +, /, floor, <, ... – métodos y operaciones sin efectos colaterales
– String: toUpper, concat, size, substring(i:integer, s:integer),...
• Tipo Collection (Set, Ordered-Set, Bag, Sequence)
• Tipos válidos
Clasificadores de diagramas UML (interfaces, tipos de datos,
componentes, nodos, casos de uso y subsistemas)

9 11

Expresiones Básicas Propiedades


• Expresiones formales básicas (atómicas): • un extremo
extremo de una asociación (AssociationEnd)
<type> . <attribute>
attribute>
– Toda asociación en el modelo es un camino de navegación

<type> puede ser: – El contexto de la expresión es el punto de comienzo


- objeto, – Los nombres de roles son usados para identificar el
- clase, camino de navegación.
- implícito • AssociationEnd
– cardinalidad 1 -> retorna un objeto o un set de un elem.
– cardinalidad n -> retorna un set
– cardinalidad n {ordered} -> retorna una sequence

10 12
OMG

Invariante
Pre y PostCodiciones
• Context <clasificador> inv: <exp-bool>
Se aplican tanto a Métodos como a Operaciones.

Context <clasificador>
<nombreDeTipo>::<nombreDeOperación>(<parametro1> :
<Tipo1>, ... ): <TipoDevolución>

pre : …

post: result = ...

13 15

OMG

Invariante – Clase Asociativa


• Context Person : se usa el punto y el nombre de la asociación
Pre y PostCodiciones
• Context Job : hacia los objetos que participan

context Company::edades():Set(Integer)

14 post: result=16self.employee.age
OMG

Ejemplo
Pre y PostCodiciones
• Ejemplo:
– Clase Cuenta del modelo de cuentas bancarias
• El campo balance almacena el balance
– Métodos despositar/extraer
context Cuenta::depositar(int cant)
pre: cant >= 0
post: balance = balance@pre + cant

context Cuenta::extraer(int cant)


pre: cant >= 0 and balance >= cant
post: balance = balance@pre - cant
17 19

OMG

Tipo Collection collect


• Operaciones:
– collection->select(v : type | boolean-expr-with-v)
– collection->reject(v : type | boolean-expr-with-v)
– collection->collect(v : type | expr-with-v)
– collection->forAll(v : type | boolean-expr-with-v)
– collection->exists(v : type | boolean-expr-with-v)
• Otras operaciones son:
– isEmpty : verdadero si la colección no tiene elementos
– notEmpty : not isEmpty
– size : el número de elementos de la colección
– count(elem) : número de ocurrencias de elem en la
colección
– include(elem) : verdadero si elem está en la colección
– exclude(elem) : not include(elem)
– includeAll(col) : verdadero si todos los elementos de col
están en la colección
– sum : suma los elementos de la colección
18 (debe poder 20
aplicarse el operador +)
OMG OMG

select exists

21 23

OMG

forAll Set
• set->union(set2 : Set(T)) : Set(T)
• set->union(bag : Bag(T)) : Bag(T)
• set->intersection (con set and bag)
• set->including(obj : T) : Set(T) (Agrega obj a set)
• set->excluding(obj : T) : Set(T) (Elimina obj a set)
• set->symmetricDifference(set2 : Set(T)) :Set(T)
• set->asSequence : Sequence(T) (orden aleatorio)
• set->asBag : Bag(T)
• Y todas las heredades de collect
=, -, select, reject, collect

22 24
OMG

Bags and Sequences Restricciones


• Operaciones de una bolsa (Bag)
– =, union, intersection, including, excluding, select, reject,
collect, count, asSequence, asSet

• Operaciones de una Secuencia (Sequence)


– count, =, union (es una concatenación), append (agrega
el obj al final), prepend (agrega obj al principio),
subSecuence(lower:integer, upper:Integer), at(i :Integer),
first, last, exlcuding (quita todas las ocurrencias de obj),
select, reject, collect, iterate, asBag, asSet

25 27

OMG

Atributos y Relaciones Derivadas


Otras propiedades

• Valor previo en postcondición: nbreAtrib@pre


• OclType
context Person inv: -- oclType

self.oclType = Person

26 28
Principio de Sustitución de Liskov Ejemplos - Invariantes
• “En cualquier lugar que una instancia de una clase es
esperada, uno puede siempre sustituirla por cualquiera de
sus subclases”
• Consecuencias para los invariantes:
– Un invariante es siempre heredado por cada uno de las subclases
donde dicho invariante es ubicado
– Las subclases pueden fortalecer dicho invariante

• Consecuencias para las pre y post condiciones


– Una precondición puede ser más débil -- Una compañía tiene al menos 50 empleados
– Una poscondición puede ser más fuerte context Company inv:
self.employee->size <= 50

29 31

OMG

Ejemplos - Invariantes Ejemplos - Invocación de Métodos

-- Las personas casadas son mayores de edad


context Person inv:
self.wife->notEmpty implies self.wife.age >= 18 and
self.husband->notEmpty implies self.husband.age >= 18
30 32
Ejemplos Ejemplos - Precondiciones
context Crate::addBottle( b : Bottle )
Bottle
Crate -- there must be room in the crate
capacity : Integer capacity : Integer
contents : Integer 0..1
maxWeight : Integer
pre:
pre: bottles->size() < capacity
0..*
weight : Integer maxDiameter : Integer
diameter : Integer bottles crate
totalWeight() : Integer
neckDiameter : Integer
addBottle(b : Bottle) -- the maximum weight for the crate may not be exceeded
totalWeight() : Integer
0..* crates
bottle 0..1 pre:
pre: totalWeight() + b.totalWeight() <= maxWeight
0..1 pallet
cap 0..1 -- the bottle is not in the crate
Pallet
Cap 0..* capacity : Integer pre:
pre: not bottles->includes( b )
innerDiameter : Integer maxWeight : Integer
/ caps
weight : Integer totalWeight() : Integer -- ‘b’ is added to the collection of bottles
addCrate(c : Crate) post:
post: bottles = bottles@pre->including(b)
33 35

Ejemplos -
Ejemplos - Invariantes Valores Iniciales y Derivaciones

context Crate -- The caps in a pallet are derived:


-- the number of bottles may not exceed its capacity context Pallet::caps
inv: bottles->size() <= capacity
derive: crates.bottles.cap->asSet()
-- each bottle must fit in the crate
inv: bottles->forAll(diameter < maxDiameter)
-- the total weight must be less than the maximum context Bottle::contents
inv: totalWeight() <= maxWeight
init: 0
34 36
Invariantes de Estado Guardas

context Bottle
open Bottle
state Closed inv: contents = capacity capacity : Integer
contents : Integer
weight : Integer
open Bottle close [ contents=capacity ] diameter : Integer
capacity : Integer neckDiameter : Integer
contents : Integer totalWeight() : Integer
weight : Integer
diameter : Integer closed
neckDiameter : Integer
totalWeight() : Integer
closed

37 39

OMG

OCL en un Diagrama de Estado:


operación oclInState Pre/Postcondiciones -
Casos de Uso

• Un caso de uso puede ser visto como una


“función del sistema”.
• Los supuestos y resultados de un caso de
uso pueden ser especificados en OCL.

38 40
Componentes Queries

• Especificados por una o mas interfases • OCL es un “Query Language” (lenguaje de


consulta)
Operaciones con pre- y postcondiciones
– El poder expresivo >= SQL
– Invariantes en los objectos descriptos por la • David Akehurst, Canterbury University
interfase
• Mostrar las reglas de negocio para el • Boldsoft
componente – Usa OCL exclusivamente como lenguaje de consulta

• Las consultas pueden ser definidas a nivel de


modelo
41 43

Ejemplos del Metamodelo


Body
“body” define una operación de consulta que
puede ser especificada en OCL

context Bottle::totalWeight() : Integer


body: weight + cap.weight

context Crate::totalWeight() : Integer


body: weight + bottles.totalWeight()->sum()
42 44
Ejemplos del Metamodelo
• Asociación
– Los finales de asociación deben tener un nombre
único dentro del final de Asociación.
– A lo sumo un final de asociación puede ser una
agregación o composición.

• Final de Asociación
– El clasificador de un final de asociación no
puede ser un DataType ni una Interface.
– Una instancia es de composición no puede
pertenecer a más de una instancia compuesta.

• Clasificador
– No puede haber dos métodos con la misma
signatura.
– No puede haber dos atributos45 con el mismo nombre

OMG

Herramientas & Referencias

46

Вам также может понравиться