Buscar

UML - OCL

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1 
OCL – The Object Constraint Language 
Franklin Ramalho 
Professor DSC-UFCG 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
2 
Agenda 
• Introdução 
– UML 
– Estudo de Caso 
• Motivação 
• A Linguagem OCL 
– Características 
– Tipos 
– Exemplos 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
3 
Introdução 
• Empresa de Software de sucesso ↔ desenvolve software 
de qualidade e atende aos usuários 
 
• Modelagem é uma tarefa fundamental nas atividades 
iniciais do desenvolvimento do software 
– Comunicar a estrutura e comportamento desejados para o 
sistema 
– Visualizar e controlar a arquitetura do software 
– Melhor entendimento do sistema 
– Gerenciar os riscos, etc, ... 
 
• Para modelar sistemas, é preciso utilizar uma linguagem 
expressiva, simples e padrão 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
4 
UML 
• UML é uma linguagem para especificação, visualização, 
construção e documentação de artefatos de sistemas de 
software. 
 
• Linguagem padrão adotada e recomendada pela OMG 
(Object Management Group). 
 
• Amplamente utilizada pelo mercado e pela academia 
 
• Extensível e inter-disciplinar 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
5 
UML 
• Apenas uma linguagem, independente de processo 
 
• Abrange modelagem estrutural e comportamental 
 
• Sub-dividida em diagramas 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
6 
UML 
• Parte estrutural 
– Diagrama de classes 
– Diagrama de objetos 
– Diagrama de componentes 
– Diagrama de estruturas compostas 
– Diagrama de implantação 
 • Parte comportamental 
– Diagrama de comunicação 
– Diagrama de sequência 
– Diagrama de tempo 
– Diagrama de overview de interação 
– Diagrama de casos de uso 
– Diagrama de máquinas de estado comportamental 
– Digrama de protocolos de interface 
– Diagrama de atividades 
2 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
7 
UML - Estudo de Caso 
Um modelo UML simples para um sistema de 
informação que representa um programa de 
fidelidade 
Baseado no estudo de caso apresentado em [Warmer & Kleppe, 1999] 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
9 
Motivação 
• As restrições pré-definidas de UML são poucas e 
limitadas: {ordered}, {or}, etc. 
 
• Restrições são fundamentais em modelos gráficos, pois: 
– Melhoram a documentação do sistema 
– Melhoram a precisão do modelo 
– Evitam interpretações errôneas sobre o modelo 
– Economizam tempo e dinheiro! 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
10 
Motivação 
• UML não provê todos aspectos relevantes da 
especificação do sistema. 
– Restrições adicionais são escritas em linguagem natural 
– Ao longo de todos os diagramas 
 
• Modelos precisam ser completos 
 
• Modelos precisam ser precisos 
 
• Modelos precisam ser testados 
 
• Modelos precisam ser verificados 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
11 
Motivação - MDA 
• PIMs precisam ser detalhados ao extremo para permitir 
completa geração de código 
 
• Idem para PSMs 
 
• Meta-modelos precisam especificar restrições sintáticas 
sobre seus meta-elementos 
– Meta-classes, meta-atributos, meta-associações, meta-operações, 
etc. 
 
• Idem para perfis UML 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
12 
Motivação 
• Linguagem natural é ambígua. 
 
• Linguagens formais são precisas 
– Alloy, Z, Object-Z, etc. 
 
• Linguagens formais tradicionais: 
– Exigem um forte conhecimento matemático 
– Notação não é intuitiva 
 
• Necessidade de uma linguagem formal de fácil leitura e 
escrita e mais próxima da implementação do modelo. 
 
3 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
13 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
14 
Enriquecendo o modelo 
• O cartão de um sócio deve apresentar o seguinte tratamento: “Sr. 
Fulano” ou “Sra. Sicrana” 
 
• Um cliente deve ser maior de idade 
 
• Número de pontos gastos em transações de crédito deve ser maior 
que em transações de débito 
 
• Transações devem ser realizadas com um número mínimo de 100 
pontos 
 
• Dois clientes diferentes não podem ter o mesmo RG 
 
• Quantos clientes um parceiro possui no programa de fidelidade? 
 
• Deve-se especificar as operações: 
– obtemServiço(), estaVazia(), cadastrar(), etc. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
15 
Agenda 
• Introdução 
– UML 
– Estudo de Caso 
• Motivação 
• A Linguagem OCL 
– Características 
– Tipos 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
16 
OCL - Características 
• OCL - Linguagem para escrita de restrição sobre 
objetos, que pode ser aplicada em um ou mais valores de 
um (ou parte de) sistema ou modelo orientado a objetos. 
 
