SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
OCL: Object
             Constraint Language


                               Setembro 2003




Eliane Martins - Instituto de Computação - UNICAMP
Referências

• UML. “Object Constraint Language Specification”. Versão
  1.1, set/1997
• “OCL: Object Constraint Language”. Transp de curso de
  Jean-Marie Favre.
• “Object Constraint Language (OCL)”. Transp de curso de
  Arif Khan.




    Eliane Martins - Instituto de Computação - UNICAMP     2
Tópicos

• O que é
• Tipos de restrições
• Expressões
• Tipos e operações




     Eliane Martins - Instituto de Computação - UNICAMP   3
OCL: Object Constraint Language

• Notação da UML utilizada para definir restrições sobre
  objetos
• 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


     Eliane Martins - Instituto de Computação - UNICAMP                   4
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



     Eliane Martins - Instituto de Computação - UNICAMP                             5
OCL

• Tipos de restrições:
   – Invariantes (inv)
        • condição (ou predicado) que se aplica a TODAS as classes (ou tipo ou
          interface 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



    Eliane Martins - Instituto de Computação - UNICAMP                         6
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árias
    formas:
      • utilizar anotação em UML
      • descrever na forma de texto:
           – uso da palavra reservada context
           – uso da palavra reservada self



     Eliane Martins - Instituto de Computação - UNICAMP          7
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




    Eliane Martins - Instituto de Computação - UNICAMP              8
OCL

• Exemplos de invariantes:
    context Cliente
   inv: idade > = 18 and self.idade < 100
                                            objeto
   context c: Cliente                  atributo

   inv CasamentoLegal: c.casado implies c.idade > = 21


                   Identificador da invariante


    Eliane Martins - Instituto de Computação - UNICAMP   9
OCL
• Invariantes sobre associações:
   – invariantes de atributos conectados
                                                                 Empregado
     através de associações:
       • referência: objeto.papel                                 nome: string
       • o valor da expressão pode ser:                           idade: integer  gerente
             – 1 objeto, se a multiplicidade da                   casado: boolean 1
               associação é 0..1 ou 1                      subordinado *
               ex.: self.gerente -- é do tipo Empregado
             – 1 coleção de objetos, se a multiplicidade
               >1
               ex.: self.subordinado -- é do tipo
               conjunto {Empregado}
             è coleções serão abordadas mais para
               frente


      Eliane Martins - Instituto de Computação - UNICAMP                           10
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


    Eliane Martins - Instituto de Computação - UNICAMP                11
OCL

• Exemplos de pré e pós condições:
   context Pessoa :: faz_aniversario ( )
   post: idade = idade@pre + 1

   context Calculadora :: divisão_inteira (x:Integer, y: Integer)
   pre regraDivisor: y ≠0
   post: result = x / y




    Eliane Martins - Instituto de Computação - UNICAMP              12
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

  cria ( )

 pilha       insere (item )
 vazia                        pilha não      insere (item) {self.nroItens = Max}
                                vazia
                                                                                   pilha
                                                                                   cheia
                          insere (item) {self.nroItens < Max}

    Eliane Martins - Instituto de Computação - UNICAMP                                     13
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




   Eliane Martins - Instituto de Computação - UNICAMP   14
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 expr
   Obs.: propriedade em OCL pode ser: atributo, operação, método, extremidade de
     associação

       Eliane Martins - Instituto de Computação - UNICAMP                          15
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 A
           self.A :: p1 -- acesso a propriedade p1 definida em A
           self.B :: p1 -- acesso a propriedade p1 definida em B


     Eliane Martins - Instituto de Computação - UNICAMP                      16
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




    Eliane Martins - Instituto de Computação - UNICAMP   17
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 endif
       desconto = (if idade < 20 then 25 else 15 endif)


      Eliane Martins - Instituto de Computação - UNICAMP                        18
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( )




      Eliane Martins - Instituto de Computação - UNICAMP   19
OCL - Tipos e operações

• Tipos enumerados (enum)
   – definição:
       • enum {segunda, terça, quarta, quinta, sexta}
   – utilização:
       • #quarta
   – operações: -, = , <>




      Eliane Martins - Instituto de Computação - UNICAMP   20
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}



    Eliane Martins - Instituto de Computação - UNICAMP   21
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



    Eliane Martins - Instituto de Computação - UNICAMP   22
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
    Eliane Martins - Instituto de Computação - UNICAMP   23
