UML - OCL Franklin Ramalho DSC-UFCG CIn - UFPE. Roteiro UML –Introdução –Diagramas –Diagrama...

Preview:

Citation preview

UML - OCL

Franklin RamalhoDSC-UFCGCIn - 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 – Diagrama de classes– Diagrama de objetos– Diagrama de Componentes– Diagrama de Desenvolvimento

Classes, interfaces e relacionamentosObjetos e relacionamentosComponentes e

dependênciasNodos e configurações

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

e mensagens} Casos de 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

Rectangle Circle Polygon

display()

Square

Shape

origin

display()move()resize()

ShapeInterface

display()move()resize()

Tipo especial de Rectangle que possui os lados de mesmo tamanho

ShapePackage

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

Rectangle Circle {leaf} Polygon

display()

Square

Shape

origin : Point = (0,0)id : Integer {addOnly}

display()move()resize()

ShapeInterface

display()move()resize()

Tipo especial de Rectangle que possui os lados de mesmo tamanho

Diagrama de Classes Um relacionamento é uma conexão entre classes.

FilmClip

name

playOn(c : Channel)

Channel

Generalização – relacionamento entre uma classe geral (super-classe) e uma mais específica (sub-classe)

Dependência – indica que a mudança na especificação de uma classe deve afetar uma outra classe.

Shape

Rectangle Circle Polygon

Square

Diagrama de Classes Associação é um relacionamento estrutural, que especifica

que objetos de uma classe são conectados com objetos de uma outra classe

Associação entre todo-parte é conhecida como agregação

Composição é um tipo especial de agregação que ocorre quando o tempo de vida do todo e da parte são iguais

Company

1

*

Department

*

1 1

1..*1..*

1

Company

Department

CompanyPerson

Diagrama de Classes

Vários adornos aplicados às associações– Nome, Papéis, Multiplicidade, etc.

Rectangle Circle {leaf} Polygon

display()

Square

Shape

origin : Point = (0,0)id : Integer {addOnly}

display()move()resize()

ShapeInterface

display()move()resize()

Tipo especial de Rectangle que possui os lados de mesmo tamanho

Realização é um relacionamento entre classificadores onde um especifica um contrato e outro garante cumpri-lo

Person

+employer

0..* 1..*

+employee

1..*0..* CompanyWorks for

Diagrama de Classe

Uma associação entre duas classes pode possuir propriedades: classes-associação

Person Company1..*0..*Works for

+employee+employer

1..*0..*

Job

descriptiondateHiredsalary

Burning Earning

Transactionpoints : Integerdate : Date

program()

LoyaltyAccountpoints : Integer

earn()burn()isEmpty()

0..n+transactions 0..n

CustomerCardvalid : BooleanvalidFrom : DategoodThru : Datecolor : enum{silver, gold}printedName : String

0..n

+transactions

0..n

+cardService

condition : BooleanpointsEarned : IntegerpointsBurned : Integerdescription : String

0..n

+transactions

0..n

Membership

0..10..1 +card

Customername : Stringtitle : Stringismale : BooleandateOfBirth : Date

age()

0..n+cards 0..n

+owner

ProgramPartnernumberOfCustomers : Integer

0..n +deliveredServices0..n

LoyaltyProgram

enroll()0..n0..n 0..n

+program

0..n1..n

1..n

1..n

+partners 1..n

ServiceLevelname : String

0..n

+availableServices

0..n

0..n0..n

+actualLevel

1..n1..n

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

Burning Earning

Transactionpoints : Integerdate : Date

program()

LoyaltyAccountpoints : Integer

earn()burn()isEmpty()

0..n+transactions 0..n

CustomerCardvalid : BooleanvalidFrom : DategoodThru : Datecolor : enum{silver, gold}printedName : String

0..n

+transactions

0..n

+cardService

condition : BooleanpointsEarned : IntegerpointsBurned : Integerdescription : String

0..n

+transactions

0..n

Membership

0..10..1 +card

Customername : Stringtitle : Stringismale : BooleandateOfBirth : Date

age()

0..n+cards 0..n

+owner

ProgramPartnernumberOfCustomers : Integer

0..n +deliveredServices0..n

LoyaltyProgram

enroll()0..n0..n 0..n

+program

0..n1..n

1..n

1..n

+partners 1..n

ServiceLevelname : String

0..n

+availableServices

0..n

0..n0..n

+actualLevel

1..n1..n

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

<<invariant>>Context Customer inv:self.age() >= 18

Customername : Stringtitle : Stringismale : BooleandateofBirth : date

age()

<<invariant>>Context Customercard inv:printedname = customer.title.concat( customer.name)

CustomerCardvalid : Booleanvalidfrom : DategoodThru : DateprintedName : string

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

LoyaltyProgram

enroll()

<<precondition>>not customer->includ...

<<postcondition>>customer = customer@pre-...

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)

ProgramPartnernumberOfCustomers : Integer

LoyaltyProgram

enroll()

ServiceLevelname : String

1..n

+partners 1..n

1..n

1..n

1..n1..n