• Criada originalmente na IBM (Insurance Division) 
 
• Integra construtores da lógica de primeira ordem e 
algorítmica. 
 
• Apresenta sintaxe mais intuitiva para o desenvolvedor, 
mais próxima da implementação em linguagens OO. 
 
• Complementar a UML 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
17 
OCL - Características 
UML OCL 
Credito Debito
ParceiroPrograma
quantidadeDeClientes : Integer
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
idade()
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
0..*transacoes 0..*
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
0..*
transacoes
0..*
cartao
0..* cartoes0..*
proprietario
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
0..*
transacoes
0..*
0..* servicosOferecidos0..*
ProgramaFidelidade
cadastrar(c : Cliente)
0..*0..* 0..*
programa
0..*1..*
1..*
1..*
parceiros1..*
Socio
0..10..1
cartao
NivelServico
nome : String
0..*
servicosDisponiveis
0..*
1..*1..*
{ordered}
0..*0..*
nivelDoServico
8: fecha
Joao:Pass
ageiro
Maria:Pas
sageiro
a3:BotaoD
eAndar
a5:BotaoD
eAndar
cont:Contr
olador
elevador:E
levador
porta:Po
rta
1: aperta
2: atualiza
3: ilumina
7: desilumina
9: aperta
10: atualiza
11: desilumina
4: mova
5: chegou
6: abre
esperando funcionando
atualiza / mova, ilumine
chegou / desilumine
atualiza / mova, ilumine
contJoao Maria a3 a5 elevador
aperta atualize
mova
ilumina
aperta
chegou
abra
mova
atualize
ilumina
OCL – Object Constraint Language Franklin Ramalho– UFCG 
18 
OCL - Características 
• Linguagem para escrita de restrições declarativas 
– Originalmente, mas ... 
 
• Linguagem semi-formal de escrita e leitura mais intuitiva 
– Originalmente, mas ... 
 
• Não é uma linguagem de programação 
– Originalmente, mas ... 
 
• Sem efeitos colaterais 
– Originalmente, mas ... 
4 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
19 
OCL - Características 
• Linguagem tipada 
 
• Uso de OCL: 
– Especificar invariantes 
– Descrever pre e pós-condições sobre operações e métodos 
– Especificar corpo de operações 
– Especificar regras dedutivas 
– Especificar inicializações de propriedades 
– Descrever Guardas 
– Servir como linguagem de navegação 
– Especificar expressões sobre quaisquer diagramas UML 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
20 
• Expressões OCL podem referenciar: 
– classificadores UML: Classes, Interfaces, Associações e Tipos. 
– Atributos, operações e papéis 
 
• O valor de uma propriedade de uma classe que é 
definido no diagrama de classes é especificado através 
de um ponto „.‟ seguido pelo nome da propriedade 
 
• Sintaxe: classificador.propriedade 
• Exemplos: 
– Transacao.pontos 
– Transacao.data 
– Transacao.programa() 
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
OCL - Características 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
21 
OCL - Características 
• OCL permite navegação ao longo das associações de um 
diagrama de classes, permitindo assim, referências a outras 
classes e suas propriedades. 
 
• Sintaxe: 
classe.papel.propriedade ou classe.tipo_objeto_associado.propriedade 
• Exemplos: 
– ProgramaFidelidade.cliente.nome 
– Cliente.programa.cadastrar() 
– ProgramaFidelidade.cliente.cartoes 
ProgramaFidelidade
cadastrar(c : Cliente)
0..*0..*0..*
programa
0..*
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
proprietario
cartoes
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
0..*0..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
22 
• Uso de pacotes: 
 ProgramaFidelidade.AspectosParceria::parceiros.quantidadeDeClientes 
ProgramaFidelidade
cadastrar(c : Cliente)
ParceiroPrograma
quantidadeDeClientes : Integer
1..*
parceiros1..*
1..*
1..*
AspectosParceria
AspectosPrograma
OCL - Características 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
23 
OCL - Características 
UML OCL 
Corpo de 
operações 
Pré-condições 
Pós-condições 
Regras de 
derivação Especificações 
de 
Inicialização 
Invariantes 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
24 
Regras de derivação 
• Regra de derivação 
– Determina o valor de 
elementos derivados 
– Expressão cujo contexto é 
um atributo ou um papel de 
associação 
context Cartao::nomeTratamentoCliente : String 
derive: 
 proprietario.pronomeTratamento. 
 concat(‘ ’).concat(proprietario.nome) 
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : TipoDeCor
nomeTratamentoCliente : String
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
0..* cartoes
proprietario
0..*
5 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
25 
Valores iniciais 
• Valores iniciais 
– Atributos e papéis de associação 
context Conta::pontos 
init: 0 
 