Coleções: operações básicas

Cardinalidade                             coleção -> size
Nú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 -> isEmpty
Checa se não vazio                        coleção -> notEmpty
Soma de elementos                         coleção -> sum


    Eliane Martins - Instituto de Computação - UNICAMP                24
Conjuntos: operações básicas

União                                     conj1 -> union (conj2)
Interseção                                conj1 -> intersection (conj2)
Diferença                                 conj1 - conj2
Inclusão de elemento                      conj -> including(elem)
Exclusão de elemento                      conj -> excluding(elem)
Converte para seqüência                   conj -> asSequence
Converte para “saco”                      conj -> asBag



    Eliane Martins - Instituto de Computação - UNICAMP                    25
Coleção: filtragem

• Seleção de elementos que satisfazem a uma condição:
      coleção -> select(cond)
   ex.: self.empregado->select(idade>55 and sexo = #masculino)

                                  enum{masculino, feminino}


• 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’)

    Eliane Martins - Instituto de Computação - UNICAMP               26
Coleção: imagem

• Corresponde à imagem de um função em matemática:
      coleção -> collect (expr)
   – a expressão é avaliada para cada elemento da coleção
   – o retorno da avaliação é um “saco” com os resultados
   ex.:
       self.empregados -> collect (idade) è Bag{22, 37, 25, 22, 44, 52}
       self.empregados -> collect (idade) -> asSet è obtém conjunto
       self.empregados -> collect (salário) -> sum

       • pode-se escrever de forma simplificada:
       self.empregados -> collect (idade) ↔ self.empregados.idade

    Eliane Martins - Instituto de Computação - UNICAMP                    27
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ção
       coleção -> exists(cond)
    retorna verdade se a cond é satisfeita por pelo menos um elemento da
       coleçã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 endif
    self.empregados-> exists( p: Pessoa | p.sobrenome = ‘Martins’)


     Eliane Martins - Instituto de Computação - UNICAMP                        28
Coleção: determinação de unicidade

• Retorna verdade se para cada elemento da coleção
  a 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)




    Eliane Martins - Instituto de Computação - UNICAMP          29
Operações relativas ao diagrama de
classes

• OCL oferece várias operações sobre o diagrama de classes:
   – acesso a atributos e métodos
       • acesso a um atributo: objeto.atributo
         ex.: self.anodeProdução     self.idade
       • acesso a método: objeto.método(expr1, expr2, ...)
         ex.: self.calcula_media(turma00)
   – navegação pelas associações
   – acesso a tipos e supertipos
   – acesso às instâncias de uma classe




    Eliane Martins - Instituto de Computação - UNICAMP       30
Navegação através de uma associação
• A partir de um objeto (contexto) é possível o acesso a
  objetos 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




      Eliane Martins - Instituto de Computação - UNICAMP                31
Navegação através de uma associação
  Pessoa                                                          Empresa
  écasado: Boolean       0..* empregado            0..* empregador nome: String
  temEmprego: Boolean                                             nroEmpregados: Integer
  idade: Integer        0..1 mulher                               capital( )
  prenome: String                          Emprego
  sobrenome: String                        cargo: String
  sexo: enum{fem, masc}                    dataInicio: Date
  salario(data): Real                      salario: Real
  0..1 marido

