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
- 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
- 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
- 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
).
4. Operadores e Iteradores
A OCL oferece iteradores funcionais para manipular coleções:
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
- Revisores e Autores Diferentes:
inv SemConflito: autores->excludesAll(revisores)
- 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`.