context Cartao::valid 
init: true 
 
context Cartao::transacoes 
init: Set{} 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
26 
• Invariante é uma expressão cujo resultado deve ser 
verdadeiro para todas as instâncias de seu contexto. 
 
• O contexto de uma invariante deve ser sempre uma 
classe 
 
• Sintaxe: 
 context nome_tipo inv: 
 expressao OCL 
 
• Sintaxe alternativa: 
 context var : nome_tipo inv nome_inv: 
 expressao OCL 
Invariantes 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
27 
Invariantes 
 
 context Cliente inv: 
 self.idade() >= 18 
 
 context Cliente inv: 
 idade() >= 18 
 
context c : Cliente inv idadeMinima: 
 c.idade() >= 18 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
OCL – Object Constraint Language Franklin Ramalho – UFCG 
28 
• Invariantes podem ser representadas através: 
– Nota no modelo UML (estereótipo <<invariant>>) 
– Arquivo separado 
– Painel específico provido por ferramentas 
Invariantes 
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
idade()
0..* cartoes0..*
proprietario
<<invariant>>
context Cartao inv:
nomeTratamentoCliente = cliente.pronomeTratamento.concat( cliente.nome)
OCL – Object Constraint Language Franklin Ramalho – UFCG 
29 
Corpo de uma operação 
• Operações 
– Corpo de operações de consulta 
(body) 
– Pre e pós-condições (pre and post) 
context ProgramaFidelidade::obtemServicos():Set(Servico) 
body: parceiros.servicosOferecidos->asSet() 
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
ParceiroPrograma
quantidadeDeClientes : Integer
1..*
1..*
1..*
1..* parceiros
0..*0..* servicosOferecidos
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
OCL – Object Constraint Language Franklin Ramalho – UFCG 
30 
Pre e pós-condições 
• Pré-condição é uma restrição que deve ser verdadeira 
no inicio da execução da operação. 
 
• Pós-condição é uma restrição que deve ser verdadeira 
no final da execução da operação. 
 
• Contexto : Classe, tipo ou interface + operação. 
Sintaxe: 
context NomeTipo::nomeOperacao (param1 : Tipo1, ...) : TipoRetorno 
 pre nomePre: param1 > ... 
 post nomePost: result = ... 
6 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
31 
Pre e pós-condições 
context Conta::estaVazia() : Boolean 
 post: result = ( pontos = 0)
 
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
context ProgramaFidelidade::cadastrar(c : Cliente) : void 
 pre parametroOk: not cliente->includes(c) 
 post resultadoOk: cliente = cliente@pre->including(c) 
ProgramaFidelidade
cadastrar(c : Cl iente)
OCL – Object Constraint Language Franklin Ramalho – UFCG 
32 
Pre e pós-condições 
• Podem ser representadas através: 
– Nota no modelo UML (<<precondition>> e <<poscondition>>) 
– Arquivo separado 
– Painel específico provido por ferramentas 
<<postcondition>>
Context ProgramaFidelidade::cadastrar(c : Cliente) : void
post: cliente = cliente@pre->including(c)
ProgramaFidelidade
cadastrar(c : Cliente)
<<precondition>>
Context ProgramaFidelidade::cadastrar(c : Cliente) : void
pre:not cliente->includes(c)
OCL – Object Constraint Language Franklin Ramalho – UFCG 
33 
Roteiro 
• Introdução 
– UML 
– Estudo de Caso 
• Motivação 
• A Linguagem OCL 
– Características 
– Tipos 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
34 
Tipos OCL 
• Cada objeto e propriedade em OCL tem um tipo. Os tipos 
OCL são: 
 
– Tipos Pré-definidos (de valor) – são tipos pré-definidos pela 
linguagem e cujas instâncias nunca mudam seu valor. Podem ser 
classificados como: 
• Tipos Básicos: Integer, Real, String, Boolean 
• Tipos Coleção: Set, OrderedSet, Bag, Sequence, Collection 
 
– Tipos do Modelo (de objeto) – são tipos definidos pelo 
usuário e cujas instâncias podem mudar seu valor 
• ProgramaFidelidade, Conta, Transacao, Credito, Debito, ... 
 
– OclAny e OclType são supertipos de qualquer tipo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
35 
Tipos OCL - OclAny 
• Nomes de suas operações iniciam sempre com ocl 
– Exceção de: = e <> 
 
