Escolar Documentos
Profissional Documentos
Cultura Documentos
OCL
Revisão e Exercícios
Objetivos da aula
Revisão de conceitos sobre OCL
OCL (Object Constraint Language) é um
linguagem criada para fornecer uma precisão
maior na especificação da UML
OCL é uma linguagem textual para definição de
restrições em modelos.
Ela é baseada em teoria de conjuntos e lógica de
predicados.
Exercícios sobre OCL
2
OCL - Contexto
Apesar do poder de expressão da UML, há
propriedades e restrições de softwares que
são muito complexas ou impossíveis de
serem expressadas em um diagrama
adequadamente por meio de uma
representação exclusivamente iconográfica.
Mesmo os mecanismos de extensão da UML
– estereótipos (stereotypes), valores
rotulados (tagged values) e restrições
(constraints) pré-definidas – podem ser
insuficientes nesse sentido.
3
OBS:
Usar multiplicidades não é suficiente para
representar essa regra:
a multiplicidade ‘0..*’ da associação entre as
classes Flight e Person, próximo à Person, não
é capaz de refletir essa restrição, dado que o
número de lugares dos aviões pode variar para
cada avião.
5
Solução em OCL.
Como um projetista de software poderia representar no
diagrama, que o número máximo de passageiros (papel
passengers) em um vôo (classe Flight) é limitado pela
capacidade do avião respectivo (classe Airplane, atributo
numberOfSeats)?
Em OCL:
self.passengers → size() <= self.plane.numberOfSeats
6
OCL - considerações
Em expressões OCL é possível a navegação entre
as classes de um modelo UML, a partir de uma
classe-base, que fornece o contexto da expressão.
para acessar um atributo ou operação, navega-se pelas
associações utilizando o operador “.”;
Para acessar propriedades de uma coleção – que pode
ser definida pelas instâncias de uma classe, ou pelas
instâncias ligadas (por associação no modelo) a uma
Explicando OCL
self.passengers → size() <= self.plane.numberOfSeats
O contexto de navegação é uma instância de Voo (Fight).
Navega-se do contexto (self) até o alvo da associação (papel
passengers);
como sua multiplicidade é ‘*’, esse sentido da associação aponta para
uma coleção de elementos (neste caso, um conjunto);
para acessar uma das propriedades dessa coleção, utiliza-se o operador
“→”.
A operação executada (size()) retorna o número de elementos
dentro da coleção, na forma de um inteiro (tipo OCL Integer).
Para a avaliação do lado direito, navega-se do contexto (self)
em direção ao alvo da outra associação (papel plane);
como sua multiplicidade é ‘1’, esse sentido da associação aponta para
um único elemento (operador “.”), cujo atributo pode ser recuperado
(numberOfSeats), retornando-se um inteiro.
Por fim, efetua-se a comparação entre os inteiros obtidos em
ambos os lados da expressão. 8
OCL
Object Constraint Language
definições e
conceitos envolvidos
OCL
OCL é uma notação da UML utilizada para
definir restrições sobre objetos.
10
OCL - Características
expressões especificadas em OCL não têm qualquer
efeito colateral, ou seja:
• não causam mudança no estado do objeto
• não causam modificações nos modelos
• não alteram o fluxo de controle
OCL é formal:
• sintaxe bem definida
• semântica precisa, sem ambigüidades
OCL também pode ser usada para navegar através das associações 11
OCL: Invariante
Invariante é uma condição associada a uma
classe (ou tipo ou associação, ...)
Deve ser satisfeita a cada instante
O contexto é definido por um objeto o qual
• pode ser referenciado por self
• pode ser nomeado explicitamente
A invariante pode ter um identificador
14
OCL: Exemplos de invariantes
Cliente
context Cliente idade: Integer
inv: idade > = 18 and self.idade < 100 casado: Boolean
15
invariantes de atributos
conectados através de associações:
referência: objeto.papel
o valor da expressão pode ser:
1 objeto, se a multiplicidade da associação é 0..1 ou 1
– ex.: self.gerente (é do tipo Empregado)
1 coleção de objetos, se a multiplicidade > 1 (*)
– ex.: self.subordinado ( é do tipo conjunto {Empregado} )
17
18
Exemplos de pré e pós condições
faz_aniversario()
20
OCL: Guarda
Guarda é condição que deve ser satisfeita para que
uma transição do modelo de estados (Statecharts)
ocorra.
pré condição para a execução da transição
Representar a restrição da guarda entre { e }
21
22
Expressões em OCL
– constante
– identificador
– self
– expr op expr
– exprobj.propriedadeobj (parâmetros)
– exprcoleção.propriedadecoleção (parâmetros)
– pacote :: pacote :: elemento
– if condição then expr else expr endif
– let variável : tipo in expr
Obs.: propriedade em OCL pode ser: atributo, operação,
método, extremidade de associação
23
Sobre expressões
Toda expressão tem um tipo de dado e um valor
Constantes e identificadores podem ser usados em expressões
ex.: 12
nome
salário
Uma expressão é referente a um elemento (contexto)
Reais (Real)
– valores: 1.5, 1.3456
– operações: +, -, *, /, floor, round, max, min
25
26
Tipos e operações com String
Cadeia de caracteres (String)
– valores delimitados por ‘ ’
Ex: “uma sentença”
– operações:
cadeia.size( )
cadeia1.concat(cadeia2)
cadeia1.substring(posição1, posição2)
cadeia.toUpper( )
cadeia.toLower( )
27
28
Tipos e operações com Coleções
Em OCL pode-se ter 3 tipos de coleção:
conjunto (set): sem repetição, desordenado
ex.: set {1, 6, 90, 2, 0}
29
30
Operações sobre coleções
Operações básicas:
union(), intersection(), ...
Operações de filtragem:
– seleção e eliminação de acordo com uma condição:
select(), filter()
Quantificadores:
forAll (), exists()
Determinação de unicidade:
isUnique() 31
32
Coleção: filtragem
Seleção de elementos que satisfazem a uma
condição: coleção -> select(cond)
ex.:
self.empregado -> select (idade>55 and sexo = #masculino)
enum{masculino,
enum{masculino, feminino}
Outra sintaxe:
self.aluno -> reject (p:Pessoa | p.cidade_origem <> ‘Campinas’)
33
Coleção: imagem
Corresponde à imagem de um função em
matemática: coleção -> collect (expr)
– a expressão é avaliada para cada elemento da coleção
– o retorno da avaliação é um “saco” com os resultados
Ex.:
self.empregados -> collect (idade) ► Bag{22, 37, 25, 22, 44, 52}
self.empregados -> collect (idade) -> asSet() ► obtém o conjunto
self.empregados -> collect (salário) -> sum()
34
Coleção: Quantificadores
Pode-se usar os quantificadores: ∀ e ∃
Ex.:
self.empregados -> forAll (idade < 55)
36
Operações relativas ao diagrama de classes
OCL oferece várias operações sobre o
diagrama de classes:
acesso a atributos e métodos
• acesso a um atributo: objeto.atributo
– ex.: self.anodeProdução
self.idade
acesso a método: objeto.método(expr1, expr2, ...)
ex.: self.calcula_media(turma00)
Pessoa
self.marido -- é do tipo Pessoa
self.empregador -- é do tipo Set (Empresa)
self.marido -> notEmpty() implies self.marido.sexo = #masc
not ( (self.mulher -> size() = 1 and (self.marido -> size() = 1) )
39
40
Navegação para uma associação
Se a associação (classe) é reflexiva, pode-se
indicar o papel para evitar ambigüidade:
objeto.nome_da_associação [papel]
Pessoa:
self.casamento [mulher].local
41
42
Navegação através de associação qualificada
Associações qualificadas usam 1 ou + atributos para
selecionar objetos na outra ponta da associação
Para navegar através dela, pode-se indicar um valor para o(s)
atributo(s) usado(s) como qualificador(es): objeto.papel [valor]
Banco:
self.cliente -- Set(Pessoa)
self.cliente [4001155] -- 1 objeto Pessoa com nro de conta dado
43
Conta
id : Integer
saldo: Real = 0
dono
conta Cliente
id
deposito(valor : Real) * 1
levantamento(valor : Real)
daSaldo() : Real
cliente.conta [4321]
Ou
44
“Navegação” em associações qualificadas
Conta
id : Integer
saldo: Real = 0 conta dono
Cliente
* 1
deposito(valor : Real)
levantamento(valor : Real)
daSaldo() : Real
Expressão incorreta
Expressão correta
cliente.conta.saldo = 0
45
Exercícios resolvidos
46
Q1
O sistema em questão trata de uma loja virtual, tipo “carrinho de compras”,
para venda de produtos.
Qual a expressão OCL que representa a restrição:
“um novo item de produto foi adicionado ao carrinho de compras”?
RESPOSTA:
ou
itemProduto = ItemProduto.new()
self.addToCarrinhoCompras(itemProduto)
// considerando que “carrinhoCompras” é uma associação temporária
no sistema.
47
Q2
qual a expressão OCL que representa a restrição:
“foi destruído um item de produto do carrinho de
compras, cujo nome do produto = prodC”?
Obs: “nome do produto” é o atributo “nome” de ItemProduto
RESPOSTA
→select(nome=prodC)
itemProduto = self.carrinhoCompras→
ou
self. carrinhoCompras → excluding (nome=prodC) 48
Q3
O valor do “itemProduto” foi alterado para
R$ 10,00.
RESPOSTA:
self.itemProduto.valor = 10.0
49
Q4
Qual das expressões OCL abaixo melhor representa a
seguinte pós-condição: “o salário de todos os
funcionários que ganham menos de R$ 1000,00 foi
reajustado em 10%” ?:
a) self.funcionários → select (f | f.salario@pre < 1000 implies
f.salario@pre = f.salario * 1.1)
b) self.funcionários → forAll (f | f.salario@pre < 1000 implies
f.salario@pre = f.salario * 1.1)
c) self.funcionários → collect (f | f.salario@pre < 1000 implies
f.salario = f.salario * 1.1)
d) self.funcionários → collect (f | f.salario < 1000 implies
f.salario@pre = f.salario@pre * 1.1)
e) self.funcionários → forAll (f | f.salario@pre < 1000 implies
f.salario = f.salario@pre * 1.1)
50
Q6 cliente
51