UML - OCL
Franklin Ramalho
DSC-UFCG
CIn - UFPE
Roteiro

UML
– Introdução
– Diagramas
– Diagrama de classes

OCL
–
–
–
–

Introdução
Invariantes, pré e pós-Condições
Tipos
Estilos de programação e questões de modelagem
Considerações Finais
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, ...
É preciso utilizar uma linguagem expressiva, simples e padrão
Introdução

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.

Extensível
 Apenas uma linguagem
 Independente de processo
 Amplamente utilizada pelo mercado e pela academia
 Inter-disciplinar
 Não possui semântica formal bem definida
 Abrange modelagem estrutural e comportamental
 Sub-dividida em diagramas (9)
Introdução

Parte estrutural
–
–
–
–
Classes, interfaces e
relacionamentos
Objetos e
relacionamentos
Componentes e
dependências
Nodos
e configurações
Diagrama de classes
Diagrama de objetos
Diagrama de Componentes
Diagrama de Desenvolvimento
Introdução

Parte comportamental
–
–
–
–
–
Diagrama de Colaboração
Diagrama de Seqüência
Diagrama de Casos de Uso
Diagrama de estados
Diagrama de atividades
}
}
Diagramas de Interação:
Objetos, relacionamentos
Casos edemensagens
uso, atores e
relacionamentos
Máquina de estados:
Estados, transições,
eventos e atividades
Diagrama de Classes






É um diagrama que mostra um conjunto de classes,
interfaces e relacionamentos.
Responsável por modelar a parte estática do sistema
Uma classe é uma descrição de um conjunto de
objetos que compartilham os mesmos atributos,
operações, relacionamentos e semântica
Interface é uma coleção de operações que são
usadas para especificar um serviço de uma classe
Um relacionamento é uma conexão entre classes.
Pode conter notas, restrições e pacotes
Diagrama de Classes
Diagrama de Classes