• Operações: 
– oclType : OclType 
– oclIsTypeOf(type : OclType) : Boolean 
– oclIsKindOf(type : OclType) : Boolean 
– oclAsType(type : OclType) : OclType 
– oclIsUndefined() 
– oclIsNew() 
– oclInState() 
– oclInState(str : StateName) 
– Type::allInstances() 
– Etc. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
36 
Tipos OCL - OclAny 
• Exemplos: 
 context Credito inv: 
 ... 
self.oclType = Credito self.oclIsTypeOf(Transacao) = false 
self.oclIsTypeOf(Credito) = true self.oclIsTypeOf(Debito) = false 
self.oclIsKindOf(Transacao) = true self.oclIsKindOf(Credito) = true 
self.oclIsKindOf(Debito) = false 
... 
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
Credito Debito
7 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
37 
Roteiro 
• Introdução 
– UML 
– Estudo de Caso 
• Motivação 
• A Linguagem OCL 
– Características 
– Tipos 
• Tipos Pré-definidos (Básicos e Coleção) 
• Tipos do Modelo 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
38 
Tipos Básicos 
• Integer e Real 
– 2654 * 4.3 + 101 = 11513.2 13.mod(2) = 1 
• String 
– „casa‟.size = 4 „casa‟.toUpper = „CASA‟ 
• Boolean 
– and, or, xor, not, implies, if-then-else 
context Cliente inv: 
pronomeTratamento = (if masculino = true 
 then ‘Sr.’ 
 else ‘Sra.’ 
 endif) 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
OCL – Object Constraint Language Franklin Ramalho – UFCG 
39 
Tipos Coleção 
• Em sistemas OO, a manipulação de coleções é muito comum. OCL 
oferece 4 tipos para tal manipulação: 
 
• Collection: supertipo abstrato usado para definir operações 
comuns entre todos os tipos Collection que são concretos: Set, 
OrderedSet, Bag e Sequence. 
 
• Set: Coleção que contém instâncias de um tipo OCL válido. Um 
set não contém elementos duplicados. 
 
• OrderedSet: Set ordenado. 
 
• Bag: É semelhante a um set, mas pode conter elementos 
duplicados. 
 
• Sequence: É semelhante a um bag, mas seus elementos são 
ordenados 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
40 
Importante! 
• Tipos Coleção são tipos de valor 
• OCL não possui efeitos colaterais (originalmente, mas...) 
 
 Operações sobre uma coleção não a modificam, mas 
resultam em uma nova coleção. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
41 
Tipos Coleção 
• Operações do tipo abstrato Collection: 
– size() 
– count(object) 
– includes(object) 
– includesAll(collection) 
– excludes(object) 
– excludesAll(collection) 
– isEmpty 
– including(object) 
– excluding(object) 
– Etc. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
42 
Tipos Coleção 
• Todas as operações aplicadas a coleções são precedidas 
por „->‟ ao invés de „.‟ 
context ParceiroPrograma inv: 
 quantidadeDeClientes = programaFidelidade.cliente->size() 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
ParceiroPrograma
quantidadeDeClientes : Integer
parceiros1..*
1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
programa
0..* 0..*0..*
8 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
43 
Tipos Coleção 
• Operações de interação – operações que permitem tratar cada 
elemento da coleção. Para cada um destes, a expressão OCL 
especificada é avaliada. 
 
• As operações de interação em OCL são: 
– select, reject, collect, forAll, exists, iterate, any, etc... 
 
• Sintaxe geral: 
 colecao->operacao ( <expressão booleana>) 
 colecao->operacao ( elemento | <expressão booleana>) 
 colecao->operacao ( elemento : Tipo | <expressão booleana>) 
 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
44 
context Cartao inv: 
self.trasacoes->select( pontos > 100 )->size() > 10 
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
0..*0..*transacoes
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
0..*
transacoes
0..*
cartao
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
Operação select 
• select – seleciona todos os elementos da coleção para os 
quais a expressão booleana especificada é verdadeira. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
45 
Operação collect 
• collect – usada para obter uma nova coleção de tipos 
diferentes daqueles da coleção original. 
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
0..*0..*transacoes
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
0..*
transacoes
0..*
cartao
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
context Conta inv: 
transacoes->collect (pontos)->sum() > 20 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
46 
context ProgramaFidelidade inv: 
 self.cliente->forAll( c1, c2 | c1 <> c2 implies 
 c1.rg <> c2.rg) 
