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 (?)