Author
elliando-dias
View
2.472
Download
0
Tags:
Embed Size (px)
Eliane Martins - Instituto de Computação - UNICAMP
OCL: ObjectConstraint Language
Setembro 2003
2Eliane Martins - Instituto de Computação - UNICAMP
Referências
• UML. “Object Constraint Language Specification”. Versão1.1, set/1997
• “OCL: Object Constraint Language”. Transp de curso deJean-Marie Favre.
• “Object Constraint Language (OCL)”. Transp de curso deArif Khan.
3Eliane Martins - Instituto de Computação - UNICAMP
Tópicos
• O que é
• Tipos de restrições
• Expressões
• Tipos e operações
4Eliane Martins - Instituto de Computação - UNICAMP
OCL: Object Constraint Language
• Notação da UML utilizada para definir restrições sobreobjetos
• Permite especificar 4 tipos de restrições:– invariantes de classe, pré e pós condições de métodos, guardas (de
transições)
• 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
5Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Características (cont.):– OCL é fortemente tipada:
• toda expressão tem um tipo• termos usados na expressão têm de ser usados de acordo com seu tipo
– ex.: não se pode usar valor inteiro onde se espera um tipo string
– OCL é uma linguagem para especificação, não de programação– OCL é formal:
• sintaxe bem definida• semântica precisa, sem ambigüidades
– OCL também pode ser usada para navegar através das associações
6Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Tipos de restrições:– Invariantes (inv)
• condição (ou predicado) que se aplica a TODAS as classes (ou tipo ouinterface ou associação ou ...)
– Pré-condição (pre)• condição que deve ser satisfeita antes da execução de uma operação
– Pós-condição (post)• condição que deve ser satisfeita após a execução de uma operação
– Guarda• condição que deve ser satisfeita para que uma transição de estado seja
efetuada
7Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Contexto– elemento ao qual é uma restrição associada
• invariante: o contexto é a classe.• Guarda: o contexto é uma transição do modelo de estado
– a restrição pode ser associada ao contexto de váriasformas:
• utilizar anotação em UML• descrever na forma de texto:
– uso da palavra reservada context– uso da palavra reservada self
8Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Invariante– 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
– uma invariante pode ter um identificador
9Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Exemplos de invariantes: context Clienteinv: idade > = 18 and self.idade < 100
context c: Clienteinv CasamentoLegal: c.casado implies c.idade > = 21
Identificador da invariante
objetoatributo
10Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Invariantes sobre associações:– 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 daassociação é 0..1 ou 1ex.: self.gerente -- é do tipo Empregado
– 1 coleção de objetos, se a multiplicidade>1ex.: self.subordinado -- é do tipoconjunto {Empregado}
� coleções serão abordadas mais parafrente
Empregado
nome: stringidade: integercasado: boolean 1
gerente
subordinado *
11Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Pré e pós condições– condições (ou predicados) associadas a uma operação– as pré condições devem ser satisfeitas antes da execução da
operação– as pós condições devem ser satisfeitas após a execução da
operação– self pode ser usada para designar o objeto cuja operação foi
chamada– result pode ser usada para designar o resultado– @pre permite fazer referência ao valor de um operando antes da
execução da operação
12Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Exemplos de pré e pós condições:context Pessoa :: faz_aniversario ( )post: idade = [email protected] + 1
context Calculadora :: divisão_inteira (x:Integer, y: Integer)pre regraDivisor: y ≠0post: result = x / y
13Eliane Martins - Instituto de Computação - UNICAMP
OCL
• 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
pilha não vazia
pilhacheia
pilhavazia
cria ( )
insere (item )
insere (item) {self.nroItens = Max}
insere (item) {self.nroItens < Max}
14Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Tipos– tipos básicos: Integer, Real, Boolean, String– tipos enumerados– tipos provenientes da UML: classes, associações,
generalizações– tipos compostos: Set, Bag, Sequence
15Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Expressões– 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 exprObs.: propriedade em OCL pode ser: atributo, operação, método, extremidade de
associação
16Eliane Martins - Instituto de Computação - UNICAMP
OCL
• Sobre as expressões:– toda expressão tem um tipo 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)– . permite o acesso a uma propriedade (atributo ou operação) de um objeto
ex.: self.salário - 100 self.calculaImposto(2003)– -> permite o acesso a uma propriedade de uma coleção de objetos
ex.: self.dependentes->size self.dependentes->isEmpty– :: permite o acesso a elemento de um pacote
ex.: seja B subclasse de Aself.A :: p1 -- acesso a propriedade p1 definida em Aself.B :: p1 -- acesso a propriedade p1 definida em B
17Eliane Martins - Instituto de Computação - UNICAMP
OCL - Tipos e operações
• Inteiros (Integer)– valores: 1, -5, 24345– operações: +, -, *, div, mod, abs, max, min
• Reais (Real)– valores: 1.5, 1.3456– operações: +, -, *, /, floor, round, max, min
18Eliane Martins - Instituto de Computação - UNICAMP
OCL - Tipos e operações
• Valor lógico (Boolean)– valores: true, false– operações: not, and, or, xor, implies, if-then-else-endif– obs.:
• true or x é sempre verdadeiro, mesmo se x é indefinido• false and x é sempre falso, mesmo se x é indefinido
exemplos:(idade < 20 implies desconto = 25) and (idade >= 20 implies desconto =
15)if idade < 20 then desconto = 25 else desconto = 15 endifdesconto = (if idade < 20 then 25 else 15 endif)
19Eliane Martins - Instituto de Computação - UNICAMP
OCL - Tipos e operações
• Cadeia de caracteres (String)– valores: ‘ ‘ ‘uma sentença’– operações:
• cadeia.size( )• cadeia1.concat(cadeia2)• cadeia1.substring(posição1, posição2)• cadeia.toUpper( )• cadeia.toLower( )
20Eliane Martins - Instituto de Computação - UNICAMP
OCL - Tipos e operações
• Tipos enumerados (enum)– definição:
• enum {segunda, terça, quarta, quinta, sexta}– utilização:
• #quarta– operações: -, = , <>
21Eliane Martins - Instituto de Computação - UNICAMP
Tipos e operações
• 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}
– “saco” (Bag): com repetição, desordenado• ex.: Bag{203, 5, 40, 5, 300, 5}
– seqüência (Sequence): com repetição, ordenada• ex.: Sequence{5, 5, 5, 40, 203, 300}
22Eliane Martins - Instituto de Computação - UNICAMP
Uso de coleções
• Os conjuntos são usados em UML:– como extensões de classe, de associações– como extremidade (endpoint) de uma associação
• As seqüências são usadas em UML:– em associações com a restrição {ordered}
• Os “sacos” resultam da navegação em OCL:– resultado da operação collect– útil para operações como sum:
empregado -> collect(salario).sum
23Eliane Martins - Instituto de Computação - UNICAMP
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
• Imagem de uma função:collect
• Quantificadores:forall, exists
• Determinação de unicidade:isUnique
24Eliane Martins - Instituto de Computação - UNICAMP
Coleções: operações básicas
Cardinalidade coleção -> sizeNúmero de ocorrências coleção -> count(elem)Pertence coleção -> includes(elem)Não pertence coleção -> excludes(elem)Inclusão col1 -> includesAll(col2)Checa se vazio coleção -> isEmptyCheca se não vazio coleção -> notEmptySoma de elementos coleção -> sum
25Eliane Martins - Instituto de Computação - UNICAMP
Conjuntos: operações básicas
União conj1 -> union (conj2)Interseção conj1 -> intersection (conj2)Diferença conj1 - conj2Inclusão de elemento conj -> including(elem)Exclusão de elemento conj -> excluding(elem)Converte para seqüência conj -> asSequenceConverte para “saco” conj -> asBag
26Eliane Martins - Instituto de Computação - UNICAMP
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)
• Eliminação de elementos que satisfazem a uma condição:coleção -> reject(cond)
ex.: self.aluno->reject( cr < 7)
• Outra sintaxe:self.aluno -> reject (p:Pessoa | p.cidade_origem <> ‘Campinas’)
enum{masculino, feminino}
27Eliane Martins - Instituto de Computação - UNICAMP
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 resultadosex.:
self.empregados -> collect (idade) � Bag{22, 37, 25, 22, 44, 52}self.empregados -> collect (idade) -> asSet � obtém conjuntoself.empregados -> collect (salário) -> sum
• pode-se escrever de forma simplificada:self.empregados -> collect (idade) ↔ self.empregados.idade
28Eliane Martins - Instituto de Computação - UNICAMP
Coleção: Quantificadores
• Pode-se usar os quantificadores: ∀ e ∃coleção -> forAll(cond)
retorna verdade se a cond é satisfeita por todos os elementos da coleçãocoleção -> exists(cond)
retorna verdade se a cond é satisfeita por pelo menos um elemento dacoleção
ex.:self.empregados -> forAll(idade < 55)self.empregados -> exists(sexo = #feminino and idade > 50)100 + if self.pessoa-> forAll (idade < 18) then 50 else self.pessoa -> select(idade >= 18) ->size * 5 endifself.empregados-> exists( p: Pessoa | p.sobrenome = ‘Martins’)
29Eliane Martins - Instituto de Computação - UNICAMP
Coleção: determinação de unicidade
• Retorna verdade se para cada elemento da coleçãoa expressão retorna um valor diferente:
coleção -> isUnique (expr)– ex.:
self.alunos -> isUnique (prenome)
– útil para definir a noção de chave (identificador único)
30Eliane Martins - Instituto de Computação - UNICAMP
Operações relativas ao diagrama declasses
• OCL oferece várias operações sobre o diagrama de classes:– acesso a atributos e métodos
• acesso a um atributo: objeto.atributoex.: self.anodeProdução self.idade
• acesso a método: objeto.método(expr1, expr2, ...)ex.: self.calcula_media(turma00)
– navegação pelas associações– acesso a tipos e supertipos– acesso às instâncias de uma classe
31Eliane Martins - Instituto de Computação - UNICAMP
Navegação através de uma associação
• A partir de um objeto (contexto) é possível o acesso aobjetos que lhe são associados:
objeto.papel– se cardinalidade 1 ou 0..1: o resultado é um objeto– senão o resultado pode ser um conjunto (Set) ou uma seqüência
(Sequence) se associação tem restrição {ordered}– se não tem papel em uma associação pode-se usar o nome da classe
destino com a primeira letra minúscula
32Eliane Martins - Instituto de Computação - UNICAMP
Navegação através de uma associação
• Exemplos:Pessoaself.marido -- é do tipo Pessoaself.empregador -- é do tipo Set (Empresa)self.marido-> nonEmpty implies self.marido.sexo = #mascnot ( (self.mulher -> size = 1 and (self.marido -> size = 1) )
0..1 mulher
0..1 marido
Pessoaécasado: BooleantemEmprego: Booleanidade: Integerprenome: Stringsobrenome: Stringsexo: enum{fem, masc}salario(data): Real
Empresanome: StringnroEmpregados: Integercapital( )
0..* empregado 0..* empregador
Empregocargo: StringdataInicio: Datesalario: Real
33Eliane Martins - Instituto de Computação - UNICAMP
Navegação para uma associação
• Se a associação é uma classe, pode-se ter acesso a elaatravés de um objeto:
objeto.nome_da_associação– o nome da associação deve iniciar com minúscula– o resultado é exatamente 1 objeto, instância da classe referente à
associação– ex.:
Pessoaself.emprego -> collect(salario) -> sum
� resultado é convertido em um singleton
34Eliane Martins - Instituto de Computação - UNICAMP
Navegação para uma associação
• Se a associação (classe) é reflexiva, pode-se indicar opapel para evitar ambigüidade:– objeto.nome_da_associação [papel]
0..1 marido
Pessoaécasado: BooleantemEmprego: Booleanidade: Integerprenome: Stringsobrenome: Stringsexo: enum{fem, masc}salario(data): Real
0..1 mulher
Casamentolocal: Stringdata: Date
Pessoa:self.casamento [mulher].local
35Eliane Martins - Instituto de Computação - UNICAMP
Navegação a partir de uma associação
• Pode-se navegar a partir da associação (classe) para osobjetos que ela relaciona:
nome_da_associação.papel– o resultado da navegação será sempre 1 único objeto (que pode no
entanto ser convertido em singleton)– exemplos:
Empregoself.empregadorself.empregado
36Eliane Martins - Instituto de Computação - UNICAMP
Navegação através de associaçãoqualificada• 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]
0..1 marido
Pessoaécasado: BooleantemEmprego: Booleanidade: Integerprenome: Stringsobrenome: Stringsexo: enum{fem, masc}salario(data): Real
0..1 mulher
nroConta: Integer
Banconumero: Integeragencia: Integer cliente
0..1
Banco:self.cliente -- Set(Pessoa)self.cliente [4001155] -- 1 objetoPessoa com nro de conta dado
37Eliane Martins - Instituto de Computação - UNICAMP
Operações sobre tipos
objeto.oclType– retorna o tipo do objeto (pré-definido ou definido no
diagrama de classes)objeto.oclIsTypeOf (tipo)– retorna true seo tipo do objeto é exatamente tipoobjeto.oclIsKindOf (tipo)– retorna true se o tipo do objeto é tipo ou algum de seus
supertiposobjeto.oclAsType (tipo)– conversão de tipo (casting)
38Eliane Martins - Instituto de Computação - UNICAMP
Operações sobre classes
classe.propriedade_da_classe– permite o acesso a propriedades (características) da classe:
classe.allInstances � retorna o conjunto de instâncias da classe• ex.:
Pessoa.allInstances -> size < 500Pessoa.allInstances -> forall (p1, p2 | p1 <> p2 implies p1.sobrenome <>
p2.sobrenome)Banco.allInstances -> isUnique (numero)