Operação forAll 
• forAll – especifica uma condição que deve ser 
verdadeira para todas as instâncias da coleção. 
context ProgramaFidelidade inv: 
 self.cliente->forAll( idade() <= 70) 
ProgramaFidel idade
cadastrar(c : Cl iente)
programa
0..* 0..*0..* 0..*
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
OCL – Object Constraint Language Franklin Ramalho – UFCG 
47 
Operação iterate 
• Iterate – mais fundamental e mais complexa operação 
sobre coleções. 
– Sintaxe: 
 collection->iterate( elemento : Tipo1; 
 acum : Tipo2 = <expressao>| <expressao-com-elemento-e-acum>) 
 
• Pseudo-código equivalente: 
 acum = <expressao>; 
 while (colecao.naoVazia() ) do 
 elemento = colecao.proximoElemento(); 
 acum = <expressao-com-elemento-e-acum> 
 endwhile 
 return acum 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
48 
context ParceiroPrograma inv: 
 self.servico.transacao->iterate( 
 t: Transacao; 
 acum: Integer = 0 | 
 if t.isTypeOf(Debito) then 
 acum + pontos 
 else 
 acum 
 endif 
 ) 
<= 
 self.servico.transacao->iterate( 
 t: Transacao; 
 acum: Integer = 0 | 
 if t.isTypeOf(Credito) then 
 acum + pontos 
 else 
 acum 
 endif 
 ) 
ParceiroPrograma
quantidadeDeClientes : Integer
0..* servicosOferecidos
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
transacoes
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
0..*0..*
Operação iterate 
9 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
49 
Roteiro 
• Contextualização e Motivação 
– UML 
– Estudo de Caso 
• A Linguagem OCL 
– Características 
– Tipos Pré-definidos (Básicos e Coleção) 
– Tipos do Modelo 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
50 
Tipos do Modelo 
• Tipos definidos pelo usuário no modelo UML. 
 
• Classes (inclusive, classes-associação), tipos e interfaces 
definidos no modelo UML, são consideradas tipos em OCL. 
 
• Exemplos de tipos do modelo: Cliente, Conta, etc. 
 
• Estes tipos possuem propriedades: 
– Atributos, operações e navegações (associações) 
 
• Exemplo: context Cliente inv: 
 self.nome ... 
 self.idade() ... 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
51 
Importante! 
• OCL é uma linguagem “sem efeitos colaterais” 
 
• Operações que modificam o estado de um objeto não são 
permitidas em OCL 
 
• Apenas as operações de consulta (isQuery true) podem 
ser usadas em OCL. 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
52 
Navegações x Multiplicidades 
• O resultado de uma navegação sobre uma associação 
com multiplicidade maior que 1 é sempre um Set. 
 
• O resultado de uma navegação sobre mais de uma 
associação com multiplicidade (de ambas) maior que 1 é 
sempre um Bag. 
 
• Caso a navegação (indireta) seja sobre uma associação 
ordenada - {ordered} -, o resultado é sempre um 
Sequence. 
 
• Quando teremos um OrderedSet? 
 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
53 
Navegações x Multiplicidades 
• context Cartao inv: 
… self.proprietario //retorna um objeto do tipo Cliente 
… self.proprietario.programa //retorna um Set 
… 
• context ProgramaFidelidade inv: 
… self.nivelServico // retorna um OrderedSet 
…. self.cliente.cartoes // retorna um Bag 
… 
ProgramaFidelidade
cadastrar(c : Cliente)
programa
0..* 0..*0..* 0..*
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
NivelServico
nome : String
1..*
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : enum{prata, ouro}
nomeTratamentoCliente : String
cartoes0..*
proprietario
0..*
{ordered}
1..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
54 
Navegações x Multiplicidades 
ProgramaFidel idade
cadastrar(c : Cl iente)
0..*
programa
0..*0..*
Socio
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
idade()
0..*
context Socio inv: 
… self.programa //retorna um objeto do tipo ProgramaFidelidade 
… self.cliente // retorna um objeto do tipo Cliente 
… 
 
context ProgramaFidelidade inv: 
… self.socio // retorna um Set 
… 
10 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
55 
Navegações x Multiplicidades 
context ParceiroPrograma inv: 
 quantidadeDeClientes = programaFidelidade.cliente 
 ->asSet()->size() 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
ParceiroPrograma
quantidadeDeClientes : Integer
parceiros1..*
1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
programa
0..* 0..*0..*
context ParceiroPrograma inv: 
 quantidadeDeClientes = programaFidelidade.cliente 
 ->size() 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