Context LoyaltyProgram inv:

serviceLevel->size = 2

ProgramPartnernumberOfCustomers : Integer

LoyaltyProgram

enroll()

Servicecondition : BooleanpointsEarned : IntegerpointsBurned : Integerdescription : String

ServiceLevelname : String

1..n

+partners 1..n

1..n

1..n

+deliveredServices0..n0..n

+availableServices

0..n0..n

1..n1..n

Context ServiceLevel inv:

loyaltyProgram.partners ->

includesAll(availableServices.programPartner)

Context LoyaltProgram inv:

partners.deliveredServices->forAll ( pointsEarned = 0 and pointsBurned = 0) implies membership.loyaltyAccount->isEmpty

ProgramPartnernumberOfCustomers : Integer

LoyaltyProgram

enroll()

Servicecondition : BooleanpointsEarned : IntegerpointsBurned : Integerdescription : String

ServiceLevelname : String LoyaltyAccount

points : Integer

earn()burn()isEmpty()

Membership

1..n

+partners 1..n

1..n

1..n

+deliveredServices0..n0..n

+availableServices

0..n0..n

+actualLevel

1..n1..n

0..10..1

0..n0..n

Tipos Collection Tipo Set

– Subtração (-)Set{1, 4, 7, 10} – Set {4, 7} = Set {1, 10}

– Diferença simétricaSet{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 = 1Sequence{1, 4, 7, 10}->last = 10Sequence{1, 4, 7, 10}->at(3) = 7Sequence{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

0..n

Customername : Stringtitle : Stringismale : BooleandateOfBirth : Date

age()

LoyaltyProgram

enroll()

ProgramPartnernumberOfCustomers : Integer

+program

0..n 0..n0..n1..n

+partners 1..n

1..n

1..n

Tipos Collection Operações de interação

– select

Context CustomerCard inv:

self.trasactions->select( points > 100 )

LoyaltyAccountpoints : Integer

earn()burn()isEmpty()

Transactionpoints : Integerdate : Date

program()

CustomerCardvalid : BooleanvalidFrom : DategoodThru : Datecolor : enum{silver, gold}printedName : String

+transactions 0..n

+transactions

0..n

0..n

+card

0..n

–reject

– collectContext LoyaltyAccount inv:

transaction->collect (points)-> exists (p: Integer | p = 500)

LoyaltyAccountpoints : Integer

earn()burn()isEmpty()

Transactionpoints : Integerdate : Date

program()

CustomerCardvalid : BooleanvalidFrom : DategoodThru : Datecolor : enum{silver, gold}printedName : String

+transactions 0..n

+transactions

0..n

0..n

+card

0..n

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.

+card

Burning Earning

Customername : Stringtitle : Stringismale : BooleandateOfBirth : Date

LoyaltyAccountpoints : Integer

earn()burn()isEmpty()

CustomerCardvalid : BooleanvalidFrom : DategoodThru : Datecolor : enum{silver, gold}printedName : String

0..n+cards 0..n

+owner

Transactionpoints : Integerdate : Date

program()

0..n+transactions 0..n

0..n

+transactions

0..n

Servicecondition : BooleanpointsEarned : IntegerpointsBurned : Integerdescription : String

0..n

+transactions

0..n

Membership

0..10..1

ProgramPartnernumberOfCustomers : Integer

0..n +deliveredServices0..n

ServiceLevelname : String

0..n

+availableServices

0..n

0..n0..n

+actualLevel

LoyaltyProgram

enroll()0..n0..n 0..n

+program

0..n1..n

1..n

1..n

+partners 1..n

1..n1..n

+card

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

0..1

CompanyPerson

0..n0..n

+employers

0..n

+employees

0..n0..1

0..1

wife 0..1

+husband

Context Person inv:wife.employers->intersection (self.employers)->isEmptyandhusband.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

Context Membership inv:

program.partners.deliveredServices->forAll(pointsEarned = 0)

implies LoyaltyAccount->isEmpty

LoyaltyProgram

<<oclAttribute>> isSaving : Boolean

Context LoyaltyProgram inv:

isSaving = partners.deliveredServices->forAll(pointsEarned = 0)

Context Membership inv:

program.isSaving implies LoyaltyAccount->isEmpty

Evitar expressões de navegação complexa

Adicionar atributos ou operações extras

Questões de modelagem com OCL Adicionar detalhes ao modelo versus adicionar

restrições

Guitar GuitarString

0..n0..1

+strings

0..n0..1

ElectricGuitar

MetalString

0..10..1

+strings

0..10..1

ClassicGuitar PlasticString

0..n0..1

+strings

0..n0..1

Guitar GuitarString

0..n0..1

+strings

0..n0..1

ElectricGuitar

MetalString

ClassicGuitar PlasticString

Context ClassicGuitar inv:

strings->forAll(oclType = PlasticString)

Context ElectricGuitar inv:

strings->forAll(oclType = MetalString)

+strings

0..1 0..n0..1 0..n

GuitarStringtype : enum{plastic, metal}

Guitartype : enum{electric, classic}

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

Recommended