Baixe o app para aproveitar ainda mais
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
Compartilhar