56 
OCL – oclIsNew() 
context ProgramaFidelidade::cadastrarECriarCliente(n: 
String, d: Data):Cliente 
post: result.oclIsNew() and 
 result.nome = n and 
 result.dataAniversario = d and 
 cliente->includes(result) 
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
0..*0..*0..*
programa
0..*
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
OCL – Object Constraint Language Franklin Ramalho – UFCG 
57 
OCL 
context ProgramaFidelidade inv: 
if 
self.parceiros.servicosOferecidos.
transacoes.pontos->sum() > 100 
then … 
else if 
self.parceiros.servicosOferecidos.
transacoes.pontos->sum() > 50 
 then … 
 else if 
self.parceiros.servicosOferecidos.
transacoes.pontos->sum() > 30 
 then … 
ParceiroPrograma
quantidadeDeClientes : Integer
0..*0..* servicosOferecidos
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
0..*
transacoes
0..*
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
parceiros1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)1..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
58 
OCL – Variáveis locais 
context ProgramaFidelidade inv: 
let pontuacao : Integer = 
self.parceiros.servicosOferecidos.
transacoes.pontos->sum() in 
if pontuacao > 100 
then … 
else if pontuacao > 50 
 then … 
 else if pontuacao > 30 
 then … 
ParceiroPrograma
quantidadeDeClientes : Integer
0..*0..* servicosOferecidos
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
0..*
transacoes
0..*
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
parceiros1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)1..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
59 
OCL - Definição de novos atributos e operações 
• Atributos e operações podem ser adicionados ao modelo 
UML através de OCL 
 
• Contexto: Classe para qual a feature será adicionada 
 
• Um atributo definido desta maneira será sempre um 
atributo derivado 
 
• A expressão que define este atributo inclui o seu tipo e 
sua regra de derivação 
 
• Operações de consulta 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
60 
OCL - Definição de novos atributose operações 
context Conta 
def: movimentacao : Real = transacoes.pontos->sum() 
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
0..*
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
0..*transacoes
11 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
61 
OCL - Definição de novos atributos e operações 
context ProgramaDeFidelidade 
def: getServicosPorNivel(nomeNivel : String) : Set 
(Servico) 
= nivelServico->select(nome = nomeNivel) 
 .servicosDisponiveis->asSet() 
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
{ordered}
1..*1..*
NivelServico
nome : String
cor : TipoDeCor
0..*
servicosDisponiveis
0..*
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
OCL – Object Constraint Language Franklin Ramalho – UFCG 
62 
OCL – Tuplas 
• OCL permite compor vários valores em uma tupla 
 
• Tupla consiste de vários campos, onde cada um destes 
possui: 
– Um nome 
– Um tipo 
 
• Uma tupla é por si só um valor 
 
• Cada tupla OCL tem um tipo: Tuple 
 
• Por quê? 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
63 
OCL – Tuplas 
• Exemplo: 
Tuple { nome : String = ‘José’, idade : Integer = 20} 
 
• Tipo: 
TipoTupla(nome:String, idade: Integer) 
 
• Os tipos dos campos são opcionais 
Tuple { nome = ‘José’, idade = 20} 
 
• A ordem em que ocorre os campos dentro de uma tupla não é 
importante 
Tuple {idade = 20, nome = ‘José’} 
 