Adornos aplicados às classes, atributos e operações:
– Visibilidade – especifica se ela pode ser usada por outros
classificadores
• Public (+)
• Protected (#)
• Private (-)
– Escopo – especifica se a propriedade aparece em cada
instância do classificador ou se existe apenas uma instância
da característica para todas as instâncias do classificador
• Instance (default)
• Classifier (propriedade sublinhada)
Diagrama de Classes

Outras propriedades:
– Abstract (nome da classe em itálico)
– Leaf ‘{leaf}’ após nome da classe
– Root ‘{root}’ após nome da classe
Diagrama de Classes

Um relacionamento é uma conexão entre classes.

Dependência – indica que a mudança na especificação de
uma classe deve afetar uma outra classe.

Generalização – relacionamento entre uma classe geral
(super-classe) e uma mais específica (sub-classe)
Shape
Rectangle
Square
Circle
Polygon
Diagrama de Classes

Associação é um relacionamento estrutural, que especifica
que objetos de uma classe são conectados com objetos de
uma outra classe
Person

Associação entre todo-parte é conhecida como agregação
Company
1
*
Department

Company
Company
1
1..*
Department
Composição é um tipo especial de agregação que ocorre
quando o tempo de vida do todo e da parte são iguais
Diagrama de Classes

Realização é um relacionamento entre classificadores
onde um especifica um contrato e outro garante cumpri-lo

Vários adornos aplicados às associações
– Nome, Papéis, Multiplicidade, etc.
Person
0..*
+employer
Works for
1..*
+employee
Company
Diagrama de Classe

Uma associação entre duas classes pode possuir
propriedades: classes-associação
Introdução




UML não provê todos aspectos relevantes da
especificação do sistema
Linguagem Natural é ambigua
Linguagens formais requerem forte conhecimento
matemático
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.
Introdução





Linguagem formal de fácil escrita e leitura
Não é uma linguagem de programação
Sem efeitos colaterais
Linguagem tipada
Avaliação instântanea
Introdução

Uso de OCL:
– Especificar invariantes
– Descrever pre e pos condições sobre operações e
métodos
– Servir como linguagem de navegação
Invariantes

É uma expressão cujo resultado deve ser verdadeiro
para todas as instâncias da classe, tipo ou interface
associada
 Exemplos:
Context c : Customer inv MinimumAge:
c.age() >= 18
Context Customer inv:
self.age() >= 18

Podem ser representadas através:
–
Nota no modelo UML
–
–
–
Estereótipo <<invariant>>
Arquivo separado
Tab específico provido por ferramentas
Invariantes

Exemplo:
Context membership inv:
card.owner = customer
Context CustomerCard inv:
printedName = customer.title.concat (customer.name)
Invariantes
Pre e pos-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.
Context Typename::operationName (param1 :
Type1, ...) : ReturnType
pre: param1 > ...
post: result = ...
Context LoyaltyAccount::isEmpty() : Boolean
pre: -- none
post: result = ( points = 0)
Context LoyaltyProgram::enroll(c : Customer)
pre: not customer->includes(c)
post: customer = customer@pre->including(c)
Pre e pos-condições

Podem ser representadas através:
– Nota no modelo UML
– Estereótipos <<precondition>> e
<<poscondition>>
– Arquivo separado
– Tab específico provido por ferramentas
Tipos e instâncias

Tipos Pré-definidos
– Tipos Básicos
•
•
•
•
Integer
Real
String
Boolean
– Tipos Collection
•
•
•
•

Set
Bag
Sequence
Collection
Tipos Modelo
– classes, interfaces ou tipos definidos no modelo UML
Tipos Básicos

Boolean
Context Customer inv:
title = (if isMale = true
then ‘Mr.’
else ‘Ms.’
endif)
Context Customer inv:
age() > 21 and age() < 65
Tipos Collection


Collection - supertipo abstrato usado para definir
operações comuns entre todos os tipos Collection
(Set, Bag e Sequence)
Operações:
–
–
–
–
–
–
–
–
–
–
–
size
count(object)
includes(object)
includesAll(collection)
isEmpty
notEmpty
sum()
exists(expression)
forAll(expression)
including(object)
excluding(object)
LoyaltyProgram
1..n
enroll()
+partners 1..n
ProgramPartner
numberOfCustomers : Integer
1..n
ServiceLevel
name : String
Context LoyaltyProgram inv:
serviceLevel->size = 2
LoyaltyProgram
1..n
enroll()
Context ServiceLevel inv:
loyaltyProgram.partners ->
+partners 1..n
ProgramPartner
numberOfCustomers : Integer
includesAll(availableServices.progr
amPartner)
ServiceLevel
name : String
1..n
0..n
+deliveredServices
Service
condition : Boolean
pointsEarned : Integer +availableServices
pointsBurned : Integer 0..n
description : String
Context LoyaltProgram inv:
partners.deliveredServices->forAll ( pointsEarned = 0 and
pointsBurned = 0) implies membership.loyaltyAccount->isEmpty
Tipos Collection

Tipo Set
– Subtração (-)
Set{1, 4, 7, 10} – Set {4, 7} = Set {1, 10}
– Diferença simétrica
Set{1, 4, 7, 10}.symmetricDifference(Set{4, 5, 7}) = Set{1, 5, 10}

Tipo Sequence
– first, last, at, append e prepend.
Sequence{1, 4, 7, 10}->first = 1
Sequence{1, 4, 7, 10}->last = 10
Sequence{1, 4, 7, 10}->at(3) = 7
Sequence{1, 4, 7, 10}->append( 15 ) = Sequence{1, 4, 7, 10, 15}
Sequence{1, 4, 7, 10}->prepend( 15 ) = Sequence{15, 1, 4, 7, 10}
Tipos Collection
Context ProgramPartner inv:
numberOfCustomers = loyaltyProgram.customer->size
Context ProgramPartner inv:
numberOfCustomers = loyaltyProgram.customer>asSet->size
Tipos Collection

Operações de interação
– select
Context CustomerCard inv:
self.trasactions->select( points > 100 )
–reject
– collect
Context LoyaltyAccount inv:
transaction->collect (points)-> exists (p: Integer | p = 500)
Tipos Modelo


Classes (inclusive, classes-associação), tipos e
interfaces definidos no modelo UML, são
consideradas classes em OCL.
Estes tipos possuem propriedades:
–
–
–
–

Atributos
Operações e métodos
Navegações (associações)
Enumerações (definidas como tipo de algum atributo)
Exemplos: Service, ProgramPartner, Customer, etc.
Enumeration {silver, gold} definida na classe
CustomerCard.
Tipos Modelo

Navegações são tratadas como atributos cujos tipos
são tipos modelo ou collections
– Se a multiplicidade é no máximo 1, o tipo é modelo
Context CustomerCard inv:
self.owner.age() > 18
– Se a multiplicidade > 1, o tipo é collection
Context Customer inv:
self.cards->size = 1
Tipos Modelo

Navegação em classes-associação
Context Membership inv:
program.serviceLevel->includes
(actualLevel)
Context LoyaltyProgram inv:
serviceLevel->includesAll (
membership.actualLevel)
Estilos para especificação OCL

Escolha correta do objeto Context
+husband Person +employees
0..1
0..n
wife 0..1
+employers
0..n
Company
Context Person inv:
wife.employers->intersection (self.employers)->isEmpty
and
husband.employers->intersection (self.employers)->isEmpty
Context Company inv:
employees.wife->intersection(self.employees)->isEmpty
Estilos para especificação OCL

Dividir uma restrição em várias
Context ProgramPartner inv:
partners.deliveredServices->forAll(pointsEarnerd = 0)
and membership.card->forAll(goodThru = Date.fromYMD(200.1.1))
and customer->forAll(age() > 55)
Context ProgramPartner inv:
partners.deliveredServices->forAll(pointsEarnerd = 0)
Context ProgramPartner inv:
membership.card->forAll(goodThru = Date.fromYMD(200.1.1))
Context ProgramPartner inv:
customer->forAll(age() > 55)
Estilos para especificação OCL

Adicionar atributos ou operações extras
Context Membership inv:
program.partners.deliveredServices->forAll(pointsEarned = 0)
implies LoyaltyAccount->isEmpty
Context LoyaltyProgram inv:
isSaving = partners.deliveredServices->forAll(pointsEarned = 0)
Context Membership inv:
program.isSaving implies LoyaltyAccount->isEmpty

Evitar expressões de navegação complexa
Questões de modelagem com
OCL

Adicionar detalhes ao modelo versus adicionar
restrições
+strings GuitarString
Guitar
0..1
0..n
Electric
Guitar
+strings MetalString
0..1
0..1
+strings PlasticString
ClassicGuitar
0..1
0..n
+strings GuitarString
Guitar
0..1
Electric
Guitar
0..n
MetalString
ClassicGuitar
Context ClassicGuitar inv:
strings->forAll(oclType = PlasticString)
Context ElectricGuitar inv:
strings->forAll(oclType = MetalString)
PlasticString
Context Guitar inv:
type = #classic implies strings->forAll(type = #plastic)
Context Guitar inv:
type = #electric implies strings->forAll(type = #metal)
Considerações Finais

OCL é uma linguagem que expressa informação
extra em modelos.
–
–
–
–
–
–

Formal
Fácil de ler e escrever
Declarativa
Sem efeitos colaterais
Tipada
Adotada pela OMG como parte de UML.
Extensões
–
–
–
–
–
–
Novos tipos
Novas operações
O que fazer quando uma restrição for violada
Geração de código (?)
Outros diagramas: de estados, sequência,etc
Ferramentas que permitam geração de código (?)
Download

UMLOCL