Linguagem de Restrições de Objetos

Desenvolvimento de Sistemas de Software

By Pedro Pereira06-11-2024

Linguagem de Restrições de Objetos (OCL)

1. Introdução à OCL (Object Constraint Language)

A OCL é uma linguagem declarativa usada para definir restrições em modelos UML, adicionando precisão e rigor sem ambiguidade. Combina orientação a objetos com elementos do paradigma funcional.

  • Origem: Desenvolvida pela IBM em 1995 como parte da IBEL, foi integrada na UML 1.1 e subsequente na UML 1.2.
  • Utilidade: Expressar invariantes, pré-condições e pós-condições nos modelos UML, resolvendo limitações gráficas destes diagramas.

2. Aplicações da OCL

  1. Invariantes de Classe e Tipos:
    Condições que devem ser verdadeiras durante todo o tempo de vida de um objeto.
    context Submissão
    inv SemConflito: self.autor <> self.revisor
    
  2. Pré-condições:
    Condições que devem ser satisfeitas antes da execução de uma operação.
    context CartãoParticipante::gasta(p: int)
    pre: saldo >= p and p >= 0
    
  3. Pós-condições:
    Condições que definem o estado do sistema após a execução de uma operação.
    post: saldo = saldo@pre - p
    

3. Sistema de Tipos na OCL

  • Tipos Primitivos: Inteiros, reais, booleanos, strings.
  • Coleções: Conjuntos (Set), listas ordenadas (OrderedSet), multisets (Bag), e sequências (Sequence).

tiposOCL.png


4. Operadores e Iteradores

A OCL oferece iteradores funcionais para manipular coleções:

operadoresOCL.png


5. Benefícios da OCL

  • Documentação Melhoria: Adiciona informações precisas e contextuais aos modelos UML.
  • Precisão Formal: Evita ambiguidades, oferecendo uma semântica clara para restrições.
  • Comunicação Eficaz: Melhora a interpretação entre equipas, especialmente em projetos complexos.

6. Exemplos de Restrições

  1. Revisores e Autores Diferentes:
    inv SemConflito: autores->excludesAll(revisores)
    
  2. Instituições Diferentes para Revisores e Autores:
    inv SemConflitoInst: 
    autores->collect(a | a.instit)->excludesAll(revisores->collect(r | r.instit))
    

7. Iteradores - Exemplos Detalhados

 self.autores->collect(a | a.instit)                   | Coleciona as instituições dos autores.
 submissões->select(s | s.autoresNãoEm(participantes)) | Filtra submissões cujos autores não estão na lista de participantes.
 submissões->collect(s | s.clone())                    | Cria uma cópia de todas as submissões selecionadas.
 forAll(a | a.id > 0)                                  | Verifica se todos os elementos têm `id > 0`.

Apresentação de conteúdos concisos.