• Acesso: 
Tuple { nome : String = ‘José’, idade : Integer = 20}.nome 
= ‘José’ 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
64 
Exercício 
• Para se obter os serviços 
oferecidos em um programa de 
fidelidade 
context ProgramaFidelidade::obtemServicos():Set(Servico) 
body: parceiros.servicosOferecidos->asSet() 
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
ParceiroPrograma
quantidadeDeClientes : Integer
1..*
1..*
1..*
1..* parceiros
0..*0..* servicosOferecidos
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
OCL – Object Constraint Language Franklin Ramalho – UFCG 
65 
Exercício 
• Especifique que o primeiro nível 
de serviço deve ter como nome 
“OURO” e ter como cor ouro 
context ProgramaFidelidade inv: 
self.nivelServico->first().nome = ‘OURO’ and 
self.nivelServico->first().cor = TipoDeCor::ouro 
NivelServico
nome : String
cor : TipoDeCor
1..*
{ordered}
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
1..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
66 
Exercício 
• Especifique que se o nível de 
serviço tiver como nome “OURO”, 
a sua cor deve ser ouro 
context NivelServico inv: 
self.nome = ‘OURO’ implies self.cor = TipoDeCor::ouro 
NivelServico
nome : String
cor : TipoDeCor
1..*
{ordered}
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
1..*
12 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
67 
Exercício 
• Defina um novo atributo para 
classe Cliente identificando os 
cartões mais bem usados por ele 
(aqueles que já efetuaram pelo 
menos 10.000 pontos) 
context Cliente 
def: cartoesMaisBemUsados : Set (Cartao) 
= cartoes->select(transacoes.pontos->sum() >= 10.000) 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
proprietario
0..* cartoes
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : TipoDeCor
nomeTratamentoCliente : String
0..*
0..*
Transacao
pontos : Integer
data : Data
programa() : ProgramFidelidade
transacoes
0..*
cartao
OCL – Object Constraint Language Franklin Ramalho – UFCG 
68 
Exercício 
• Defina um novo atributo para classe Cliente identificando 
as companhias às quais ele é fiel 
context Cliente 
def: companhiasFiel : Set (ParceiroPrograma) 
= programas.parceiros->asSet() 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
0..*0..*0..*
+programas
0..*
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)1..*1..*
1..*1..* parceiros
ParceiroPrograma
quantidadeDeClientes : Integer
OCL – Object Constraint Language Franklin Ramalho – UFCG 
69 
Exercício 
• Defina, na classe Cliente, uma operação que retorna todos os 
cartões de um dado programa de fidelidade passado como 
parâmetro 
context Cliente 
def: cartoesDeUmPrograma(p:ProgramaFidelidade) : Set 
(Cartao) 
= p.socio.cartao 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
0..* cartoes
proprietario
0..*
Cartao
valido : Boolean
validoDesde : Data
vencimento : Data
cor : TipoDeCor
nomeTratamentoCliente : String
Socio
ProgramaFidelidade
cadastrar(c : Cliente)
obtemServicos() : Set(Servicos)
+programas
0..* 0..*
cartao
0..*0..*
OCL – Object Constraint Language Franklin Ramalho – UFCG 
70 
Roteiro 
• Contextualização e Motivação 
– UML 
– Estudo de Caso 
• A Linguagem OCL 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
71 
Estilos para especificação de restrições OCL 
Qual a melhor forma de 
especificar uma 
restrição OCL? 
Como escolher o 
contexto? Posso dividir 
minha restrição 
em n outras? 
Devo evitar 
navegações 
complexas? 
Que tal adicionar 
atributos e/ou operações 
extras? 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
72 
Estilos para especificação de restrições OCL 
1. Escolha correta do contexto da restrição 
OCL 
context Cliente inv: 
 programa.parceiros.quantidadeDeClientes = 
programa.parceiros.programaFidelidade.cliente->asSet-()>size() 
context ParceiroPrograma inv: 
 quantidadeDeClientes = 
 programaFidelidade.cliente->asSet()->size() 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
ParceiroPrograma
quantidadeDeClientes : Integer
parceiros1..*
1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
programa
0..* 0..*0..*
13 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
73 
2. Divisão de uma restrição em várias outras 
 context ProgramaFidelidade inv: 
 parceiros.servicosOferecidos->forAll(pontosACreditar = 0) and 
 socio.cartao->forAll(valido) and 
 cliente->forAll(idade() > 18) 
Estilos para especificação de restrições OCL 
context ProgramaFidelidade inv: 
parceiros.servicosOferecidos->forAll(pontosACreditar = 0) 
context ProgramaFidelidade inv: 
 socio.cartao->forAll(valido) 
context ProgramaFidelidade inv: 
 cliente->forAll(idade() > 18) 
• Pode ser dividida em: 
OCL – Object Constraint Language FranklinRamalho – UFCG 
74 
3. Inserção de atributos ou operações extras 
 
– Pode-se adicionar atributos ou operações “extras” ao 
modelo UML. 
 
– Estes atributos e/ou operações deverão conter expressões 
OCL 
 
– def 
Estilos para especificação de restrições OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
75 
Estilos para especificação de restrições OCL 
Servico
condicao : Boolean
pontosADebitar : Integer
pontosACreditar : Integer
descricao : String
servicosOferecidos0..*0..*
ParceiroPrograma
quantidadeDeClientes : Integer
parceiros1..*
1..*
1..*
1..*
ProgramaFidelidade
cadastrar(c : Cliente)
0..*
programa
0..*0..*
Socio
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
0..*
0..10..1
Conta
pontos : Integer
creditar(pts : Integer)
debitar(pts : Integer)
estaVazia() : Boolean
OCL – Object Constraint Language Franklin Ramalho – UFCG 
76 
context ProgramaFidelidade 
 def: semPontos : Boolean = 
 parceiros.servicosOferecidos->forAll(pontosACreditar = 0) 