• Exemplos:
   Pessoa
   self.marido        -- é do tipo Pessoa
   self.empregador -- é do tipo Set (Empresa)
   self.marido-> nonEmpty implies self.marido.sexo = #masc
   not ( (self.mulher -> size = 1 and (self.marido -> size = 1) )

       Eliane Martins - Instituto de Computação - UNICAMP                                  32
Navegação para uma associação

• Se a associação é uma classe, pode-se ter acesso a ela
  atravé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.:                       Þ resultado é convertido em um singleton
       Pessoa
       self.emprego -> collect(salario) -> sum




    Eliane Martins - Instituto de Computação - UNICAMP                 33
Navegação para uma associação
• Se a associação (classe) é reflexiva, pode-se indicar o
  papel para evitar ambigüidade:
    – objeto.nome_da_associação [papel]

  Pessoa
  écasado: Boolean
  temEmprego: Boolean
  idade: Integer        0..1 mulher                   Pessoa:
  prenome: String                                     self.casamento [mulher].local
  sobrenome: String
  sexo: enum{fem, masc}
  salario(data): Real
  0..1 marido                         Casamento
                                      local: String
                                      data: Date

       Eliane Martins - Instituto de Computação - UNICAMP                             34
Navegação a partir de uma associação

• Pode-se navegar a partir da associação (classe) para os
  objetos 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:
       Emprego
       self.empregador
       self.empregado




    Eliane Martins - Instituto de Computação - UNICAMP              35
Navegação através de associação
    qualificada
    • Associações qualificadas usam 1 ou + atributos para selecionar objetos
      na outra ponta da associação
    • Para navegar através dela, pode-se indicar um valor para o(s)
      atributo(s) usado(s) como qualificador(es):
                           objeto.papel [valor]

                              Pessoa
Banco                         écasado: Boolean
numero: Integer               temEmprego: Boolean
agencia: Integer      cliente idade: Integer        0..1 mulher
                              prenome: String
                              sobrenome: String              Banco:
nroConta: Integer
                              sexo: enum{fem, masc}          self.cliente -- Set(Pessoa)
     0..1
                              salario(data): Real            self.cliente [4001155] -- 1 objeto
                              0..1 marido                        Pessoa com nro de conta dado


            Eliane Martins - Instituto de Computação - UNICAMP                            36
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 tipo
  objeto.oclIsKindOf (tipo)
  – retorna true se o tipo do objeto é tipo ou algum de seus
    supertipos
  objeto.oclAsType (tipo)
  – conversão de tipo (casting)
   Eliane Martins - Instituto de Computação - UNICAMP      37
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 < 500
            Pessoa.allInstances -> forall (p1, p2 | p1 <> p2 implies p1.sobrenome <>
              p2.sobrenome)
            Banco.allInstances -> isUnique (numero)




        Eliane Martins - Instituto de Computação - UNICAMP                             38

Mais conteúdo relacionado

Mais procurados

1.Introdução Banco de Dados
1.Introdução Banco de Dados1.Introdução Banco de Dados
1.Introdução Banco de Dadosvini_campos
 
Optimización global
Optimización globalOptimización global
Optimización globalSaory Rma
 
Análise e Modelagem de Software
Análise e Modelagem de SoftwareAnálise e Modelagem de Software
Análise e Modelagem de SoftwareMarcelo Yamaguti
 
Aula diagrama de atividade 3º periodo uniao
Aula diagrama de atividade 3º periodo uniaoAula diagrama de atividade 3º periodo uniao
Aula diagrama de atividade 3º periodo uniaoMaria Alice Jovinski
 
Diagramas de Fluxo de Dados
Diagramas de Fluxo de DadosDiagramas de Fluxo de Dados
Diagramas de Fluxo de DadosJanynne Gomes
 
O Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareO Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareCamilo de Melo
 
Aula 1 requisitos
Aula 1   requisitosAula 1   requisitos
Aula 1 requisitoslicardino
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02thomasdacosta
 
Conceitos Básicos Sobre Analise de Sistemas
Conceitos Básicos Sobre Analise de SistemasConceitos Básicos Sobre Analise de Sistemas
Conceitos Básicos Sobre Analise de SistemasClayton de Almeida Souza
 
Análise e Projeto de Sistemas com UML e Java
Análise e Projeto de Sistemas com UML e JavaAnálise e Projeto de Sistemas com UML e Java
Análise e Projeto de Sistemas com UML e Javaarmeniocardoso
 
Caderno de info(banco de dados).
Caderno de info(banco de dados).Caderno de info(banco de dados).
Caderno de info(banco de dados).Ajudar Pessoas
 
Aula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoAula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoVinícius de Paula
 

Mais procurados (20)

1.Introdução Banco de Dados
1.Introdução Banco de Dados1.Introdução Banco de Dados
1.Introdução Banco de Dados
 
Arquitetura MVC
Arquitetura MVCArquitetura MVC
Arquitetura MVC
 
Optimización global
Optimización globalOptimización global
Optimización global
 
Análise e Modelagem de Software
Análise e Modelagem de SoftwareAnálise e Modelagem de Software
Análise e Modelagem de Software
 
Aula diagrama de atividade 3º periodo uniao
Aula diagrama de atividade 3º periodo uniaoAula diagrama de atividade 3º periodo uniao
Aula diagrama de atividade 3º periodo uniao
 
Diagramas de Fluxo de Dados
Diagramas de Fluxo de DadosDiagramas de Fluxo de Dados
Diagramas de Fluxo de Dados
 
Projeto de Software
Projeto de SoftwareProjeto de Software
Projeto de Software
 
Uml
UmlUml
Uml
 
O Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de SoftwareO Processo de Desenvolvimento de Software
O Processo de Desenvolvimento de Software
 
Aula 1 requisitos
Aula 1   requisitosAula 1   requisitos
Aula 1 requisitos
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
Algoritmo 04 - Estruturas de decisão
 Algoritmo 04 - Estruturas de decisão Algoritmo 04 - Estruturas de decisão
Algoritmo 04 - Estruturas de decisão
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02
 
Introdução à linguagem UML
Introdução à linguagem UMLIntrodução à linguagem UML
Introdução à linguagem UML
 
UML - Diagrama de Pacotes
UML - Diagrama de PacotesUML - Diagrama de Pacotes
UML - Diagrama de Pacotes
 
Conceitos Básicos Sobre Analise de Sistemas
Conceitos Básicos Sobre Analise de SistemasConceitos Básicos Sobre Analise de Sistemas
Conceitos Básicos Sobre Analise de Sistemas
 
Análise e Projeto de Sistemas com UML e Java
Análise e Projeto de Sistemas com UML e JavaAnálise e Projeto de Sistemas com UML e Java
Análise e Projeto de Sistemas com UML e Java
 
Aula 7 - Modelagem de Software
Aula 7 - Modelagem de SoftwareAula 7 - Modelagem de Software
Aula 7 - Modelagem de Software
 
Caderno de info(banco de dados).
Caderno de info(banco de dados).Caderno de info(banco de dados).
Caderno de info(banco de dados).
 
Aula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de ProjetoAula 02 - UML e Padrões de Projeto
Aula 02 - UML e Padrões de Projeto
 

Destaque (7)

OCL
OCL OCL
OCL
 
DSL and EMFText
DSL and EMFTextDSL and EMFText
DSL and EMFText
 
OCL tutorial
OCL tutorial OCL tutorial
OCL tutorial
 
Projeto de sistemas com UML - Parte 1
Projeto de sistemas com UML - Parte 1Projeto de sistemas com UML - Parte 1
Projeto de sistemas com UML - Parte 1
 
Formal Methods lecture 01
Formal Methods lecture 01Formal Methods lecture 01
Formal Methods lecture 01
 
Ch5- Software Engineering 9
Ch5- Software Engineering 9Ch5- Software Engineering 9
Ch5- Software Engineering 9
 
OCL in EMF
OCL in EMFOCL in EMF
OCL in EMF
 

Semelhante a OCL Linguagem Restrição Objeto

Desenvolvimento em .Net - Estruturas Basicas
Desenvolvimento em .Net - Estruturas BasicasDesenvolvimento em .Net - Estruturas Basicas
Desenvolvimento em .Net - Estruturas BasicasVitor Silva
 
Algoritmos e Programação: Estruturas de condição
Algoritmos e Programação: Estruturas de condiçãoAlgoritmos e Programação: Estruturas de condição
Algoritmos e Programação: Estruturas de condiçãoAlex Camargo
 
GOTEST-Aula4-Automacao-Parte1.pdf
GOTEST-Aula4-Automacao-Parte1.pdfGOTEST-Aula4-Automacao-Parte1.pdf
GOTEST-Aula4-Automacao-Parte1.pdfRodolphoCesar2
 
Desenvolvimento em .Net - Excepções
Desenvolvimento em .Net - ExcepçõesDesenvolvimento em .Net - Excepções
Desenvolvimento em .Net - ExcepçõesVitor Silva
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordidaLuciano Ramalho
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: IntroduçãoWesley R. Bezerra
 

Semelhante a OCL Linguagem Restrição Objeto (14)

Desenvolvimento em .Net - Estruturas Basicas
Desenvolvimento em .Net - Estruturas BasicasDesenvolvimento em .Net - Estruturas Basicas
Desenvolvimento em .Net - Estruturas Basicas
 
Algoritmos e Programação: Estruturas de condição
Algoritmos e Programação: Estruturas de condiçãoAlgoritmos e Programação: Estruturas de condição
Algoritmos e Programação: Estruturas de condição
 
Simulador de Processos EMSO
Simulador de Processos EMSOSimulador de Processos EMSO
Simulador de Processos EMSO
 
Visualg
VisualgVisualg
Visualg
 
GOTEST-Aula4-Automacao-Parte1.pdf
GOTEST-Aula4-Automacao-Parte1.pdfGOTEST-Aula4-Automacao-Parte1.pdf
GOTEST-Aula4-Automacao-Parte1.pdf
 
Desenvolvimento em .Net - Excepções
Desenvolvimento em .Net - ExcepçõesDesenvolvimento em .Net - Excepções
Desenvolvimento em .Net - Excepções
 
Apostila c++
Apostila c++Apostila c++
Apostila c++
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
05 poo-ii
05   poo-ii05   poo-ii
05 poo-ii
 
Java Básico
Java BásicoJava Básico
Java Básico
 
Java Básico :: Introdução
Java Básico :: IntroduçãoJava Básico :: Introdução
Java Básico :: Introdução
 
Aula3
Aula3Aula3
Aula3
 
02 controle de fluxo
02   controle de fluxo02   controle de fluxo
02 controle de fluxo
 

Mais de elliando dias

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScriptelliando dias
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structureselliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de containerelliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Webelliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduinoelliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorceryelliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Designelliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makeselliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebookelliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Studyelliando dias
 

Mais de elliando dias (20)

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
 
Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 

OCL Linguagem Restrição Objeto

  • 1. OCL: Object Constraint Language Setembro 2003 Eliane Martins - Instituto de Computação - UNICAMP
  • 2. Referências • UML. “Object Constraint Language Specification”. Versão 1.1, set/1997 • “OCL: Object Constraint Language”. Transp de curso de Jean-Marie Favre. • “Object Constraint Language (OCL)”. Transp de curso de Arif Khan. Eliane Martins - Instituto de Computação - UNICAMP 2
  • 3. Tópicos • O que é • Tipos de restrições • Expressões • Tipos e operações Eliane Martins - Instituto de Computação - UNICAMP 3
  • 4. OCL: Object Constraint Language • Notação da UML utilizada para definir restrições sobre objetos • 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 Eliane Martins - Instituto de Computação - UNICAMP 4
  • 5. 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 Eliane Martins - Instituto de Computação - UNICAMP 5
  • 6. OCL • Tipos de restrições: – Invariantes (inv) • condição (ou predicado) que se aplica a TODAS as classes (ou tipo ou interface 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 Eliane Martins - Instituto de Computação - UNICAMP 6
  • 7. 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árias formas: • utilizar anotação em UML • descrever na forma de texto: – uso da palavra reservada context – uso da palavra reservada self Eliane Martins - Instituto de Computação - UNICAMP 7
  • 8. 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 Eliane Martins - Instituto de Computação - UNICAMP 8
  • 9. OCL • Exemplos de invariantes: context Cliente inv: idade > = 18 and self.idade < 100 objeto context c: Cliente atributo inv CasamentoLegal: c.casado implies c.idade > = 21 Identificador da invariante Eliane Martins - Instituto de Computação - UNICAMP 9
  • 10. OCL • Invariantes sobre associações: – invariantes de atributos conectados Empregado através de associações: • referência: objeto.papel nome: string • o valor da expressão pode ser: idade: integer gerente – 1 objeto, se a multiplicidade da casado: boolean 1 associação é 0..1 ou 1 subordinado * ex.: self.gerente -- é do tipo Empregado – 1 coleção de objetos, se a multiplicidade >1 ex.: self.subordinado -- é do tipo conjunto {Empregado} è coleções serão abordadas mais para frente Eliane Martins - Instituto de Computação - UNICAMP 10
  • 11. 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 Eliane Martins - Instituto de Computação - UNICAMP 11
  • 12. OCL • Exemplos de pré e pós condições: context Pessoa :: faz_aniversario ( ) post: idade = idade@pre + 1 context Calculadora :: divisão_inteira (x:Integer, y: Integer) pre regraDivisor: y ≠0 post: result = x / y Eliane Martins - Instituto de Computação - UNICAMP 12
  • 13. 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 cria ( ) pilha insere (item ) vazia pilha não insere (item) {self.nroItens = Max} vazia pilha cheia insere (item) {self.nroItens < Max} Eliane Martins - Instituto de Computação - UNICAMP 13
  • 14. 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 Eliane Martins - Instituto de Computação - UNICAMP 14
  • 15. 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 expr Obs.: propriedade em OCL pode ser: atributo, operação, método, extremidade de associação Eliane Martins - Instituto de Computação - UNICAMP 15
  • 16. 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 A self.A :: p1 -- acesso a propriedade p1 definida em A self.B :: p1 -- acesso a propriedade p1 definida em B Eliane Martins - Instituto de Computação - UNICAMP 16
  • 17. 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 Eliane Martins - Instituto de Computação - UNICAMP 17
  • 18. 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 endif desconto = (if idade < 20 then 25 else 15 endif) Eliane Martins - Instituto de Computação - UNICAMP 18
  • 19. 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( ) Eliane Martins - Instituto de Computação - UNICAMP 19
  • 20. OCL - Tipos e operações • Tipos enumerados (enum) – definição: • enum {segunda, terça, quarta, quinta, sexta} – utilização: • #quarta – operações: -, = , <> Eliane Martins - Instituto de Computação - UNICAMP 20
  • 21. 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} Eliane Martins - Instituto de Computação - UNICAMP 21
  • 22. 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 Eliane Martins - Instituto de Computação - UNICAMP 22
  • 23. 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 Eliane Martins - Instituto de Computação - UNICAMP 23
  • 24. Coleções: operações básicas Cardinalidade coleção -> size Nú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 -> isEmpty Checa se não vazio coleção -> notEmpty Soma de elementos coleção -> sum Eliane Martins - Instituto de Computação - UNICAMP 24
  • 25. Conjuntos: operações básicas União conj1 -> union (conj2) Interseção conj1 -> intersection (conj2) Diferença conj1 - conj2 Inclusão de elemento conj -> including(elem) Exclusão de elemento conj -> excluding(elem) Converte para seqüência conj -> asSequence Converte para “saco” conj -> asBag Eliane Martins - Instituto de Computação - UNICAMP 25
  • 26. Coleção: filtragem • Seleção de elementos que satisfazem a uma condição: coleção -> select(cond) ex.: self.empregado->select(idade>55 and sexo = #masculino) enum{masculino, feminino} • 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’) Eliane Martins - Instituto de Computação - UNICAMP 26
  • 27. Coleção: imagem • Corresponde à imagem de um função em matemática: coleção -> collect (expr) – a expressão é avaliada para cada elemento da coleção – o retorno da avaliação é um “saco” com os resultados ex.: self.empregados -> collect (idade) è Bag{22, 37, 25, 22, 44, 52} self.empregados -> collect (idade) -> asSet è obtém conjunto self.empregados -> collect (salário) -> sum • pode-se escrever de forma simplificada: self.empregados -> collect (idade) ↔ self.empregados.idade Eliane Martins - Instituto de Computação - UNICAMP 27
  • 28. 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ção coleção -> exists(cond) retorna verdade se a cond é satisfeita por pelo menos um elemento da coleçã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 endif self.empregados-> exists( p: Pessoa | p.sobrenome = ‘Martins’) Eliane Martins - Instituto de Computação - UNICAMP 28
  • 29. Coleção: determinação de unicidade • Retorna verdade se para cada elemento da coleção a 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) Eliane Martins - Instituto de Computação - UNICAMP 29
  • 30. Operações relativas ao diagrama de classes • OCL oferece várias operações sobre o diagrama de classes: – acesso a atributos e métodos • acesso a um atributo: objeto.atributo ex.: self.anodeProdução self.idade • acesso a método: objeto.método(expr1, expr2, ...) ex.: self.calcula_media(turma00) – navegação pelas associações – acesso a tipos e supertipos – acesso às instâncias de uma classe Eliane Martins - Instituto de Computação - UNICAMP 30
  • 31. Navegação através de uma associação • A partir de um objeto (contexto) é possível o acesso a objetos 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 Eliane Martins - Instituto de Computação - UNICAMP 31
  • 32. Navegação através de uma associação Pessoa Empresa écasado: Boolean 0..* empregado 0..* empregador nome: String temEmprego: Boolean nroEmpregados: Integer idade: Integer 0..1 mulher capital( ) prenome: String Emprego sobrenome: String cargo: String sexo: enum{fem, masc} dataInicio: Date salario(data): Real salario: Real 0..1 marido • Exemplos: Pessoa self.marido -- é do tipo Pessoa self.empregador -- é do tipo Set (Empresa) self.marido-> nonEmpty implies self.marido.sexo = #masc not ( (self.mulher -> size = 1 and (self.marido -> size = 1) ) Eliane Martins - Instituto de Computação - UNICAMP 32
  • 33. Navegação para uma associação • Se a associação é uma classe, pode-se ter acesso a ela atravé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.: Þ resultado é convertido em um singleton Pessoa self.emprego -> collect(salario) -> sum Eliane Martins - Instituto de Computação - UNICAMP 33
  • 34. Navegação para uma associação • Se a associação (classe) é reflexiva, pode-se indicar o papel para evitar ambigüidade: – objeto.nome_da_associação [papel] Pessoa écasado: Boolean temEmprego: Boolean idade: Integer 0..1 mulher Pessoa: prenome: String self.casamento [mulher].local sobrenome: String sexo: enum{fem, masc} salario(data): Real 0..1 marido Casamento local: String data: Date Eliane Martins - Instituto de Computação - UNICAMP 34
  • 35. Navegação a partir de uma associação • Pode-se navegar a partir da associação (classe) para os objetos 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: Emprego self.empregador self.empregado Eliane Martins - Instituto de Computação - UNICAMP 35
  • 36. Navegação através de associação qualificada • Associações qualificadas usam 1 ou + atributos para selecionar objetos na outra ponta da associação • Para navegar através dela, pode-se indicar um valor para o(s) atributo(s) usado(s) como qualificador(es): objeto.papel [valor] Pessoa Banco écasado: Boolean numero: Integer temEmprego: Boolean agencia: Integer cliente idade: Integer 0..1 mulher prenome: String sobrenome: String Banco: nroConta: Integer sexo: enum{fem, masc} self.cliente -- Set(Pessoa) 0..1 salario(data): Real self.cliente [4001155] -- 1 objeto 0..1 marido Pessoa com nro de conta dado Eliane Martins - Instituto de Computação - UNICAMP 36
  • 37. 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 tipo objeto.oclIsKindOf (tipo) – retorna true se o tipo do objeto é tipo ou algum de seus supertipos objeto.oclAsType (tipo) – conversão de tipo (casting) Eliane Martins - Instituto de Computação - UNICAMP 37
  • 38. 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 < 500 Pessoa.allInstances -> forall (p1, p2 | p1 <> p2 implies p1.sobrenome <> p2.sobrenome) Banco.allInstances -> isUnique (numero) Eliane Martins - Instituto de Computação - UNICAMP 38