context Socio inv: 
 programa.semPontos implies conta->isEmpty 
Estilos para especificação de restrições OCL 
context Socio inv: 
 programa.parceiros.servicosOferecidos 
 ->forAll(pontosACreditar = 0) 
 implies conta->isEmpty 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
77 
Estilos para especificação de restrições OCL 
• Outros: 
– Evite usar allInstances() em contextos inadequados 
 
– Evite usar collect() 
 
– Procure usar papéis em association-ends 
 
– Evite expressões complexas: 
• Quebrar em restrições menores 
• Usar variáveis locais 
• Definir atributos e/ou operações 
 
 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
78 
Roteiro 
• Contextualização e Motivação 
– UML 
– Estudo de Caso 
• A Linguagem OCL 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
14 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
79 
Como modelo isto?Com 
UML ou OCL? 
Mas, se a 
multiplicidade for 
variável? 
Como declaro, 
em UML, que um 
atributo é único? 
Enfim, UML é ambígua! 
Como tornar meu modelo 
mais preciso? 
Questões de modelagem com OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
80 
1. Como especificar restrições de unicidade? 
context Cliente inv: 
Cliente.allInstances() 
 ->forAll(c1, c2 | c1 <> c2 implies c1.rg <> c2.rg) 
Questões de modelagem com OCL 
Cliente
nome : String
pronomeTratamento : String
masculino : Boolean
dataAniversario : Data
rg : String
idade()
OCL – Object Constraint Language Franklin Ramalho – UFCG 
81 
2. Adicionar detalhes ao modelo UML versus 
adicionar restrições OCL? 
Violao Corda
0..*0..1
cordas
0..*0..1
ViolaoEletrico CordaMetalica
0..*0..1
cordas
0..*0..1
ViolaoClassico CordaPlastica
0..*0..1
cordas
0..*0..1
• Exemplo Ilustrativo: 
Questões de modelagem com OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
82 
context ViolaoClassico inv: 
 cordas->forAll(c | c.oclIsTypeOf (CordaPlastica)) 
 
context ViolaoEletrico inv: 
 cordas->forAll(c | c.oclIsTypeOf(CordaMetalica)) 
Violao Corda
0..*0..1
cordas
0..*0..1
ViolaoEletrico CordaMetalica
ViolaoClassico CordaPlastica
Questões de modelagem com OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
83 
context Violao inv: 
 tipo = TipoDeViolao::classico 
 implies cordas->forAll(tipo = TipoDeCorda::plastica) 
 
context Violao inv: 
 tipo = TipoDeViolao::eletrico 
 implies cordas->forAll(tipo = TipoDeCorda::metalica) 
Questões de modelagem com OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
84 
Roteiro 
• Contextualização e Motivação 
– UML 
– Estudo de Caso 
• A Linguagem OCL 
• Estilos para especificação em OCL 
• Questões de modelagem com OCL 
• Limitações 
• Meta-modelo 
• Exercícios 
15 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
85 
Limitações 
• Algumas fraquezas de OCL: 
 
– Restrições OCL sempre precisam ser acompanhadas de modelos 
UML 
 
– Uso de diferentes símbolos para navegação 
 
– Operações de quantificação e castings tornam a linguagem um 
pouco verborrágica 
 
– Expressões podem ser avaliadas como indefinidas 
 
– Uma expressão contendo uma relação denota um Set, enquanto que 
uma com duas relações denota um Bag. Assim, por exemplo, 
pessoa.pais.pais não é equivalente a pessoa.avos 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
86 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
87 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
88 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
89 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
90 
Meta-modelo OCL 
16 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
91 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
92 
Meta-modelo OCL 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
93 
Usando OCL em meta-modelos 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
94 
Usando OCL em meta-modelos 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
95 
Usando OCL em meta-modelos 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
96 
Usando OCL em meta-modelos 
17 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
97 
Usando OCL em meta-modelos 
OCL – Object Constraint Language Franklin Ramalho – UFCG 
98 
Referências 
• Especificação OMG: 
– http://www.omg.org 
• Livro texto: 
– The Object Constraint Language 2nd Ed. (Getting your models 
ready for MDA). Warmer, J. and Kleppe, J. Object-Technology 
Series. Addison-Wesley 2003 
• Sites: 
– http://www.klasse.nl/ 
– http://dresden-ocl.sourceforge.net/index.html 
– http://dustbin.informatik.uni-bremen.de/umlbib/ 
– http://neptune.irit.fr/Biblio/ocl_2_0.shtml

Outros materiais