Sie sind auf Seite 1von 131

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Construo e Teste de Modelos Executveis Integrando VDM++ e UML


Joo Pascoal Faria
jpf@fe.up.pt www.fe.up.pt/~jpf

UCE30 Mtodos Formais em Engenharia de Software, Universidade do Minho, Braga, 24 e 31 de Janeiro de 2008

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Plano
Pr-condies:
Conhecimentos bsicos de VDM-SL, UML e OOP

Escalonamento:
24/1/08, 13-16h, Teoria, Parte I - modelao de estrutura, espec. inv/pre/post 31/1/08, 13-16h, Teoria, Parte II - modelos executveis, testes, asp. dinmicos 31/1/08, 16-19h, Prtica - VDM Tools, Rational Rose, projecto

Ps-condies:
Saber construir um modelo formal executvel em VDM++ Saber validar o modelo atravs de testes automatizados em VDM++ Saber integrar diagramas UML com especificaes em VDM++ Conhecer as capacidades de round-trip engineering c/ Rational Rose e VDM Tools Conhecer a aplicabilidade, vantagens e limitaes das tcnicas exploradas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

ndice
Parte I - Modelao de estrutura e especificao de invariantes e pr/ps-condies
Motivao Estrutura geral duma especificao em VDM++ Importao de diagramas de classes UML Definio de invariantes Definio de pr e ps-condies e relao com diagramas de estados UML

Parte II Modelos executveis, testes, aspectos dinmicos


Definio do corpo algortmico de operaes com instrues e aces Teste da especificao e relao com diagramas de sequncia UML Modelao de eventos temporais Concorrncia e sincronizao
Anexo A: Utilizao da ferramenta VDMTools Lite Anexo B: Operadores e expresses em VDM++ Anexo C: Funes avanadas em VDM++ Anexo D: Exemplo da Agenda Corporativa Anexo E: Exemplo da Colocao de Professores
3

Referncias

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Motivao

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

De UML a VDM++
Modelo visual semi-formal
ud cd sd

UC1 UC1
utilidade

C1 C2
estrutura

C1

S1

e[c]/a

S2

S3
comportamento

Standard bem aceite p/OOAD Bom p/comunicar e documentar Mltiplas vistas Base p/gerar esqueletos cdigo Incompleto Pouco rigoroso Sujeito a erros

Enriquecer c/especificao formal de inv/pre/post

Enriquecer com aces executveis

Modelo formal
(ling. restries: OCL, VDM++,)
inv m() pre post Especificao completa, no ambgua, verificvel Mais detalhe

Modelo executvel (e traduzvel)


(ling. aces: OAL, VDM++,)
m() body e / actions Prottipo executvel Testvel Mais detalhe Prx. implementao Gerao cdigo completo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Modelos visuais (semi-formais) em UML


Diagramas UML so muito usados nas fases anlise de requisitos e desenho do sistema, para comunicar e raciocinar sobre requisitos e decises de desenho Gerao de algum cdigo (Java, C#, SQL, XSD, etc.) a partir de UML (esqueletos de cdigo e no cdigo completamente funcional) Problemas: informais, incompletos, muito sujeitos a erros Podem ser enriquecidos em duas direces ortogonais (mas combinveis):
No sentido de chegar a um modelo formal No sentido de chegar a um modelo executvel (e traduzvel)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Modelos formais
possvel enriquecer os modelos visuais (semi-formais) com especificaes formais de
restries de estado (por invariantes) semntica de operaes (por pr-condies e ps-condies)

A prpria norma UML define uma linguagem para este efeito: OCL (Object Constraint Language) Obtm-se um modelo formal que funciona como especificao rigorosa (sem ambiguidades, inconsistncias ou omisses), detalhada e verificvel do sistema
A especificao formal remove ambiguidades da especificao informal (embora custa de maior detalhe) A especificao formal verificvel por mquinas: por exemplo, existem ferramentas que geram asseres em Java a partir de especificaes de invariantes, pr-condies e ps-condies em OCL

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Modelos executveis
possvel enriquecer os modelos visuais com especificaes do corpo algortmico de operaes (bem como de aces e actividades) em linguagens de aces de alto nvel A prpria norma UML define a sintaxe abstracta (capacidades) de uma linguagem de aces de alto nvel (UML Action Semantics)
A linguagem concreta no fixada pela norma, mas existem vrias linguagens concretas compatveis com a norma

Obtm-se um modelo executvel, que serve como prottipo executvel do sistema, permitindo testar e validar precocemente validar requisitos e opes de design

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Modelos traduzveis
Os modelos executveis so tambm facilmente traduzveis (por um compilador de modelos) para uma linguagem de implementao alvo Estamos a falar de gerao automtica de cdigo completamente funcional e no s esqueletos de classes Particularidades das linguagens, tecnologias e plataformas-alvo so embebidas nos geradores (conceito MDA Model Driven Architecture) Vantagens: Aumento de produtividade, foco no domnio do problema e no nas tecnologias de implementao Desvantagens: Cdigo gerado pode ser pouco eficiente, continuando a ser necessrio escrever cdigo na linguagem-alvo!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Modelos visuais, formais, executveis e traduzveis: que soluo integrada?


Em torno da norma UML tm surgido linguagens que permitem criar modelos formais - caso de OCL - e modelos executveis e traduzveis como xUML - mas ainda no de forma perfeitamente integrada Em contrapartida, VDM++ uma linguagem de especificao formal OO que permite criar modelos formais, executveis e traduzveis, sendo suportada por ferramentas (VDMTools) que permitem executar e testar os modelos, sincronizar com Rational Rose (diagramas UML) e gerar cdigo Java e C++ OCL e xUML tero mais importncia no futuro, no entanto VDM++ presentemente uma soluo mais madura, integrada e suportada por ferramentas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

10

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Estrutura geral duma especificao em VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

11

Caractersticas gerais de VDM++


Baseada no standard VDM-SL Linguagem de especificao formal baseada em modelos (i.e., com representao explcita de estado) orientada por objectos Combina dois paradigmas
Paradigma funcional: tipos, funes e valores (instncias de tipos) Paradigma OO: classes, variveis de instncia, operaes e objectos (instncias de classes)

Suportada por ferramentas VDMTools que permitem:


Executar uma especificao escrita em VDM++ Testar a especificao e analisar a cobertura dos testes Sincronizar com diagramas de classes UML na ferramenta Rational Rose Gerar cdigo Java e C++

Disponvel em duas notaes: ASCII ou smbolos matemticos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

12

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Estrutura duma especificao em VDM++


class <class-name> <classParadigma OO instance variables ... types Paradigma funcional Paradigma OO values functions operations ... thread ... sync ... end <class-name> <classConstruo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Internal object state

Definitions

Dynamic behaviour Synchronization control

13

Classes
Uma especificao em VDM++ organizada em classes Classes so tipos referncia (reference types)
Tal como na generalidade das linguagens OO Instncias so objectos mutveis acessveis por uma referncia Varivel do tipo C, em que C uma classe, contm uma referncia para o objecto com os dados, e no os prprios dados Comparao e atribuio operam com referncias

Usar para modelar o estado do sistema


Estado representado pelo conjunto de objectos existentes e pelos valores das suas variveis de instncia Classes representam tipos de entidades fsicas (pessoa, livro, sala, ), papis (professor, aluno, ), acontecimentos (aula, ), documentos (factura, contracto, ), etc.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

14

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Variveis de instncia
Correspondem a atributos em UML e campos em Java e C# Podem ser private (por omisso), public ou protected Podem ser static (estticas) Declaradas na seco instance variables com a sintaxe:
[private | public | protected] [static] nome : tipo [ := valor_inicial];

Podem-se definir invariantes (inv) que restringem os valores vlidos das variveis de instncia
A tratar mais tarde

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

15

Operaes
parmetros de entrada (argumentos) Operao (pre, body, post) Estado (variveis de instncia e globais) parmetros de sada (resultado)

Correspondem a operaes em UML e mtodos em Java ou C# Podem ser private (por omisso), public ou protected Podem ser static Podem consultar ou modificar o estado de objs (dado por vars de instncia) ou o estado global do sistema (dado por vars estticas) Podem ter pr-condio, corpo (definio explcita, imperativa) e pscondio (definio implcita)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

16

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

Operaes definio
Estilo 1:
resultado tipo op(a: A, b: B, , z: Z) r: R == bodystmt omitir quando no retorna nada ext rd instvarx, instvary, wr instvarz, instvarw, pre preexpr(a, b, , instvar1, instvar2, ) post postexpr(a, b, , r, instvar1, instvar2, , instvar1~, instvar2~, ) ; tipo quando no h argumentos ou resultados, escrever () op: A * B * ==> R op(a,b,) == nome pr-definido para o valor retornado bodystmt pre preexpr(a, b,, instvar1, instvar2, ) post postexpr(a, b,, RESULT, instvar1, instvar2, , instvar1~, instvar2~, ) ; argumento

Estilo 2:

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

17

Operaes partes da definio


Pr-condio (pre) - restrio nos valores dos argumentos e variveis de instncia, a verificar na chamada
Pode ser omitida (mesmo que true)

Corpo algortmico (bodysmt) - instruo ou bloco de instrues entre ( )


Permite exprimir algoritmo e executar a operao (definio explcita) Paradigma imperativo: c/atribuies, declarao variveis, etc. Operao abstracta: is subclass responsibility Operao por definir: is not yet specified, ou omitir ==bodystmt no estilo 1

Ps-condio (post) - restrio nos valores dos argumentos, resultado, valores iniciais (~) e finais das var.s de instncia, a verificar no retorno
Permite verificar o resultado/efeito da operao (definio implcita) Pode ser omitida (mesmo que true)

Clusula ext (externals) - lista as variveis de instncias que podem ser lidas (rd) e actualizadas (wr) no corpo da operao
Obrigatrio indicar no estilo 1, quando se indica a ps-condio

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

18

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

10

Exemplo de classe

Stack
Mais recente cabea

- elements: seq of int = [] - capacity: nat + Stack(c: nat) + Push(x: int) + Pop() + Top(): int constraints {len elements <= capacity}

Remove mas no devolve Consulta mas no remove

DEMO

class Stack instance variables private elements : seq of int := []; private capacity: nat; inv len elements <= capacity; operations public Stack(c : nat) res: Stack == (elements := []; capacity := c) ext wr elements, capacity post elements = [] and capacity = c ; public Push(x: int) == elements := [x] ^ elements ext wr elements pre len elements < capacity post elements = [x] ^ elements~ ; public Pop() == concatenar elements := tl elements valor antigo ext wr elements tail pre elements <> [] post elements = tl elements~ ; public Top() res: int == return hd elements ext rd elements pre elements <> [] post res = hd elements; head end Stack
19

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Tipos
Tipos so tipos valor (value types)
Instncias so valores puros imutveis Comparao e atribuio operam com os prprios valores Varivel do tipo T (nome de um tipo) tem os prprios dados

Subdividem-se em:
Tipos bsicos - bool, nat, real, char, ... Tipos construdos (coleces, etc.) set of T, seq of T, map T1 to T2, ...

Novos tipos podem ser definidos dentro de classes na seco types Definio pode incluir invariante que restringe instncias vlidas
A estudar mais tarde

Usar para modelar tipos de valores de atributos (tipos de dados)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

20

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

11

Tipos bsicos
Smbolo bool nat1 nat int rat real Descrio Booleano Nmero natural no nulo Nmero natural Nmero inteiro Nmero racional Nmero real (mesmo que rat, pois s nmeros racionais podem ser representados no computador) Carcter Encapsula um valor (argumento de mk_token) de qualquer tipo (til quando se sabe pouco sobre o tipo) Quotes (nomes literais, usados normalmente para definir tipos enumerados) -12.78, 0, 3, 16.23 Exemplos de valores true, false 1, 2, 3, 0, 1, 2, , -2, -1, 0, 1,

char token

'a', 'b', '1', '2', '+', '-', mk_token(1)

<identificador>

<Branco>, <Preto>

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

21

Tipos construdos - coleces


Descrio Conjunto de elementos do tipo A Sequncia de elementos do tipo A Sequncia no vazia Mapeamento de elementos do tipo A para elementos do tipo B (funo finita, conjunto de pares chave-valor) Mapeamento injectivo (a chaves diferentes correspondem valores diferentes) Sintaxe set of A seq of A seq1 of A map A to B { 0 |-> false, 1 |-> true } Exemplo de instncia {1 , 2} [1, 2, 1]

inmap A to B

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

22

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

12

Outros tipos construdos


Descrio Produto dos tipos A, B, (instncias so tuplos) Record T com campos a, b, etc. de tipos A, B, etc. (*) Unio dos tipos A, B, (tipo A ou tipo B ou ) Tipo opcional (admite nil) Sintaxe A * B * ... T :: a : A b:B ... A | B | ... [A] Exemplo de instncia mk_(0, false)

mk_T(0, false)

(*) Definies alternativas: T :: a : A b :- B -- campo com :- ignorado na comparao de records T :: A B -- campos annimos
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

23

Comparao de VDM++ com OCL


Tipo de dados composto Conjunto de elementos do tipo A Conjunto admitindo repetidos Sequncia de elementos do tipo A Sequncia no vazia Sequncia sem repetidos Mapeamento (funo) de elementos do tipo A para elementos do tipo B Mapeamento injectivo seq of A seq1 of A OrderedSet(A) map A to B inmap A to B Tuple(a : A, b : B, ...) set of A VDM++ Set(A) Bag(A) Sequence(A) OCL

A * B * ... (annimo) Tuplo de tipo T com componentes a, b, ... T :: a : A (c/nomes) de tipos A, B, ... b : B ... Unio (alternativa) A | B | ...

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

24

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

13

Strings
No est pr-definido o tipo string, mas pode ser facilmente definido como sequncia de caracteres (seq of char) Todas as operaes sobre sequncias podem ser usadas com strings Strings literais podem ser indicadas com aspas
"eu sou" equivalente a ['e', 'u', ' ', 's', 'o', 'u']

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

25

Exemplo de definio de tipos


class Pessoa types sequncia public String = seq of char; public Date :: year : nat record month: nat day : nat; public Sexo = <Masculino> | <Feminino>; instance variables private nome: String; private sexo: Sexo; private dataNascimento: Date; end Pessoa atributo tipo de dados

tipo enumerado (definido com union e quote)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

26

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

14

O tipo referncia
Referncia para objecto de classe Permite modelar associaes entre classes e trabalhar com objectos de classes Exemplo: class Pessoa instance variables private conjuge : [Pessoa]; private filhos : set of Pessoa;
Guarda referncia para um objecto da classe Pessoa, ou nil

Guarda conjunto de 0 ou mais referncias para objectos da classe Pessoa

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

27

Constantes simblicas
So constantes s quais dado um nome, por forma a tornar a especificao mais legvel e fcil de alterar So declaradas na seco values com a sintaxe: [private | public | protected] nome [: tipo] = valor; Exemplo: values public PI = 3.1417;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

28

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

15

Funes
parmetros de entrada (argumentos) Funo (body,pre,post) Estado (variveis de instncia e globais) parmetros de sada (resultado)

Funes puras, sem efeitos laterais, convertem entradas em sadas No tm acesso (seja para leitura ou alterao) ao estado do sistema representado pelas variveis de instncia So definidas na seco functions Podem ser private (por omisso), public ou protected Podem ser static (caso normal) Podem ter pr-condio, corpo (para definio explcita, paradigma funcional) e ps-condio (para definio implcita)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

29

Funes - definio
Estilo 1:
podem existir vrios parmetros de sada

f(a:A, b:B, , z:Z) r1:R1, , rn:Rn == bodyexpr pre preexpr(a,b,,z) post postexpr(a,b,,z,r1,,rn) ; Estilo 2: f: A * B * * Z -> R1 * R2 * * Rn f(a,b,,z) == (valor simples ou tuplo) bodyexpr pre preexpr(a,b,,z) post postexpr(a,b,,z,RESULT) ;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

30

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

16

Funes partes da definio


Corpo definio explcita do(s) resultado(s) da funo por uma expresso sem efeitos laterais
Paradigma funcional, executvel (permite calcular o resultado) Pode-se omitir: escrever is not yet specified ou omitir ==bodyexpr no estilo 1

Pr-condio (pre) - restrio nos valores dos argumentos que se deve verificar na chamada da funo
Permite definir funes parciais (no definidas p/ alguns valores dos argumentos) Pode ser omitida (mesmo que true) A pr-condio de uma funo f tambm uma funo chamada pre_f

Ps-condio (post) expresso booleana que relaciona resultado da funo c/ argumentos (restrio a que deve obedecer o resultado)
Definio implcita da funo (permite verificar mas no calcular o resultado) Pode ser omitida (mesmo que true) A ps-condio de uma funo f tambm uma funo chamada post_f

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

31

Funes - exemplos
Definio explcita (executvel), funo total
public static IsLeapYear(year: nat1) res : bool == year mod 4 = 0 and year mod 100 <> 0 or year mod 400 = 0;

Definio implcita (no executvel), funo parcial


public static sqrt(x: real) res : real pre x >= 0 post res * res = x and res >= 0;

Combinao de definio explcita com definio implcita


public static qsort(s: seq of nat) res: seq of nat == cases s: [] -> [], [x] -> [x], [x, y] -> if x < y then [x, y] else [y, x], -^[x]^- -> qsort([y|y in set elems s & y<x])^[x]^qsort([y|y in set elems s & y>x]) end post IsSorted(res) and IsPermutation(res, s);

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

32

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

17

Herana
Uma classe pode ter vrias super-classes (herana mltipla) Sintaxe: class C1 is subclass of C2, C3 end C1 Semntica habitual Polimorfismo

C2

C3

C1

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

33

Operadores e expresses
Os j conhecidos de VDM-SL
Operadores aritmticos, lgicos e relacionais Operadores sobre tipos construdos (coleces, records, tuplos, etc.) Construo de coleces em compreenso e extenso Expresses condicionais (if-then-else, cases) Padres Quantificadores Teste de pertena a tipo

Alguns novos
Teste de pertena a classe Criao de objectos

Ver referncia rpida e alguns exemplos em anexo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

34

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

18

Aspectos sintcticos
Comentrios iniciam-se com -- e vo at ao fim da linha Distino de minsculas e maisculas (case sensitive) Acentos so suportados parcialmente, prefervel no usar Para referir um membro de instncia (varivel de instncia ou operao) de um objecto, usa-se a notao habitual objecto.membro Para referir um membro esttico (varivel, operao ou funo esttica), tipo ou constante definido noutra classe, usa-se a notao classe`membro, e no classe.membro Usa-se nil e no null Usa-se self e no this

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

35

Notao matemtica Notao ASCII

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

36

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

19

Exerccio VDM Tools


Seguir o tutorial de utilizao das VDM Tools apresentado em anexo, at parte de testes, exclusive

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

37

Importao de diagramas de classes UML para VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

38

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

20

Mapeamento de relaes entre classes


role name generalizao

C2
associao unidireccional

C5

r5 *

C1 q:Q
associao qualificada

r3 1 r4 0..1

C3

r6 C6 *

{ordered}

r7 C7

0..1

C4

class C1 is subclass of C2 class C1 is subclass of C2 instance variables instance variables r3 ::C3; r3 C3; r4 ::[C4]; r4 [C4]; r5 ::set of C5; r5 set of C5; seq1 se for para 1..* r6 ::seq of C6; r6 seq of C6; r7 ::map Q to C7; inmap se for de 0..1 r7 map Q to C7; end C1 end C1
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

39

Exemplo
class Documento end Documento; class Entidade end Entidade;
Documento Entidade

class Artigo end Artigo; class Fornecedor is subclass of Entidade instance variables private artigos: set of Artigo; end Fornecedor; class Factura is subclass of Documento instance variables private fornecedor: [Fornecedor]; private linhas: seq of LinhaFactura end Factura; class LinhaFactura instance variables private artigo: Artigo; end LinhaFactura;

Factura
composio

-fornecedor 0..1

Fornecedor

Fornece {ordered} * -linhas LinhaFactura -artigo 1 -artigos * Artigo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

40

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

21

Cuidados a ter na elaborao do diagrama de classes em UML


Nomes de classes, atributos e operaes: identificadores vlidos, s/ espaos
Acentos e cedilhas funcionam mal em nomes de classes

Indicar sentido de navegao nas associaes


Associaes so mapeadas p/referncias entre objectos (como em linguagens OO) Sentido da navegao indica que objectos guardam referncias para que objectos Se for necessrio navegar (guardar referncias) nos dois sentidos, criar duas associaes navegveis em sentidos opostos (c/ restrio adicional!)

Indicar role names nos extremos navegveis das associaes


O role name serve para designar o objecto ou conjunto de objectos relacionados

Os nomes dos parmetros das operaes de alterao de valores de atributos devem ser diferentes dos nomes dos atributos
Seno, no VDM++ no se consegue desambiguar a atribuio

Usar tipos de dados da linguagem alvo (neste caso, VDM++) Atender a que em VDM++ (tal como nas linguagens de programao OO), no existe acesso automtico ao conjunto de instncias duma classe (como OCL)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

41

Exemplo do Registo Civil


Pessoa nome : String sexo : Sexo dataNascimento : Date dataFalecimento : [Date] = nil estadoCivil : EstadoCivil = <Solteiro>

Tambm se podiam marcar os atributos pblicos para leitura, dispensando mtodos Get

0..1 -conjuge

{ordered} 0..* -exConjuges

Construtor Pessoa(nome_ : String, sexo_ : Sexo, dataNascimento_ : Date, pai_ : [Pessoa], mae_ : [Pessoa]) : Pessoa Casamento(conjuge : Pessoa) -mae Operaes de alterao Div orcio() 0..1 Falecimento(data : Date) GetNome() : String GetSexo() : Sexo GetDataNascimento() : Date GetDataFalecimento() : [Date] -pai GetPai() : [Pessoa] GetMae() : [Pessoa] 0..1 GetConjuge() : [Pessoa] Operaes de consulta GetExConjuges() : seq of Pessoa GetEstadoCivil() : EstadoCivil GetFilhos() : set of Pessoa GetPessoas() : set of Pessoa
-$pessoas 0..*

Atributo esttico que guarda o conjunto de todas as pessoas registadas

(Desenhado em Rational Rose)


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

42

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

22

Importao de Rational Rose para VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

43

Resultado da importao para VDM++ (1)


Ficheiro Pessoa.rtf

class Pessoa instance variables private nome : String; private sexo : Sexo; private dataNascimento : Date; private dataFalecimento : [Date] := nil; private estadoCivil : EstadoCivil := <Solteiro>; private pai : [Pessoa]; private mae : [Pessoa]; private conjuge : [Pessoa]; private exConjuges : seq of Pessoa; private static pessoas : set of Pessoa; ...

Mapeamento de atributos

Mapeamento de associaes

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

44

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

23

Resultado da importao para VDM++ (2)


(aps alterao de estilo, para ficar mais compacto) operations public Pessoa(nome_ : String, sexo_ : Sexo, dataNascimento_ : Date, pai_, mae_ : [Pessoa]) res : Pessoa == is not yet specified; public Casamento(conjuge_ : Pessoa) == is not yet specified; public Divorcio() == is not yet specified; public Falecimento(data: Date) == is not yet specified; public GetNome() res : String == is not yet specified; public GetSexo() res : Sexo == is not yet specified; public GetDataNascimento() res : Date == is not yet specified; public GetDataFalecimento() res : [Date] == is not yet specified; public GetPai() res : [Pessoa] == is not yet specified; public GetMae() res : [Pessoa] == is not yet specified; public GetConjuge() res : [Pessoa] == is not yet specified; public GetExConjuges() res: seq of Pessoa == is not yet specified; public static GetPessoas () res: set of Pessoa == is not yet specified; public GetEstadoCivil() res: EstadoCivil == is not yet specified; public GetFilhos() res: set of Pessoa == is not yet specified; end Pessoa acrescentado
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construtor Operaes de alterao Operaes de consulta directa de variveis de instncia

Outras consultas

45

Acrescentar a definio de tipos de dados


class Pessoa types public String = seq of char; public Date :: year : nat1 month : nat1 day : nat1; public Sexo = <Masculino> | <Feminino>; public EstadoCivil = <Solteiro> | <Casado> | <Divorciado> | <Viuvo> | <Falecido>; instance variables operations end Pessoa

J passa na verificao de sintaxe e tipos (mas no suficiente para executar)!


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

46

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

24

*Mapeamento de associaes qualificadas


RegistoCivil + RegistaPessoa(p: Pessoa, bi: nat) + GetPessoa(bi: nat) : [Pessoa] bi : nat
A cada nmero de bi corresponde 0 (no caso de n no atribudo) ou 1 pessoa Qualificador: atributo(s) usado(s) para navegar de RegistoCivil para Pessoa (chave de navegao)

1 0..1 - pessoas
Pessoa

Associao qualificada

class RegistoCivil instance variables private pessoas : inmap nat to Pessoa := { |-> } ; operations public RegistaPessoa(p : Pessoa, bi: nat) == is not yet specified ; public GetPessoa(bi: nat) res : [Pessoa] == is not yet specified; end RegistoCivil
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

47

Que sentido(s) de navegao escolher?


VDM++ no tem suporte nativo para associaes bidireccionais nem mantm o conjunto de instncias de uma classe
Tal como linguagens de programao OO Java, C++, C#, etc. Mas ao contrrio de UML, OCL, Executable UML, bases de dados relacionais, etc.

Soluo comum: objecto raiz que d acesso aos restantes objectos do sistema, de forma hierrquica
Algumas navegaes em sentido inverso

Ver exemplo da Agenda Corporativa em anexo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

48

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

25

Exerccio Contas bancrias


Criar no Rational Rose o diagrama UML indicado abaixo e importar para as VDM Tools Acrescentar depois operaes para criar contas e clientes e efectuar depsitos, levantamentos e consultas, e voltar a importar

Banco nome: seq of char * contas Conta nmero: nat saldo: real * clientes Cliente 1..* nmero: nat titulares nome: seq of char

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

49

Definio de invariantes

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

50

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

26

Invariantes de tipos
A seguir definio de um tipo pode-se definir um invariante, para restringir as instncias vlidas (valores vlidos)
inv padro == predicado
padro faz match com um valor do tipo em causa predicado a restrio a que o valor deve obedecer

Normalmente o padro simplesmente uma varivel, como em


types public Date :: year : nat1 month: nat1 day : nat1 inv d == d.month <= 12 and d.day <= DaysOfMonth(d.year, d.month);

Mas podem-se usar padres mais complexos, por exemplo


inv mk_Date(y,m,d) == m <= 12 and d <= DaysOfMonth(y, m);

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

51

Invariantes de estado
Definem-se na seco instance variables, a seguir declarao das variveis de instncia, com a sintaxe inv expresso_booleana_nas_variveis_de_instncia; Restringem os valores vlidos das variveis de instncia Em VDM++, os invariantes so verificados aps cada atribuio
Atribuio a varivel de instncia da mesma classe do invariante!

Tambm possvel agrupar vrias atribuies num nico bloco atmico, e verificar os invariantes s no final
Necessrio p/ invariantes que relacionam diferentes var.s de instncias

So herdados por subclasses, que podem acrescentar outros A expresso de um invariante no deve ter efeitos laterais (pode invocar operaes de consulta mas no de alterao de estado)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

52

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

27

Tipos de invariantes comuns


Restrio ao domnio (conj. de valores possveis) de atributos Restries de unicidade (chaves) Restries relacionadas com ciclos nas associaes Restries temporais (com datas, horas, etc.) Restries devidas a elementos derivados (calc. ou replic.) Regras de (condies para) existncia (de valores ou objectos) Restries de negcio genricas Restries idiomticas (garantidas estruturalmente em UML mas no ao mapear para VDM++)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

53

Tipos de invariantes comuns Restries ao domnio de atributos


A taxa de juros de um emprstimo uma percentagem entre 0 e 100%.
class Emprstimo types Percentagem = real inv p == p >= 0 and p <= 100; instance variables taxaJuros: Percentagem; end Emprstimo

Emprstimo taxaJuros: Percentagem

Normalmente prefervel definir por invariante de tipo!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

54

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

28

Tipos de invariantes comuns Restries de unicidade (chaves)


Um banco no pode ter duas contas com o mesmo nmero

Banco * contas Conta nmero: nat

class Banco instance variables contas: set of Conta; inv not exists c1, c2 in set contas & c1 <> c2 and c1.nmero = c2.nmero;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

55

Tipos de invariantes comuns


Restries em ciclos nas associaes: disjoint
Uma transferncia s pode ser efectuada entre contas diferentes

Transferncia
{disjoint}

origem 1 Conta

1 destino

class Transferncia instance variables origem: Conta; destino: Conta; inv origem <> destino;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

56

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

29

Tipos de invariantes comuns


Restries em ciclos nas associaes: subset
Um levantamento s pode ser efectuado por um dos titulares da conta

Levantamento
{subset}

1 conta Conta

1..* titulares

1 autor Cliente

class Levantamento instance variables conta: Conta; autor: Cliente; inv autor in set conta.titulares;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

57

Tipos de invariantes comuns


Restries em ciclos nas associaes: acyclic
Um tarefa no pode ser subtarefa de si prpria, directa ou indirectamente
class Tarefa instance variables subtarefas: set of Tarefa;

subtarefas *

Tarefa

inv self not in set fechoTransitivoSubTarefas();


operations fechoTransitivoSubTarefas() : set of Tarefa == ( dcl fecho : set of Tarefa := subtarefas; dcl visitadas : set of Tarefa := {}; while visitadas <> fecho do let t in set (fecho \ visitadas) in ( fecho := fecho union t.subtarefas; visitadas := visitadas union {t} ) return fecho );
58

{acyclic}

Definido por forma a no entrar em ciclo infinito no caso de existirem ciclos! Como generalizar para reutilizar?

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

30

Tipos de invariantes comuns Restries temporais


(1) Uma tarefa no pode terminar antes de comear (2) Uma tarefa no pode comear antes das precedentes terminarem
Tarefa precedentes incio: Date * fim: Date
{acyclic} class Tarefa types Date = nat; -- YYYYMMDD instance variables incio: Date; fim: Date; precedentes: set of Tarefa; inv fim >= incio; inv forall p in set precedentes & self.incio >= p.fim;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

59

Tipos de invariantes comuns Regras de existncia de objectos


Uma tarefa atmica no pode ter subtarefas

subtarefas *

Tarefa
atmica: bool

class Tarefa instance variables atmica: bool; subtarefas: set of Tarefa;

inv atmica => subtarefas = {};

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

60

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

31

Tipos de invariantes comuns Regras de existncia de valores


No se pode definir o fim efectivo de uma tarefa sem ter definido o seu incio efectivo
multiplicidade de atributo

Tarefa incioEfectivo: Date [0..1] (UML) fimEfectivo: Date [0..1]


ou

class Tarefa instance variables incioEfectivo: [Date]; fimEfectivo: [Date];

Tarefa incioEfectivo: [Date] fimEfectivo: [Date]

inv fimEfectivo <> nil => incioEfectivo <> nil;


(VDM)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

61

Tipos de invariantes comuns


Restries em elementos derivados: atributos
O saldo da conta igual soma dos valores dos movimentos desde a abertura da conta (negativos nos levantamentos)
elemento derivado class Conta instance variables saldo: real; movimentos: seq of Movimento; inv total = sum ( {movimentos(i).valor & i in set inds movimentos} ); functions sum(s: set of real) res : real == if s = {} then 0 else let x in set s in x + sum(s \ {x});

Conta /saldo: real

{ordered} * movimentos Movimento valor: real

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

62

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

32

Tipos de invariantes comuns


Restries em elementos derivados: associaes
O scio maioritrio o que tem uma quota superior a 50%

Sociedade 0..1 /scioMaioritrio Scio quota: Percentagem 1..* scios

class Sociedade instance variables scios: set of Scio; scioMaioritrio: [Scio]; inv sum({scio.quota & scio in scios}) = 100; inv if exists1 s in set scios & s.quota > 50 then scioMaioritrio = iota s in set scios & s.quota > 50 else scioMaioritrio = nil;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

63

Tipos de invariantes comuns Regras de negcio genricas


O saldo da conta no pode ser negativo

Conta saldo: real

class Conta instance variables saldo: real; inv saldo >= 0;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

64

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

33

Tipos de invariantes comuns Restries idiomticas (1)


Uma associao bidireccional representada em VDM++ por duas associaes unidireccionais, com restries de integridade associadas
subtarefas * class Tarefa instance variables subtarefas: set of Tarefa; supertarefa: [Tarefa]; inv forall t in set subtarefas & t.supertarefa = self; Ambos os invariantes so necessrios (porqu?) Pode ser visto como caso de ciclo em associaes inv supertarefa <> nil => self in set supertarefa.subtarefas;

Tarefa
0..1 supertarefa

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

65

Tipos de invariantes comuns Restries idiomticas (2)


VDM++ no tem nativamente coleces ordenadas sem repeties (OrderedSet em OCL) Restries de multiplicidade podem originar invariantes

Voo

class Voo instance variables trajecto: seq of Aeroporto; inv not exists i, j in set inds trajecto & i <> j and trajecto(i) = trajecto(j); inv len trajecto >= 2;

{ordered} 2..* trajecto Aeroporto

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

66

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

34

Exemplo do Registo Civil


Pessoa nome : String sexo : Sexo dataNascimento : Date dataFalecimento : [Date] = nil estadoCivil : EstadoCivil = <Solteiro> pessoas : Set of Pessoa 0..1 0..1 -mae

-exConjuges 0..* {ordered}

0..1 -conjuge

-pai

R1 O pai tem de ser do sexo masculino R2 A me tem de ser do sexo feminino R3 Os cnjuges tm de ser de sexos opostos R4 O falecimento tem de ser posterior ao nascimento R5 Os pais tm de nascer antes dos filhos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

67

Exemplo do Registo Civil: Formalizao (1)


class Pessoa instance variables -- R1. O pai tem de ser do sexo masculino pai <> nil <Masculino>; inv pai.sexo ==> pai.sexo = <Masculino>; -- R2. A me tem de ser do sexo feminino inv mae <> nil => mae.sexo = <Feminino>; -- R3a. Os cnjuges tm de ser de sexos opostos inv conjuge <> nil => self.sexo <> conjuge.sexo; -- R3b. Os ex-cnjuges tambm tm de ser de sexos opostos inv forall ex in set elems exConjuges & self.sexo <> ex.sexo;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

68

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

35

Exemplo do Registo Civil: Formalizao (2)


-- ***** Restries temporais ***** -- R4. O falecimento no pode ser anterior ao nascimento inv dataFalecimento <> nil => not IsAfter(dataNascimento, dataFalecimento); -- R5a. O pai tem de ter data de nascimento anterior ao filho inv pai <> nil => IsAfter(dataNascimento, pai.dataNascimento); -- R5b. A me tem de ter data de nascimento anterior ao filho inv mae <> nil => IsAfter(dataNascimento, mae.dataNascimento); -- ****** Ciclos nas associaes ***** -- Simetria de (ex)cnjuge: se A (ex)cnjuge de B, ento B (ex)cnjuge de A inv conjuge <> nil => conjuge.conjuge = self; inv forall ex in set elems exConjuges & self in set elems ex.exConjuges;
2 invariantes no suportados em VDM++! Funo auxiliar a definir p/ comparar datas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

69

Exemplo do Registo Civil: Formalizao (3)


-- *** Regras de existncia (consistncia do estado civil) *** -- A data de falecimento est definida sse o estado civil Falecido inv estadoCivil = <Falecido> <=> dataFalecimento <> nil; -- O cnjuge est definido sse o estado civil Casado inv estadoCivil = <Casado> <=> conjuge <> nil; -- Uma pessoa solteira no pode ter ex-cnjuges inv estadoCivil = <Solteiro> => exConjuges = []; -- Uma pessoa divorciada ou viva tem pelo menos um ex-cnjuge inv estadoCivil in {<Divorciado>, <Viuvo>} => exConjuges <> []; operations end Pessoa

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

70

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

36

A que classe associar cada invariante?


Tanto em VDM++ como OCL, os invariantes tm de ser formalizados no contexto de uma classe No caso de invariantes que referem apenas uma classe, a deciso trivial No caso de invariantes que envolvem mais do que uma classe, uma deciso de design no trivial
classe onde a expresso mais simples classe onde se tem acesso a toda a informao classe onde ocorrem operaes que podem violar o invariante

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

71

Limitaes de VDM++: invariantes inter-objecto


class A instance variables private x : nat; private b : B; inv x < b.GetY(); operations public SetXY(newX, newY: nat) == ( x := newX; b.SetY(newY) ) end A class B instance variables private y : nat; operations public GetY() res: nat == return y; public SetY(newY: nat) == y := newY; end B
2) Invariante no testado aqui, pois est definido noutra classe!

1) Invariante testado aqui (cedo de mais), no h maneira de atrasar verificao p/ fim do bloco!

Outras linguagens (OCL, Spec#, etc.) resolvem o 1 problema verificando invariantes s nos limites da chamada de mtodos!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

72

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

37

Exerccio Contas bancrias


Continuar exerccio das contas bancrias, acrescentando invariantes

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

73

Definio de pr e ps-condies e relao com diagramas de estados UML

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

74

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

38

Pr e ps-condies de operaes
Pr-condio: restringe as condies de chamada (valores de argumentos e var.s de instncia do objecto)
Correspondem em programao defensiva a validaes efectuadas no incio dos mtodos (com possvel lanamento de excepes)

Ps-condio: formaliza o efeito da operao, atravs de condio que relaciona os valores finais das variveis de instncia e o valor retornado com os valores iniciais das variveis de instncia (indicados com ~) e os valores dos argumentos As pr e ps-condies do construtor, junto com valores por defeito das variveis de instncia, devem garantir o estabelecimento dos invariantes, entre outros efeitos As pr e ps-condies das operaes de alterao, devem garantir a preservao de invariantes (assumindo que o objecto verifica os invariantes no incio, tambm verifica no final), entre outros efeitos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

75

Relao com diagramas de estados UML


Diagrama de estados associado a uma classe e descreve o ciclo de vida e comportamento reactivo de cada objecto da classe (em resposta a eventos de chamada de operaes ou outros a ver depois) Fornece restries de integridade dinmicas (transies vlidas) para as pr e ps-condies das operaes
Nome do estado

UML
Estado1 [cond1(inst-vars)]

VDM++
op1(params) pre cond1(inst-vars) post cond2(inst-vars)

Condio que formaliza o estado (normalmente no mostrado em UML) Transio pode ter evento[condio]/aco

op1(params)

Estado2 [cond2(inst-vars)]

Generalizar regra para transies c/ condies de guarda e mltiplas transies para a mesma operao!
76

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

39

Exemplo do Registo Civil


new Pessoa Nascimento Vivo

1) Formalizar cada estado por uma condio nas variveis de instncia estadoCivil = <Divorciado> estadoCivil = <Casado>
Vivo

PodeCasar Solteiro Divorciado

2) Obter trivialmente :
Divrcio Cas ament o Casado Falecimento do conjuge

Divorcio() pre estadoCivil = <Casado> post estadoCivil = <Divorciado>; 3) Completar, pois a operao pode ter outros efeitos que no esto detalhados no diagrama

Falecimento Falecido

Processo presentemente manual!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

77

Exemplo do Registo Civil


Construtor

public Pessoa(nome0: String, sexo0: Sexo, dataNascimento0: Date, pai0, mae0: [Pessoa]) res: Pessoa == is not yet specified ext wr nome, sexo, dataNascimento, pai, mae, pessoas, estadoCivil pre (pai0 <> nil => pai0.sexo = <Masculino> and IsAfter(dataNascimento0, pai0.dataNascimento)) and (mae0 <> nil => mae0.sexo = <Feminino> and IsAfter(dataNascimento0, mae0.dataNascimento)) post nome = nome0 and sexo = sexo0 and dataNascimento = dataNascimento0 and pai = pai0 and mae = mae0 and estadoCivil = <Solteiro> and pessoas = pessoas~ union {self} and res = self;
Nas VDMTools, vai dar aqui o valor actual e no o antigo!
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Variveis de instncia que a operao pode manipular

Garantir que argumentos no vo causar violao de invariantes

Inicializar variveis de instncia c/ argumentos Restrio dinmica Junta a conj. de instncias Retornar o prprio objecto

78

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

40

Exemplo do Registo Civil


public Casamento(conj: Pessoa) == is not yet specified ext wr estadoCivil, conjuge
Restrio dinmica Garantir invariante Actualiza este objecto Actualiza o outro objecto (conjuge)

pre estadoCivil in set {<Solteiro>, <Viuvo>, <Divorciado>} and conj.estadoCivil in set {<Solteiro>, <Viuvo>, <Divorciado>} and sexo <> conj.sexo post estadoCivil = <Casado> and conjuge = conj and conj.estadoCivil = <Casado> and conj.conjuge = self;

A operao chamada para uma das pessoas do casal, e trata de actualizar o estado das duas pessoas. Dada a simetria, talvez ficasse melhor como operao esttica com 2 argumentos.
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

79

Exemplo do Registo Civil


public Divorcio() == is not yet specified ext wr estadoCivil, conjuge, exConjuges pre estadoCivil = <Casado>
Actualiza este objecto Actualiza o outro objecto (conjuge)

post estadoCivil = <Divorciado> and conjuge = nil and exConjuges = exConjuges~ ^ [conjuge~] and conjuge~.estadoCivil = <Divorciado> and conjuge~.conjuge = nil and self in set elems conjuge~.exConjuges; -- falha: conjuge~.exConjuges = conjuge~.exConjuges~ ^ [self];

A operao chamada para uma das pessoas do casal, e trata de actualizar o estado das duas pessoas. Dada a simetria, talvez ficasse melhor como operao esttica com 2 argumentos.
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

80

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

41

Exemplo do Registo Civil


public Falecimento(data : Date) == is not yet specified ext wr estadoCivil, dataFalecimento, conjuge, exConjuges pre data = nil and not IsAfter(dataNascimento, data) post estadoCivil = <Falecido> and dataFalecimento = data and if conjuge~ <> nil then ( conjuge = nil and exConjuges = exConjuges~ ^ [conjuge~] and conjuge~.conjuge = nil and self in set elems conjuge~.exConjuges -- falha: conjuge~.exConjuges = conjuge~.exConjuges~ ^ [self] ) else ( exConjuges = exConjuges~ and conjuge = conjuge~ );

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

81

Operaes de consulta
Tambm se podem especificar as operaes de consulta com pscondies
public GetNome() res : String == is not yet specified ext rd nome post res = nome;

Mas normalmente mais til escrever logo o corpo


public GetNome() res : String == return nome;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

82

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

42

Limitaes de VDM++: valores antigos


Apenas possvel aceder ao valor inicial de variveis de instncia do prprio objecto (self) No possvel a valores iniciais (antigos) de:
Variveis de instncia de objectos referenciados Variveis de instncia herdadas de superclasses Operaes de consulta Variveis estticas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

83

Como OCL resolve essas limitaes


propriedade@pre valor antigo da propriedade (atributo, associao ou operao de consulta), no incio da execuo da operao Pode-se usar @pre para aceder a valores antigos de propriedades de objectos referenciados
Existe equivalente em VDM++: obj1.a1 = v4 obj1.r1 = obj3 obj1.r1.a2 = v6 obj1.a1@pre = v1 obj1.r1@pre = obj2 obj1.r1@pre.a2 = v5 No existe equivalente em VDM++: obj1.r1@pre.a2@pre = v2 obj1.r1.a2@pre = v3

Before:

obj1 a1 = v1

r1 obj2: a2 = v2

obj3 a2 = v3 r1

After:

obj1 a1 = v4

obj2 a2 = v5

obj3 a2 = v6

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

84

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

43

* Propriedades das pre/ps-condies


Satisfabilidade (existncia de soluo)
comb. de valores finais de variveis de instncia e valor de retorno satisfazendo a ps-condio, comb. de valores iniciais das variveis de instncia e argumentos obedecendo aos invariantes e pr-condio

Determinismo (unicidade de soluo)


Sempre que os requisitos assim o indiquem, escrever uma ps-condio determinstica (que admite uma nica soluo) Mas, por exemplo, num problema de optimizao, a ps-condio pode restringir as solues admissveis, sem chegar a impor uma soluo nica

Respeito pelos invariantes


Se valores iniciais de var.s de instncia e argumentos obedecerem aos invariantes e pr-condio, a ps-condio garante invariantes no final Depois de garantir que todas as operaes respeitam os invariantes, pode-se desactivar a sua verificao (mais pesada que verificao incremental de pr/ps-condies)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

85

* Pr/ps-condies e herana
Ao redefinir uma operao herdada da superclasse, no se deve violar o contracto (pr e ps-condio) estabelecido na super-classe A pr-condio pode ser enfraquecida (relaxada) na subclasse, mas no fortalecida (no pode ser mais restritiva)
qualquer chamada que se prometia ser vlida na pr-condio da superclasse, deve continuar a ser aceite na pr-condio da subclasse pre_op_superclass => pre_op_subclass

A ps-condio pode ser fortalecida na subclasse, mas no enfraquecida


a operao na subclasse deve continuar a garantir os efeitos prometidos na superclasse, podendo acrescentar outros efeitos post_op_subclass => post_op_superclass

Behavioral subtyping
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

86

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

44

* Pr/ps-condies e herana
class Figura types public Ponto :: x : real y : real; instance variables protected centro : Ponto; operations public Resize(factor: real) == is subclass responsibility pre factor > 0.0 post centro = centro~; end Figura class Circulo is subclass of Figura instance variables private raio : real; inv raio > 0; operations public Circulo(c: Ponto, r: real) res: Circulo == ( raio := r; centro := c; return self ) pre r > 0; public Resize(factor: real) == raio := raio * abs(factor) pre factor <> 0.0 post centro = centro~ and raio = raio~ * abs(factor); end Circulo pre Circulo`Resize() post Circulo`Resize()
87

pre Figura`Resize() post Figura`Resize()

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Exerccio Contas bancrias


Continuar exerccio das contas bancrias, acrescentando definio de pr-condies e ps-condies

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

88

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

45

Definio do corpo algortmico de operaes com instrues e aces

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

89

Instrues
Para o modelo ser executvel, necessrio escrever o corpo das operaes, na forma de uma instruo ou bloco de instrues O corpo tambm chamado corpo algortmico, pois, enquanto na ps-condio se especifica o qu (efeito), no corpo indica-se como (algoritmo) A linguagem VDM++ permite descrever e testar o algoritmo a um nvel de abstraco elevado, refin-lo at ao nvel desejado, e gerar um programa executvel em Java ou C++ com as VDM Tools Algumas instrues disponveis:
Instruo de atribuio Instrues let e def Instrues de controlo de fluxo: if, cases, for, while Instruo return Blocos e declarao de variveis locais

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

90

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

46

Aces
Aco: qualquer expresso (e.g., new) ou instruo (e.g., atribuio) que altera o estado do sistema, ou seja, que cria ou elimina objectos ou modifica o seu estado (ou o estado de variveis estticas)

Criar objecto: new nome-da-classe(parmetros-constructor) Eliminar objecto: automtico, como em Java e C#


So automaticamente eliminados quando deixam de ser referenciados O que podemos fazer explicitam/ remover um objecto duma coleco ou desreferenciar atribuindo nil (obj_ref := nil) Evita erros e simplifica as especificaes Em contrapartida, impede saber que instncias existem de uma dada classe num dado momento (em OCL ClassName.allInstances)

Modificar estado de objecto: ver operador de atribuio

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

91

Blocos e declarao de variveis


( dcl id1 : tipo1 [:= expr1], id2 : tipo2 [:= expr2], ; dcl ; instruo1; instruo2;

Um bloco tem de ter pelo menos uma instruo Variveis s podem ser declaradas no incio do bloco ltima instruo no precisa de ; A 1 instruo que retornar um valor (mesmo sem return, basta chamar uma operao que devolva um valor) faz terminar o bloco

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

92

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

47

Atribuio
designador_de_estado := expresso
Nome de varivel
Varivel de instncia do objecto em causa Varivel esttica (static) Varivel local da operao (declarada com dcl)

Parte de varivel do tipo map, seq ou record


map_var(chave) := valor seq_var(ndice) := valor record_var.campo := valor

No se pode fazer object_reference.instance_variable := expr (mesmo que a varivel de instncia seja pblica)! Um identificador introduzido com let , forall, etc. no uma varivel neste sentido
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

93

Atribuio mltipla
atomic ( sd1 := exp1; sd2 := exp2; )
Avalia primeiro todas as expresses do lado direito, e s depois atribui (em simultneo) os valores resultantes s variveis do lado esquerdo! S verifica invariantes no final das vrias atribuies (seno, verificaria invariantes aps cada atribuio) til na presena de invariantes que envolvem mais do que uma varivel de instncia (do mesmo objecto) No resolve o problema de invariantes inter-objecto, isto , que envolvem mltiplos objectos (porqu?)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

94

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

48

Atribuio mltipla - exemplo


instance variables private quantidade : real; private precoUnitario : real; private precoTotal : real; inv precoTotal = quantidade * precoUnitario; operations public SetQuantidade(q: real) == Quebra invariante aps 1 atribuio (quantidade := q; precoTotal := precoUnitario * q); public SetQuantidade(q: real) == atomic(quantidade := q; precoTotal := precoUnitario * q);
Errado: usa valor antigo da varivel public SetQuantidade(q: real) == atomic(quantidade:=q; precoTotal:=precoUnitario * quantidade);

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

95

Instrues let e def


let definio1, definio2, in instruo let identificador in set conjunto [be st condio] in instruo def definio1, definio2, in instruo

Tm a mesma forma que expresses let e def, com instruo em vez de expresso na parte de in Usar def em vez de let, quando na parte de definies so invocadas operaes que alteram estado Identificadores introduzidos na parte de definies no so variveis que possam mudar de valor (no podem aparecer do lado esquerdo de atribuies)!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

96

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

49

Instrues condicionais if e cases


if condio then instruo1 [else instruo2] cases expresso: padro11, padro12, ..., padro1N -> instruo1, ... -> ..., padroM1, padroM2, ..., padroMN -> instruoM, others -> instruoM1 end
Tm a mesma forma que as expresses if e cases, com instrues em vez de expresses Na instruo if, a parte de else opcional

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

97

Ciclos for e while


Instruo Descrio Ciclo while tradicional Ciclo for tradicional, com inteiros. Contador no tem de ser declarado previamente. Normalmente o padro simplesmente um identificador. Percorre os elementos do conjunto por uma ordem arbitrria. No confundir com quantificador existencial forall. Normalmente o padro simplesmente um identificador. Percorre os elementos da sequncia por ordem.

while condio do instruo for contador = N1 to N2 [by N3] do instruo for all padro in set conjunto do instruo

for padro in sequncia do instruo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

98

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

50

Instruo return
return
Usado para terminar operaes que no retornam qualquer valor

return expresso
Usado para terminar operaes que retornam um valor

Cuidado com return implcito: a 1 instruo que retornar um valor (basta chamar operao que devolve valor) faz terminar o bloco

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

99

Exemplo do Registo Civil (1)


public Pessoa(nome0: String, sexo0: Sexo, dataNasc0: Date, pai0, mae0: [Pessoa]) res: Pessoa == ( Para s verificar invariantes depois atomic( de inicializar todas as variveis! nome := nome0; sexo := sexo0; dataNascimento := dataNasc0; pai := pai0; mae := mae0; pessoas := pessoas union {self}; ); return self ) ext wr nome, sexo, dataNascimento, pai, mae, pessoas pre post nome = nome0 and sexo = sexo0 and dataNascimento = dataNasc0 and pai = pai0 and mae = mae0 and pessoas = pessoas~ union {self} and res = self;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

100

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

51

Exemplo do Registo Civil (2)


public Casamento(conj: Pessoa) == ( Tem de usar operao auxiliar por self.SetCasado(conj); limitao do operador de atribuio conj.SetCasado(self) ) ext wr estadoCivil, conjuge pre post estadoCivil = <Casado> and conjuge = conj and conj.estadoCivil = <Casado> and conj.conjuge = self; -- operao auxiliar interna private SetCasado(conj: Pessoa) == atomic ( conjuge := conj; estadoCivil := <Casado> ); Ver restantes em RegistoCivil.zip
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

101

Escrever ou no a ps-condio? (em modelos executveis)


Se queremos obter um modelo executvel (com corpo de operaes), no h benefcio em escrever ps-condies trivialmente semelhantes ao corpo
Ou o corpo podia ser gerado automaticamente da ps-condio

Mas, se o corpo muito mais complexo que a ps-condio, pode ser vantajoso escrever a ps-condio
O corpo permite especificar o algoritmo a seguir na realizao da operao A ps-condio permite especificar o objectivo e verificar o resultado Ver exemplo a seguir e problema da colocao de professores (em anexo)

Outras vezes, a ps-condio pode ser usada para especificar algumas restries a que deve obedecer o resultado, sem o fixar completamente
Caso tpico de problemas de optimizao, como na colocao de professores

Em alguns casos, no mesmo possvel especificar o efeito pretendido atravs de ps-condies, logo importante o corpo
Ver mais tarde caso de callbacks e event listeners

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

102

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

52

Ordenao topolgica (1/2)


-- Operao de ordenao topolgica dos vrtices dum grafo dirigido. -- Grafo representado por mapeamento de vrtices para sucessores. -- Algoritmo descrito em D. Knuth, The Art of Computing Programming, Vol. 1. TopologicalSort : map Vertex to set of Vertex ==> seq of Vertex TopologicalSort(Succ) == ( dcl indegree: map Vertex to nat; -- n de predecessores por ordenar dcl S : set of Vertex; -- vrtices por ordenar com indegree = 0 dcl R : seq of Vertex := []; -- resultado da ordenao -- clculo de indegree e inicializao de S indegree := {v |-> 0 | v in set dom Succ}; for all v in set dom Succ do for all w in set Succ(v) do indegree(w) := indegree(w) + 1; S := {v | v in set dom Succ & indegree(v) = 0};

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

103

Ordenao topolgica (2/2)


-- clculo da ordem topolgica (R) while S <> {} do let v in set S in ( S := S \ {v}; R := R ^ [v]; for all w in set Succ(v) do ( indegree(w) := indegree(w) 1; if indegree(w) = 0 then S := S union {w} ) ); return R
Algoritmo pode ser implementado em tempo O(n de vrtices + n de arestas).

Na presena de ciclos (violando a 2 prcondio), o algoritmo d uma sequncia parcial (violando a 1 pscondio)

) pre ((dunion rng Succ) subset (dom Succ)) and IsAcyclic(Succ) post (elems RESULT = dom Succ) and HasNoDuplicates(RESULT) and (forall i, j in set inds RESULT & i <= j => RESULT(i) not in set Succ(RESULT(j)));

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

104

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

53

Modelo executvel pode estar mais perto da especificao ou da implementao!


Definio implcita no executvel: public static sort(s: seq of nat) res: seq of nat == post IsSorted(res) and IsPermutation(res, s); Definio explcita executvel, baseada na definio implcita: public static sort(s: seq of nat) res: seq of nat == iota t in set Permutations(s) & IsSorted(t); -- iota: selecco Definio explcita executvel, segundo algoritmo quick sort: public static qsort(s: seq of nat) res: seq of nat == cases s: [] -> [], [x] -> [x], [x, y] -> if x < y then [x, y] else [y, x], -^[x]^- -> qsort([y|y in set elems s & y<x])^[x]^qsort([y|y in set elems s & y>x]) end;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Refinamento

105

Exerccio Contas bancrias


Continuar exerccio das contas bancrias, acrescentando corpo das operaes Efectuar alguns testes usando o interpretador de VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

106

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

54

Teste da especificao

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

107

Teste da especificao
Uma especificao bem construda j tem verificaes built-in
Invariantes, pr/ps-condies, outras asseres (invariantes de ciclos, etc.)

Mas deve ser exercitada de forma repetvel com testes automatizados


O objectivo descobrir erros e ganhar confiana na correco da especificao Mais tarde, os mesmos testes podem ser aplicados implementao

Testar com entradas vlidas


Exercitar toda as partes da especificao (medir cobertura com VDMTools) Usar asseres para verificar valores devolvidos e estados finais (Op) Derivar testes a partir de mquinas de estados (teste baseado em estados) (Op) Derivar testes a partir de cenrios de utilizao (teste baseado em cenrios) (Op) Derivar testes de especificaes axiomticas (teste baseado em axiomas)

Testar com entradas invlidas


Quebrar todos os invariantes e pr-condies, para verificar que funcionam

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

108

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

55

Suporte para teste nas VDM Tools


Especificao pode ser testada interactivamente com interpretador de VDM++, ou com base em casos de teste pr-definidos Pode-se activar a verificao automtica de invariantes, prcondies e ps-condies Para obter informao de cobertura de testes, necessrio definir pelo menos um script de teste
Cada script de teste tsk especificado por dois ficheiros:
- ficheiro tsk.arg com o comando a executar pelo interpretador - ficheiro tsk.arg.exp com o resultado esperado da execuo do comando

VDMTools do informao dos testes que sucederam e que falharam Pretty printer "pinta" as partes da especificao que foram de facto executadas e gera tabelas com % de cobertura e nmero de chamadas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

109

Simulao de asseres
class TestPessoa is subclass of Test operations public TestNome() == ( dcl j : Pessoa := new Pessoa("Joo", ); Assert( j.GetNome() = "Joo") ) end TestPessoa class Test operations protected Assert : bool ==> () Assert(a) == return pre a end Test

Utilizao

Definio

Violao de assero reduzida a violao de pr-condio (activar verificao de prcondies nas VDMTools)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

110

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

56

Teste baseado em estados


Modelar comportamento (ciclo de vida) de tipos de objectos interessantes por diagramas de estados UML Determinar sequncias de teste que cobrem (pelo menos) todos os estados e transies nos diagramas de estados
P/ testes mais completos, expandir elem.s compostos (estados, guardas, eventos) Quando no h interaces entre objectos, uma seq. de teste um caminho no diagrama de estados partindo do estado inicial (uma vida possvel de um objecto) Como um diagrama de estados UML representa uma mquina de estados estendida (com variveis de estado adicionais), nem todos os caminhos no diagrama representam necessariamente comportamentos vlidos Quando h interaces entre objectos, uma sequncia de teste uma histria de execuo de um conjunto de objectos interdependentes (em que a vida de cada objecto corresponde a um caminho vlido no diagrama de estados respectivo)

(Opc) Representar sequncias de teste por diagramas de sequncia UML Converter para VDM++ e completar com verificao de resultados esperados Testar tambm eventos no vlidos (violao de pr-condies)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

111

Exemplo de teste baseado em estados (1)


Ana Rita Lus Marta Rui

Nascimento Falecimento do cnjuge Solteiro Casamento Casado Casamento Vivo

Divrcio Casamento Falecimento Falecimento Divorciado Falecimento

Falecido

Falecimento

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

112

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

57

: Tes tPessoa 1. new Ana : Pessoa

Exemplo de teste baseado em estados (2)


5. Casamento 6. Falecimento

2. new

Restries temporais: 1,2 < 5 < 6; 3,6 < 7 < 8 < 11; 4,8 < 9 < 10 < 12
Luis : Pessoa

3. new

Rita : P essoa

4. new

Marta : Pessoa

5.1. Casamento

6.1. Falecimento do conjuge 7. Casamento 7.1. Casamento 8. Divorcio 8.1. Divorcio


1. new Rui : Pess oa

: TestPessoa

9. Casamento 9.1. Casamento

2. Falecimento

10. Falecimento 10.1. Falecimento do conjuge 11. Falecimento 12. Falecimento

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

113

Exemplo de teste baseado em estados (3)


public TestSingle() == ( -- setup dcl r: Pessoa; dcl d1: DateUtils`Date := mk_DateUtils`Date(1980, 1, 31); dcl d2: DateUtils`Date := mk_DateUtils`Date(2022, 3, 1); -- exercitar r := new Pessoa("Rui", <Masculino>, d1, nil, nil); -- verificar Assert(r.GetEstadoCivil() = <Solteiro>); Assert(r.GetDataNascimento() = d1); -- exercitar r.Falecimento(d2); -- verificar Assert(r.GetEstadoCivil() = <Falecido>); Assert(r.GetDataFalecimento() = d2) );
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

114

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

58

Exemplo de teste baseado em estados (4)


public TestCouples() == ( dcl d1: DateUtils`Date := mk_DateUtils`Date(1960, 1, 1); -- nascimento dcl d3: DateUtils`Date := mk_DateUtils`Date(2000, 1, 1); -- falec. conjuge dcl a: Pessoa := new Pessoa("Ana", <Feminino>, d1, nil, nil); dcl l: Pessoa := new Pessoa("Luis", <Masculino>, d1, nil, nil); a.Casamento(l); Assert(a.GetEstadoCivil() = <Casado>); Assert(a.GetConjuge() = l); Assert(l.GetEstadoCivil() = <Casado>); Assert(l.GetConjuge() = a); a.Falecimento(d3); Assert(a.GetEstadoCivil() = <Falecido>); Assert(a.GetConjuge() = nil); Assert(a.GetExConjuges() = [l]); Assert(a.GetDataFalecimento() = d3); Assert(l.GetEstadoCivil() = <Viuvo>); Assert(l.GetConjuge() = nil); Assert(l.GetExConjuges() = [a]); Quantos asserts vale a pena fazer?

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

115

Teste baseado em cenrios


Cenrios de utilizao so tambm bons cenrios de teste
Cenrios normais Cenrios alternativas / excepcionais

Cenrios de utilizao/teste podem ser representados por diagramas de sequncia UML Cenrios de utilizao/teste podem ser formalizados por mtodos de teste parametrizados em VDM++
Devem ser o mais genricos possvel Podem ter pr/ps condies e asseres

Instanciar depois os cenrios com valores de teste concretos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

116

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

59

Exemplo de teste baseado em cenrios


class ATMTest is subclass of Test public SuccessfulWithdrawal(m: ATM, c: Card, p: Pocket, pin: nat, value: nat1) == ( m.insertCard(c); public TestWithdrawalLimit() == ( Assert(m.getStatus() = <EnterPin>); dcl m : ATM := new ATM({10 -> 5, 20 -> 5}); m.enterPin(pin); dcl a : Account := new Account(150); Assert(m.getStatus() = <SelectOperation>); dcl c : Card := new Card(a, 1111); m.selectOperation(<Withdrawal>); dcl p : Pockect := new Pocket({|->}); Assert(m.getStatus() = <EnterAmount>); m.SetWithdrawalLimit(150); m.enterAmount(value); SuccessfulWithdrawal(m, c, p, 1111, 150) p.add(m.pickMoney()); ) m.removeCard() end ATMTest ) pre m.getStatus() = <InsertCard> and pin = c.getPin() and value <= c.getAccount().getBalance() and m.hasStock(value) and value <= m.getWithdrawalLimit() post c.getAccount().getBalance() = c.getAccount().getBalance()~ - value and m.getBalance() = m.getBalance()~ - value and p.getBalance() = p.getBalance()~ + value and m.getStatus() = <InsertCard>;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

117

Teste baseado em axiomas


Especificaes axiomticas (em OBJ, etc.) e testes partilham o facto de no usarem um modelo do estado interno do objecto (que normalmente est escondido) Tal como nos cenrios, axiomas podem ser formalizados por mtodos de teste parametrizados em VDM++
Vlidos para quaisquer valores dos parmetros que obedeam prcondio

Instanciar depois com valores de teste concretos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

118

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

60

Exemplo de teste baseado em axiomas


class StackTest is subclass of Test -- Top(Push(s,x)) = x public PushTop(s : Stack , x: int) == ( s.Push(x); Assert(s.Top() = x) );

Axiomas

-- Pop(Push(s, x)) = s public PushPop(s: Stack, x: int) == ( Stack spre = s.Clone(); s.Push(x); s.Pop(); Assert(s.Equals(spre)) ); public TestPushTop() == ( PushTop(new Stack(), 1) ); public TestPushPop() == ( PushPop(new Stack(), 1) ) end StackTest

Casos de teste

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

119

Test-Driven Development com VDM++


Princpios:
Escrever os testes antes do objecto dos testes (em cada iterao) Desenvolver por pequenas iteraes Automatizar os testes Refabricar (refactor) para remover duplicao de cdigo

Vantagens de TDD:
Garantir qualidade dos testes Pensar em casos particulares antes de pensar em casos gerais
- casos de teste so especificaes parciais

Sistemas complexos que funcionam resultam da evoluo de sistemas mais simples que funcionam

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

120

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

61

Exerccios
Seguir a parte final (sobre testes) do tutorial de utilizao das VDM Tools (problema da Stack) Escrever testes para o problema da contas bancrias

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

121

Modelao de eventos temporais

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

122

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

62

Exemplo de ciclo de vida de um emprstimo numa biblioteca


Pedido de emprstimo[ publicao emprestada ou reservada ] Espera disponibilidade Public ao devolvida ou pedido de emprstimo anulado[ no h outros pedidos mais antigos ] / notificar scio Levantamento Espera levantamento Publicao fica no estado Reservada

Pedido de emprst imo[ public ao disponvel ]

Publicao fica no estado Emprestada

Em curso

Devoluo

Scio anula pedido

when( data limite de levantamento + 1 ) / anular automaticamente e notificar scio Anulado

Concludo

Evento temporal

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

123

Modelao de eventos temporais em VDM++


VDM++ no tem suporte nativo para eventos temporais Eventos temporais podem ser gerados por um relgio com alarme O padro de desenho Observer pode ser usado na comunicao entre o relgio e os seus clientes Para efeito de modelao e teste, no necessrio usar a data do sistema, basta uma data simulada comandada pelo cdigo de teste Para simplificar os testes, vamos considerar que o relgio funciona de forma sncrona com o resto do sistema Posteriormente, o modelo poderia ser refinado para o caso assncrono, em que se teriam de tratar problemas de concorrncia

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

124

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

63

Modelo de estrutura esttica


AlarnListener AlarmFired() Clock curdate : Date : = nil alarms : map Date to seq of AlarmListener : = {|->} static static static static static SetCurDate(date : Date) GetCurDate() : Date IncrCurDate(ndays : nat1) AddAlarm(listener : AlarmListener, date : Date) RemoveAlarm(listener : AlarmListener, date : Date)

Emprstimo dataDisponibilizao : [Date]: = nil dataLimiteLevantamento : [Date]: = nil dataAnulao : [Date]: = nil dataLevantamento : [Date]: = nil -emprstimos dataDevoluo : [Date]: = nil prazoLevantamento : nat1 : = 2 * {ordered} AlarmFired() Disponibilizar() Levantar() Anular() Devolver()

-publicacao 1

Publicao Em pres tar(s : Scio) Requisitar(s : S cio)

TestBiblioteca

(notificao de scios a tratar mais tarde)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

125

TestBiblioteca

p1 : Publicao

Clock

Modelo de interaco (cenrio de teste)

1. SetCurDate(d) 2. Emprestar(s1) 2.1. new 3. Requisitar(s2) 3.1. new 4. Requisitar(s3) 4.1. new 5. Devolver( ) 5.1. Disponibilizar() 5.1. 1. AddAlarm(self, dtLimLev+1) 6. Inc rCurDate(prazoLevantamento+1) 6.1. AlarmFired() 6.1.1. Anular( ) e3 : Emprstimo e2 : Emprstimo e1 : Emprstimo

(notificao de scios no tratado)


7. Levantar()

6.1.1.1. Disponibilizar() 6.1.1.1.1. AddAlarm(self, dtLimLev+1)

7.1. RemoveAlarm(self, dtLimLev+1) 8. Devolver( )

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

126

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

64

Classe Clock (1)


Modelao do estado (a vermelho tem a ver com alarmes):
class Clock types public Date = DateUtils`Date; instance variables private static curdate : Date := DateUtils`MakeDate(2000,1,1); private static alarms : map Date to seq of AlarmListener := { |-> }; private static changing_curdate : bool := false; -- no podem existir alarmes para datas passadas, nem para a data actual (a no -- ser transitoriamente enquanto se processam os alarmes aps mudar a data) inv forall d in set dom alarms & if changing_curdate then d >= curdate else d > curdate; -- no podem existir listeners duplicados para a mesma data inv forall d in set dom alarms & not SeqUtils`HasDuplicates[AlarmListener](alarms(d));

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

127

Classe Clock (2)


Definio de operaes sobre a data corrente:
operations public static GetCurDate() res : Date == return curdate; public static SetCurDate(date : Date) == ( while curdate < date do IncrCurDate() ) pre date >= curdate and not changing_curdate; public static IncrCurDate(n : nat1) == ( for i = 1 to n do IncrCurDate() ) pre not changing_curdate;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Para no comprometer o processamento de alarmes!

128

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

65

Classe Clock (3)


Definio de operao auxiliar que incrementa a data corrente e dispara os alarmes, ilustrando tambm limitaes de ps-condies com callbacks
...

private static IncrCurDate() == ( changing_curdate := true; curdate := DateUtils`NextDate(curdate); while curdate in set dom alarms do ( dcl listener : AlarmListener := hd alarms(curdate); RemoveAlarm(listener, curdate); listener.AlarmFired() ); changing_curdate := false ) ext wr curdate, alarms, changing_curdate pre not changing_curdate -- no reentrante! post curdate = DateUtils`NextDate(curdate~) and curdate not in set dom alarms and not changing_curdate; -- ps-condio no formalizvel: os listeners registados para a nova data (e -- no removidos at chegar a sua vez), tm de ter sido chamados (com a data -- j actualizada) pela ordem por que se registaram

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

129

Classe Clock (4)


Definio de operaes para registar (adicionar) e remover alarmes (pscondies omitidas):
public static AddAlarm(listener : AlarmListener, date : Date) == ( if date in set dom alarms then alarms(date) := alarms(date) ^ [listener] else alarms := alarms munion { date |-> [listener] } ) pre date > curdate and not ExistsAlarm(listener, date); public static RemoveAlarm(listener : AlarmListener, date : Date) == ( alarms(date) := SeqUtils`Remove[AlarmListener](listener, alarms(date)); if alarms(date) = [] then alarms := {date} <-: alarms ) pre ExistsAlarm(listener, date); public static ExistsAlarm(listener : AlarmListener, date : Date) res: bool == return date in set dom alarms and listener in set elems alarms(date); end Clock
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

130

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

66

Classe AlarmListener

class AlarmListener operations public AlarmFired() == is subclass responsibility; end AlarmListener

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

131

Classe Emprstimo Registar alarme


class Emprstimo is subclass of AlarmListener -- Chamado internamente aquando da devoluo ou anulao doutro emprstimo private Disponibilizar() == ( dataDisponibilizao := Clock`GetCurDate(); dataLimiteLevantamento := DateUtils`DateAdd(dataDisponibilizao, prazoLevantamento); scio.Notificar(<PodeLevantar>, publicao, dataLimiteLevantamento); Clock`AddAlarm(self, DateUtils`NextDate(dataLimiteLevantamento)) ) pre GetEstado() = <EsperaDisponibilidade> post GetEstado() = <EsperaLevantamento>;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

132

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

67

Classe Emprstimo Reagir a alarme


-- Chamado de Clock quando o alarme dispara -- (nota: "public porque herda de public) public AlarmFired() == ( dataAnulao := Clock`GetCurDate(); scio.Notificar(<ExpirouPrazoLevantamento>, publicao, dataLimiteLevantamento); def e2 = publicao.GetPrximoPedido() in if e2 <> nil then e2.Disponibilizar() ) pre GetEstado() = <EsperaLevantamento> post GetEstado() = <Anulado>;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

133

Classe Emprstimo Remover alarme


-- O scio anula o pedido public Anular() == ( if GetEstado() = <EsperaLevantamento> then ( dataAnulao := Clock`GetCurDate(); -- altera estado Clock`RemoveAlarm(self, DateUtils`NextDate(dataLimiteLevantamento)); def e2 = publicao.GetPrximoPedido() in if e2 <> nil then e2.Disponibilizar() ) else dataAnulao := Clock`GetCurDate() ) pre GetEstado() in set {<EsperaDisponibilidade>, <EsperaLevantamento>} post GetEstado() = <Anulado>; -- O scio levanta a publicao pedida public Levantar() == ( dataLevantamento := Clock`GetCurDate(); Clock`RemoveAlarm(self, DateUtils`NextDate(dataLimiteLevantamento)) ) pre GetEstado() = <EsperaLevantamento> post GetEstado() = <EmCurso>;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

134

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

68

Definio de ps-condies com callbacks


No caso de operaes c/ callbacks (e.g., invocao de event listeners ou event handlers), quem escreve a operao no sabe o efeito resultante no estado do sistema Nestes casos, o efeito pretendido mais procedimental (e.g., invocar todos os event listeners registados, por ordem de registo) OCL permite exprimir efeitos de operaes que incluem envio de mensagens para outros objectos com consequncias desconhecidas (e.g. callbacks):
obj^msg(args) a operao enviou (has sent) uma instncia da mensagem msg (chamada de operao ou envio de sinal) para o objecto obj Wildcard ? pode ser usado para argumentos de valor desconhecido ou livre

Exemplo:
context Clock::IncrCurDate() post: alarms(curdate)@pre->forAll( alarm | alarm ^ AlarmFired()) Mas no garante que seguida a ordem de registo! E no permite tratar o caso de eliminao/adio de alarmes!
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

135

* Exerccio
Escrever uma especificao de um sistema de gesto de elevadores, usando um relgio simulado, com vista a permitir avaliar, por simulao, o desempenho de diferentes algoritmos de atendimento dos pedidos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

136

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

69

Concorrncia e sincronizao

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

137

Concorrncia e sincronizao em VDM++


Concorrncia: atravs da definio de objectos activos que podem ser donos de threads
Classes de objectos activos tm seco thread onde se especifica o comportamento do thread Instruo start inicia thread num objecto previamente criado Dois tipos de threads: simples e peridicos

Sincronizao: atravs de restries de sincronizao no acesso a objectos partilhados (tipicamente passivos)


Restries de sincronizao so definidas de forma declarativa Permitem limitar concorrncia entre objectos activos/threads Restries so indicadas na seco sync da definio da classe Dois tipos de restries/predicaos: de permisso e de excluso mtua Restries so herdadas por subclasses

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

138

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

70

Threads simples (ou procedimentais)


thread statement(s)
Seco da definio da classe que indica a instruo (normalmente uma operao) ou sequncia de instrues a realizar pelo thread O thread morre quando se completa a execuo dessa(s) instruo(es)

start(objRef)
Instruo usada para iniciar um thread sobre o objecto indicado O thread no iniciado ao criar o objecto para permitir inicializaes Chamado de novo (mesmo sem acabar anterior), inicia novo thread

startlist(objRefSet)
Instruo usada para iniciar um conjunto de threads

threadid
Nmero natural que identifica univocamente o thread corrente

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

139

Exemplo
class Worker operations standard VDM++ IO library public doit() == ( dcl io : IO := new IO(); dcl rc : bool; for i = 1 to 40 do rc := io.fwriteval[nat * nat]("out.txt", mk_(threadid, i), <append>) ); public wait_done() == skip; public static main() == ( dcl w1 : Worker := new Worker(); dcl w2 : Worker := new Worker(); start(w1); start(w2); w1.wait_done(); w2.wait_done() ); Com w1 outra vez tambm resultava thread doit() sync per wait_done => #fin(doit) > #act(wait_done) end Worker

out.txt
mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1) 2) 3) 4) 5) 6) 7) 8) 9) 10 ) 11 ) 12 ) 13 ) 14 ) 15 ) 16 ) 17 ) 18 ) 19 ) 20 ) 1) 2) 3) 4) 5) 6) 7) 8) mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9) 10 ) 11 ) 12 ) 13 ) 14 ) 15 ) 16 ) 17 ) 18 ) 19 ) 20 ) 21 ) 22 ) 23 ) 24 ) 25 ) 26 ) 27 ) 28 ) 29 ) 30 ) 31 ) 32 ) 33 ) 34 ) 35 ) 36 ) mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( mk_( 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 37 38 39 40 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

140

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

71

A propsito: biblioteca padro de IO


Incluir ficheiro $TOOLBOXHOME/stdlib/io.vpp no projecto writeval[tipo](valor)
Funo que escreve o valor do tipo indicado, em ASCII, no standard output Exemplo: writeval[nat](20)

fwriteval[tipo](ficheiro, valor, modo)


Funo que escreve o valor do tipo indicado, em ASCII, no standard output O modo pode ser <append> (acrescentar) ou <start> (criar) Exemplo: fwriteval[nat]("output.txt", 20, <append>)

echo(texto)
Operao que escreve o texto, possivelmente com sequncias de escape, no standard output. Exemplo: echo(ola\n")

fecho(ficheiro, texto, [modo])


Idem, em ficheiro

ferror()
Todas as funes/operaes anteriores devolvem false em caso de erro. Esta operao devolve (e limpa) a string com a mensagem de erro correspondente

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

141

Threads peridicos
thread periodic (timeinterval) (opname)
Executa repetidamente a operao de acordo com o intervalo de tempo especificado (em unidades de tempo do sistema) A operao deve executar em tempo inferior ao intervalo de tempo No so suportados pelas VDMTools Light -- timer that periodically increments its clock, at every 1000 system time units class Timer instance variables private curTime : nat := 0; operations private IncTime() == curTime := curTime + 1; public GetTime() res: nat == return curTime; thread periodic(1000)(IncTime) end Elevator
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

142

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

72

Predicados de permisso
per operation-name => guard-condition
Especifica condio a verificar para a operao poder ser executada Se no se verificar no momento da chamada da operao, esta fica em espera

Condio de guarda pode usar valores de variveis de instncia, bem como valores de contadores de execuo de operaes (ver a seguir) Condio de guarda diferente de uma pr-condio
No satisfao de pr-condio um erro No satisfao de condio de guarda apenas coloca a chamada em espera

Interpretador detecta e avisa eventuais situaes de deadlock S se pode especificar um predicado de permisso por operao * Regras para reavaliao das condies de guarda:
Ocorre quando termina a execuo duma operao (sobre mesmo objecto) Teste da condio e (potencial) activao da operao realizados atomicamente No est definido qual o objecto cuja expresso de guarda reavaliada 1

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

143

Contadores de execuo de operaes


waiting request (chamada) Expresso #act(op- name) #fin(op- name) #active(op- name) activation (incio de execuo) Descrio N de vezes que a operao foi activada (iniciou execuo) sobre este objecto. N de vezes que a operao foi concluda (terminou execuo) sobre este objecto. N de chamadas da operao que esto presentemente activas sobre este objecto. #active(op-name) = #act(op-name) - #fin(op-name) N de chamadas da operao sobre este objecto. active completion (fim de execuo)

#req(op- name)

#waiting(op- name) N de chamadas que esto presentemente em espera sobre este objecto. #waiting(op-name) = #req(op-name) - #act(op-name)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

144

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

73

Predicados de excluso mtua (mutex)


mutex(op-name1, op-name2, )
Operaes no podem executar em simultneo (sobre o mesmo objecto)

mutex(all)
all refere-se a todas as operaes definidas na classe e superclasses

A mesma operao pode aparecer em mltiplos predicados mutex (e num predicado de permisso) Predicados mutex so implicitam/ traduzidos para predicados de permisso mutex(opA, opB); mutex(opB, opC, opD); per opD => someVariable > 42; per opA => #active(opA) + #active(opB) = 0; per opB => #active(opA) + #active(opB) = 0 and #active(opB) + #active(opC) + #active(opD) = 0; per opC => #active(opB) + #active(opC) + #active(opD) = 0; per opD => #active(opB) + #active(opC) + #active(opD) = 0 and someVariable > 42;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

145

Exemplo Bounded Buffer (1/4)


-- Bounded buffer used to exchange messages between active objects class BoundedBuffer values public EndOfMessage : char = '!'; instance variables private buf : seq of char := []; private size : nat1; operations public BoundedBuffer(sz: nat1) res:BoundedBuffer == (size := sz; return self); public Get() res : char == (dcl c : char := hd buf; buf := tl buf; return c ); public Put(c: char) == ( buf := buf ^ [c] ); sync per Get => len buf > 0; -- waits until buffer not empty per Put => len buf < size; -- waits until buffer not full end BoundedBuffer
Sistema sequencial Sistema concorrente Pr-condio (c/args) Condio de guarda (s/args)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

146

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

74

Exemplo Bounded Buffer (2/4)


-- Active object responsible for sending a message through a channel class SenderAgent instance variables private channel : BoundedBuffer; private message : seq of char; operations public SenderAgent(ch: BoundedBuffer, msg: seq of char)res:SenderAgent == (channel := ch; message := msg; return self); public SendNow() == ( for c in message do channel.Put(c); channel.Put(BoundedBuffer`EndOfMessage) ) thread SendNow() end SenderAgent

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

147

Exemplo Bounded Buffer (3/4)


-- Active object responsible for receiving a message through a channel class ReceiverAgent instance variables private channel : BoundedBuffer; private message : seq of char := []; operations public ReceiverAgent(ch : BoundedBuffer) r: ReceiverAgent == (channel := ch; return self); public ReceiveNow() == ( dcl c : char := channel.Get(); message := []; while c <> BoundedBuffer`EndOfMessage do ( message := message ^ [c]; c := channel.Get()) ); public GetMessage() res : seq of char == return message; thread ReceiveNow() sync -- GetMessage waits for the reception of one more message per GetMessage => #fin(ReceiveNow) > #act(GetMessage) end ReceiverAgent
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

148

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

75

Exemplo Bounded Buffer (4/4)


class BoundedBufferTest is subclass of Test operations -- mtodo de teste que comando o envio e recepo duma mensagem public Test1() == ( dcl m : seq of char := ab"; dcl b : BoundedBuffer := new BoundedBuffer(1); -- capac<len msg! dcl s : SenderAgent := new SenderAgent(b, m); dcl r : ReceiverAgent := new ReceiverAgent(b); start(r); start(s); Assert(r.GetMessage() = m) ) end BoundedBufferTest

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

149

: BoundedBufferTest

objectos activos

Exemplo de execuo

Test1()

1. BoundedB uffer(1) 2. SenderAgent(b, "ab") 3. ReceiverAgent(b) s : SenderAgent

b : BoundedBuffer

objecto passivo mensagens assncronas

r : ReceiverAgent

4. start 5. start 6. GetMessage( )

(diagrama de sequncia UML modificado)

6.1. C1. Get ( )

(wait)

B1. Put('a') 5.1. B1.1. 5.1. 1.

(wait)

6.1.1. C1.1. return 'a' 5.2. B2. Put('b') 5.2.1. B2.1. 5.3. B3. Put('!') 6.2. C2. Get( ) (wait) 6.2.1. C2.1. return 'b'

B3.1. 5.3.1.
6.3. C3. Get( )

6.4. return "ab"

prefixo identificativo do thread

6.3.1. C3.1. return '!'

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

150

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

76

* Exerccios
Experimentar os exemplos descritos nas VDM Tools Especificar um gestor de locks partilhados (para leitura) e exclusivos (para escrita) a objectos, com ou sem espera

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

151

Projecto: Mquina de vendas


Elaborar um modelo UML (diagramas de classes e de estados) de uma mquina de vendas, importar para VDM++, e completar especificao (para j no executvel) com invariantes, pr-condies, ps-condies e corpo de operaes e testar a especificao. Requisitos
A mquina aceita moedas de 0.05, 0.1, 0.2, 0.5, 1 e 2 euros A mquina tem um stock de moedas que servem para dar o troco aos clientes que o necessitem A mquina tem um stock de produtos e cada produto tem um preo A mquina pode estar em modo de operao ou manuteno No modo de manuteno, possvel actualizar o stock de produtos e de moedas No modo de utilizao, a mquina deve mostrar aos clientes os produtos disponveis; estes seleccionam o produto pretendido e depois inserem as moedas correspondentes; a mquina deve dar troco sempre que possvel ou devolver o dinheiro ao cliente sem efectuar a venda.

Usar algoritmo guloso (greedy) com retrocesso (backtracking) para calcular o troco procurando minimizar o n de moedas
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

152

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

77

Referncias e leituras adicionais


Validated Designs for Object-oriented Systems. John Fitzgerald, Peter Gorm Larsen, Paul Mukherjee, Nico Plat and Marcel Verhoef. ISBN: 185233-881-4. Springer Verlag, New York. 2005. http://www.vdmbook.com/ Manual de VDM++ (langmanpp_a4.pdf) Manual de VDMTools (usermanpp_a4.pdf) www.uml.org especificaes e recursos sobre UML, OCL, etc.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

153

Anexo A: Guio de Utilizao da Ferramenta VDMTools Lite

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

154

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

78

Utilizao das VDMTools Lite


Instalar Arrancar Criar um projecto Escrever uma especificao Adicionar ficheiro ao projecto Verificar sintaxe e tipos Depurao de erros Correr o interpretador Verificao de invariantes, pr-condies e ps-condies Reunir casos de teste numa classe de teste Analisar cobertura dos testes Produzir um relatrio do projecto

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

155

Instalar
VDM++ Toolbox Lite v8.0 (verso sem gerao de cdigo) Download gratuito (aps registo) a partir de http://www.vdmbook.com/ -> tools -> download Instalao em Linux: a verso Lite (gratuita) s existe para Windows, a verso comercial tambm existe para Linux

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

156

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

79

Arrancar
Start -> VDMTools -> VDM++ Toolbox Lite v8.0 ou The VDM++ Toolbox Lite v8.0\bin\vppgde.exe

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

157

Criar um projecto (1/2)


1

(no faz nada para j )

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

158

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

80

Criar um projecto (2/2)

2 3
Convm criar uma pasta para cada projecto Caminho no pode ser muito comprido, seno falha!

(verso de Windows em portugus )


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

159

Criar um projecto (3/3)

Caminho no pode ser muito comprido, seno falha (cannot change directory .) !

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

160

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

81

Escrever uma especificao (1)


Programao literria (cdigo e documentao integrados) Cdigo em VDM++ escrito num documento em formato RTF (Rich Text Format), usando estilos pr-definidos no template The VDM++ Toolbox Lite v8.0\word\VDM.dot Abrir o ficheiro VDM.dot e gravar em formato RTF, com o nome da classe a criar, por exemplo FStack.rtf, no directrio do projecto Normalmente, convm criar um ficheiro para cada classe O ficheiro pode ter cdigo VDM++ e documentao Formatar o cdigo VDM++ com o estilo VDM

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

161

Escrever uma especificao (2)

estilo Heading 1 estilo Normal Etc.

estilo VDM

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

162

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

82

Adicionar ficheiro ao projecto (1)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

163

Adicionar ficheiro ao projecto (2)

Sintaxe Ok

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

164

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

83

Verificar sintaxe e tipos

1 - ver as classes 2 seleccionar Sintaxe Ok Tipos Ok

3 verificar sintaxe

4 verificar tipos

Sintaxe Ok Tipos Ok

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

165

Depurao de erros

Fazer duplo clique no erro

Descrio do erro

Localizao Anlise: o problema que ~ deve ser colocado do erro depois e no antes da varivel de instncia

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

166

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

84

Correr o interpretador - abrir

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

167

Correr o interpretador - inicializar

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

168

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

85

Correr o interpretador criar um objecto

create s := new FStack(2)

Stack de capacidade minscula para testar

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

169

Correr o interpretador consultar o estado dum objecto

print s

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

170

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

86

Correr o interpretador manipular um objecto

print s.Push(1) print s.Top()

print s

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

171

Verificao de invariantes, pr-condies e ps-condies - Activar verificao

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

172

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

87

Verificao de invariantes, pr-condies e ps-condies - Violao de invariante

O invariante testado aps cada instruo do construtor, e falhou na 1 instruo!

Soluo: capacity : nat := 0

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

173

Verificao de invariantes, pr-condies e ps-condies Violao de pr-condio

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

174

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

88

Verificao de invariantes, pr-condies e ps-condies Violao de pr-condio

S tem capacidade para 2

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

175

Reunir casos de teste numa classe de teste


1. 2. 3. 4. 5. 6. Criar o ficheiro Adicionar ao projecto Verificar sintaxe Verificar tipos Inicializar o interpretador Executar os seguintes comandos:

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

176

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

89

Analisar cobertura dos testes


1 - Colocar placeholders para tabelas de cobertura de testes (test coverage)

Nome da classe, estilo VDM_TC_TABLE. Ser substitudo por tabela com informao de cobertura de testes ao fazer pretty print.
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

177

Analisar cobertura dos testes

Pode-se fazer o mesmo relativamente ao prprio cdigo de teste

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

178

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

90

Analisar cobertura dos testes


2 - Para cada caso de teste XPTO, preparar dois ficheiros de texto (por exemplo no directrio do projecto):
ficheiro XPTO.arg, com o comando para o interpretador ficheiro XPTO.arg.exp, com o resultado esperado da avaliao do comando (print comando)
Input Output esperado

Etc.

Na realidade, deve violar pr-condio, mas no h maneira de o indicar (!?)


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

179

Analisar cobertura dos testes


3 - Preparar scripts de teste (no mesmo directrio)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

180

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

91

Analisar cobertura dos testes


4 - Executar o script com o ciclo de testes

OK

Conforme esperado

Tambm gera um ficheiro vdm.tc com informao de cobertura de cdigo, a usar pelo pretty printer!
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

181

Analisar cobertura dos testes


5 - Preparar configurao de pretty printer

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

182

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

92

Analisar cobertura dos testes


6 - Efectuar o pretty print
2 - pretty print

1 seleccionar

3 aparece

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

183

Analisar cobertura dos testes


7 - Analisar o resultado (ficheiros .rtf.rtf !)

Cdigo no executado assinalado a vermelho 100% de cobertura de todas as operaes duas operaes (casos de teste) no foram executadas

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

184

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

93

Produzir um relatrio do projecto


No Word, criar documento, por exemplo master.rtf, em que se inserem links para os vrios ficheiros com a facilidade Insert File -> boto Insert as Link Convm inserir os ficheiros resultantes de pretty print (ClassName.rtf.rtf) Usar facilidade Update field para actualizar os links Ver exemplo em Stack\master.rtf Ver exemplo com todos os ficheiros do projecto em Stack.zip

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

185

Anexo B: Operadores e expresses em VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

186

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

94

Operadores e expresses
Operadores
Operadores de comparao Operadores booleanos Operadores numricos Operadores sobre conjuntos Construo de conjuntos Operadores sobre sequncias Construo de sequncias Operadores sobre mapeamentos Construo de mapeamentos Operadores sobre records Operadores sobre tuplos

Expresses
Expresso let Expresses if e cases Padres Quantificadores Ligaes (bindings) Expresso de seleco iota Teste de pertena a tipo Teste de pertence a classe

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

187

Operadores de comparao
Igual: = Diferente: <> Esto definidos para todos os tipos de dados, inclusive conjuntos, sequncias e mapeamentos (maps) So os nicos operadores para os tipos char, token e quotes

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

188

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

95

Operadores booleanos

(fonte: langmanpp_a4.pdf)

No caso de and, or e =>, 2 operando s avaliado se for necessrio para determinar o resultado Na realidade, segue lgica de 3 valores (3 valor significa no definido)
ver detalhes no manual

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

189

Operadores numricos

Nota: Os tipos indicados para os operandos so os mais gerais permitidos. Isto significa, por exemplo, que o sinal menos unrio funciona para operandos de todos os tipos numricos (nat1, nat, int, rat e real).

(fonte: langmanpp_a4.pdf)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

190

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

96

Operadores sobre conjuntos


Operador
e in set s1 e not in set s1 s1 union s2 s1 inter s2 s1 \ s2 s1 subset s2

Nome
Pertena No pertena Reunio Interseco Diferena Subconjunto

Descrio
e s1 e s1 s1 s2 s1 s2 s1 \ s2 s1 s2 s1 s2 (s1s2 s1s2) s1 = s2 s1 s2 # s1 si
si ss si ss

Tipo
A * set of A bool set of A * set of A set of A

s1 psubset s2 Subconjunto prprio s1 = s2 s1 <> s2 card s1 dunion ss dinter ss power s1 Igualdade Desigualdade Cardinal Reunio distribuda Interseco distribuda Conjunto de sub-conjuntos (ou partes) de s1

set of A * set of A bool

set of A nat set of set of A set of A set of A set of set of A

si

P (s1)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

191

Operadores sobre conjuntos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

192

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

97

Construo de conjuntos
Em extenso: {e1, e2, , en}
Exemplos: {1, 3, 5}, { }

Em compreenso: {e | bd1, bd2, ..., bdm & P}


Conjunto formado pelos valores da expresso e (sem duplicados) para todos os valores das variveis introduzidas nos bindings que obedecem ao predicado P Normalmente o binding da forma: varivel in set conjunto Formas mais gerais de bindings ver mais adiante A parte do predicado (& P) opcional

Por intervalo: {lower, , upper}


Conjunto de valores inteiros entre lower e upper, inclusive Exemplo: {1, ... , 6} o mesmo que {1, 2, 3, 4, 5, 6} Se lower > upper , o conjunto vazio

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

193

Exemplo: Registo Civil


Operao para obter os filhos de uma pessoa:
public GetFIlhos() res : set of Pessoa == return { f | f in set pessoas & f.pai = self or f.mae = self };

Operao p/ obter todos os descendentes de uma pessoa:


public GetDescendentes() res : set of Pessoa == return GetFilhos() union dunion { f.GetDescendentes() | f in set GetFilhos() };

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

194

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

98

Operadores sobre sequncias


Operador hd l tl l len l elems l inds l Nome Descrio D a subsequncia de l em que o 1 elemento foi removido. l no pode ser vazia D o conjunto formado pelos elementos de l (sem ordem nem repetidos) D o conjunto dos ndices de l, i.e., {1, ..., len l} Tipo seq of A A seq of A seq of A seq of A nat seq of A set of A seq of A set of nat1 (seq of A) * (seq of A) seq of A seq of seq of A seq of A (seq of A) * (map nat1 to A) seq of A seq of A * nat1 A seq of A * nat * nat seq of A Cabea (head) D o 1 elemento de l, que no pode ser vazia Cauda (tail)

Comprimento D o comprimento de l Elementos ndices

D a sequncia formada pelos elementos de l1 l1 ^ l2 Concatenao seguida pelos elementos de l2 Concatenao D a sequncia formada pela concatenao dos conc ll distribuda elementos de ll (que so por sua vez sequncias) Os elementos de l cujos ndices esto no domnio de Modificao l ++ m m so modificados para o valor correspondente em de sequncia m. Deve-se verificar: dom m subset inds l. Aplicao de D o elemento que se encontra no ndice i de l. l(i) sequncia Deve-se verificar: i in set inds l. D a subsequncia de l entre os ndices i e j, l(i, ..., j) Subsequncia inclusive. Se i < 1, considera-se 1. Se j > len s, considera-se len(s). Outros: =, <>

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

195

Operadores sobre sequncias

l1(2, ..., 4)

[1, 4, 1]
196

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

99

Construo de sequncias
Em extenso: [e1, e2, , en]
Exemplos: [1, 3, 1, 5], [ ]

Em compreenso: [e | id in set S & P]


Constri a sequncia formada pelos valores da expresso e para todos os valores do identificador id (por ordem crescente) em que o predicate P verdadeiro. A expresso e deve usar o identificador id S deve ser um conjunto numrico A parte do predicado (& P) opcional

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

197

Operadores sobre mapeamentos


Operador Nome Descrio Tipo

D o domnio (conjunto de chaves) dom m Domnio de m D o contra-domnio (conjunto de Contra-domnio rng m valores correspondentes a chaves) (range) de m Faz a reunio dos pares chavevalor existentes em m1 e m2, que Reunio m1 munion m2 tm de ser compatveis (no (merge) podem fazer corresponder valores diferentes a chaves iguais) Reunio sem restrio de Sobreposio m1 ++ m2 compatibilidade. Em caso de (override) conflito, prevalece m2. Faz a reunio dos mapeamentos Reunio merge ms contidos em ms, que devem ser distribuda compatveis.

map A to B set of A map A to B set of B

(map A to B) * (map A to B) map A to B

set of (map A to B) map A to B

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

198

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

100

Operadores sobre mapeamentos


Operador Nome Descrio Tipo

s <: m

s <-: m

m :> s

m :-> s

D o mapeamento constitudo pelos elementos Domnio de m cuja chave est em s (que no tem de ser restrito a um subconjunto de dom m) D o mapeamento constitudo pelos elementos Domnio de m cuja chave no est em s (que no tem de restrito por ser um subconjunto de dom m) ContraD o mapeamento constitudo pelos elementos de m cujo valor de informao est em s (que domnio no tem de ser um subconjunto de rng m) restrito a ContraD o mapeamento constitudo pelos elementos de m cujo valor de informao no est em s domnio restrito por (que no tem de ser um subconjunto de rng m)

(set of A) * (map A to B) map A to B

(map A to B) * (set of B) map A to B

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

199

Operadores sobre mapeamentos


Operador Nome Descrio Tipo

Aplicao de D o valor corresponde chave d por m. m(d) mapeamento A chave d deve existir no domnio de m. D m2 seguido de m1. O mapeamento resultante tem o mesmo domnio que Composio m2. O valor correspondente a cada m1 comp m2 de chave obtido aplicando primeiro m2 e mapeamentos depois m1. Restrio: rng m2 subset dom m1. Composio de m consigo prprio n vezes. Se n=0, d a funo identidade, em que cada elemento do domnio m ** n Iterao mapeado para si prprio. Se n=1, d m. Se n>1, rng m deve ser um subconjunto de dom m. Mapeamento D o inverso de m, que deve ser inverse m inverso injectivo.
Outros: =, <>

(map A to B) * A B (map B to C) * (map A to B) map A to C

(map A to A) * nat map A to A inmap A to B inmap B to A

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

200

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

101

Operadores sobre mapeamentos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

201

Operadores sobre mapeamentos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

202

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

102

Operadores sobre mapeamentos

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

203

Construo de mapeamentos
Em extenso: {d1 |-> r1, d2 |-> r2, ..., dn |-> rn}
Exemplo: { 1 |-> um, 2 |-> dois } Mapeamento vazio: {|->} (para distinguir de conjunto vazio)

Em compreenso: {ed |-> er | bd1, ..., bdn & P}


Constri um mapeamento avaliando as expresses ed (chave) e er (valor correspondente chave) para todos os bindings possveis para os quais o predicado P verdadeiro Exemplo: listagem de pessoas e n de filhos correspondente, restrita s pessoas com filhos { p |-> card p.GetFilhos() | p in set pessoas & p.GetFilhos() <> {} }

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

204

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

103

Operadores sobre records

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

205

Operadores sobre records

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

206

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

104

* Operadores sobre records

Na realidade no modifica, gera um novo record modificado!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

207

Operadores sobre tuplos


(Lembrar que tuplos so instncias de produtos de tipos)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

208

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

105

Expresso let
let definio1, definio2, in expresso
Devolve valor da expresso da parte in usando definies de variveis ou funes introduzidas na parte let Definio de varivel (no sentido matemtico): identificador = expresso Definio de varivel (no sentido matemtico) c/ padro: padro = expresso Definio de funo: usando sintaxe habitual para definir funo de forma explcita (assinatura introduzida antes dos nomes dos argumentos) Permite aumentar a legibilidade da especificao

let identificador in set conjunto [be st condio] in expresso


Escolhe um elemento arbitrrio do conjunto para usar na expresso Devolve o valor da expresso da parte in No caso da parte be st existir (ler be such that), escolhe um elemento obedecendo condio Outras formas: ver manual

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

209

Exemplos de let
Exemplo: Funo para obter o mximo dum conjunto de reais max(s: set of real) res: real == let x in set s Escolhe valor arbitrrio x de conjunto s para usar a seguir in let resto = s \ {x} Define varivel resto para usar a seguir in if resto = {} then x else let max2: real * real -> real Define funo max2 max2(a,b) == if a > b then a else b para usar a seguir in max2(x, max(resto)) pre s <> {}; max(s: set of real) res: real == let x in set s be st (not exists y in set s & y > x) in x pre s <> {};

Escolhe valor de conjunto obedecendo a condio

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

210

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

106

Expresses if e cases
if condio then expresso1 else expresso2
Se a condio for verdadeira, d o valor da expresso1, seno d o valor da expresso2 elseif = else if

cases expresso: padro11, ..., padro1N -> expresso1, ... , padroM1, ..., padroMN -> expressoM, others -> expressoM1 end
Os padres (ver a seguir) so comparados por ordem com a expresso Se o 1 padro a fazer match padroij , devolve o valor de expressoi Parte others opcional Semelhante a switch, com a diferena de se poderem usar padres

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

211

Exemplo de cases com constantes


functions public static DaysOfMonth(year, month: nat1) res : nat1 == ( cases month : 1, 3, 5, 7, 8, 10, 12 -> 31, 4, 6, 9, 11 -> 30, 2 -> if IsLeapYear(year) then 29 else 28 end ) pre month >= 1 and month <= 12;

Caso simples em que os padres so constantes literais

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

212

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

107

Exemplo de cases com padres


Caso de sequncia vazia (usa padro de constante literal) Caso de sequncia com um nico elemento x (usa padro de enumerao de sequncia e padro de identificador) Caso de sequncia que se pode exprimir como a concatenao de duas subsequncias no vazias (usa padro de concatenao de sequncias e padro de identificador)

functions mergesort (s: seq of nat) res: seq of nat == cases s: [] -> [], [x] -> [x], s1 ^ s2 -> merge (mergesort(s1), mergesort(s2)) end;

merge(s1, s2: seq of nat) res : seq of nat == cases true: (s1 = []) -> s2, (s2 = []) -> s1, (hd s1 < hd s2) -> [hd s1] ^ merge(tl s1, s2), Usa padro valor de expresso. Necessita parntesis! others -> [hd s2] ^ merge(s1, tl s2) end;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

213

Padres
Tipo de padro Descrio Faz match com qualquer valor, fixando o valor do identificador. Constante literal. S faz match com o mesmo valor. Dont care. Valor de uma expresso. S faz match com o mesmo valor. Parntesis podem ser necessrios para no confundir com outros padres. Faz match com um conjunto com o mesmo n de elementos, e que fazem match com os padres p1, p2, etc. (por qualquer ordem). Faz match com um conjunto que se pode exprimir como a unio de dois subconjuntos disjuntos no vazios que fazem match com os padres p1 e p2. Faz match com uma sequncia com o mesmo n de elementos, e que fazem match com os padres p1, p2, etc. (pela mesma ordem). Faz match com uma sequncia que se pode exprimir como a concatenao de duas subsequncias no vazias que fazem match com os padres p1 e p2. Faz match com um tuplo com o mesmo n de componentes, e que fazem match com os padres indicados (pela mesma ordem).

identifier literal (expression) {p1, p2, } p1 union p2 [p1, p2, ] p1 ^ p2 mk_(p1, p2, )

mk_RecordName( Faz match com um record do mesmo tipo e com o mesmo n de componentes, e que fazem match com os padres indicados (pela mesma ordem). p1, p2, )

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

214

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

108

Quantificadores
forall binding & condio

qualquer que seja verifica que

exists binding & condio

existe pelo menos um tal que

exists1 binding & condio

existe um e um s tal que

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

215

Ligaes (bindings)
Set binding: padro1, ..., padroN in set conjunto
Tenta fazer match dos padres com os elementos do conjunto, fixando (binding) os valores dos identificadores introduzidos nos padres Na maioria dos casos, os padres so simplesmente identificadores

Type binding: padro1, ..., padroN : tipo


Semelhante ao anterior, s que considera as instncias de um tipo (potencialmente em n infinito!) em vez dos elementos de um conjunto Type bindings no so executados pelo interpretador, pois um tipo de dados pode ter um nmero infinito de instncia!

Usados principalmente em quantificadores e definio de coleces em compreenso

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

216

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

109

Exemplos com quantificadores


Exemplo: restrio de unicidade de chave -- nmero chave de scio, isto , no podem existir -- dois scios diferentes com o mesmo nmero com o mesmo nmero inv not exists s1, s2 in set scios & & s1 <> s2 and s1.nmero = s2.nmero; s1.GetNmero() = s2.GetNmero();

ou, equivalentemente (pelas leis de De Morgan): inv forall s1, s2 in set scios & s1 <> s2 => s1.nmero <> s2.nmero;

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

217

Expresso de seleco iota


iota identificador in set conjunto & condio

Selecciona o nico elemento do conjunto que obedece condio Outras formas da expresso iota: ver manual Exemplo: Operao de seleco de scio pelo nmero (chave) public GetScio(nmero: nat1) res: Scio == return iota s in set scios & s.GetNmero() = nmero pre exists1 s in set scios & s.GetNmero() = nmero; Exemplo do mximo max(s: set of real) res: real == iota x in set s & (not exists y in set s & y > x) pre s <> {};

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

218

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

110

Teste de pertena a tipo


Sintaxe is_typeName( expression) Semntica
Verifica se a expresso do tipo indicado. S aplicvel a tipos bsicos e records. Verifica se a expresso do tipo indicado. aplicvel tambm a outros tipos.

Exemplos
is_bool(1) false is_Date(mk_Date(2001,1,1)) true

is_(expression, typeExpr)

size: set of nat | seq of nat -> nat size(s) == if is_(s, seq of char) then len s else card s;

til sobretudo quando se usam unies!

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

219

Teste de pertena a classe


Sintaxe isofclass(className, object_ref) sameclass(object_ref1, object_ref2) isofbaseclass(className, object_ref) samebaseclass(object_ref1, object_ref2) Semntica
Verifica se o objecto indicado uma instncia da classe indicada ou de uma subclasse Verifica se os dois objectos so instncias da mesma classe Verifica se o objecto indicado instncia duma classe que tem a classe indicada como raiz na hierarquia de classes Verifica se os dois objectos so instncias de classes que tm uma classe comum como raiz na hierarquia de classes

til sobretudo quando se usam subclasses (equivalente OO a unies)!


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

220

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

111

Teste de pertena a classe


Considerando Oi instncia de Ci, em relao a O2 so verdadeiras (apenas) as seguintes expresses: isofclass(C2,O2) isofclass(C1,O2) isofclass(C5,O2) isofbaseclass(C1,O2) isofbaseclass(C5,O2) sameclass(O2,O2) samebaseclass(O1,O2) samebaseclass(O2,O2) samebaseclass(O3,O2) samebaseclass(O4,O2) samebaseclass(O5,O2)
raizes da hierarquia de classes

C1

C5

C6

C2

C4

C3

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

221

Anexo C: Funes avanadas em VDM++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

222

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

112

Funes avanadas
Funes polimrficas Funes de ordem superior O tipo funo A expresso lambda

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

223

Funes polimrficas
nomeFuno[@TypeParam1, @TypeParam2, ]

So funes genricas, que podem ser usadas com valores de diferentes tipos Tm parmetros especiais (type parameters) que devem ser substitudos por nomes de tipos concretos ao usar a funo Nomes desses parmetros comeam por @ e so indicados entre parntesis rectos a seguir ao nome da funo Semelhantes a function templates em C++

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

224

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

113

Funes polimrficas
Exemplo: funo utilitria, que verifica se uma sequncia de elementos de um tipo qualquer tem duplicados:

public static HasDuplicates[@T](s: seq of @T) res: bool == exists i, j in set inds s & i <> j and s(i) = s(j);
Exemplo de utilizao dessa funo:

class Publicao instance variables private autores: seq of Autor := []; inv not HasDuplicates[Autor](autores);

Passa um tipo concreto

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

225

Funes de ordem superior


So funes que recebem outras funes como argumentos, ou (Curried functions) que retornam funes como resultado I.e. tm argumentos ou resultado do tipo funo Exemplo: funo que acha um zero aproximado duma funo entre limites especificados, com erro mximo especificado, pelo mtodo das bisseces sucessivas:

findZero( f: real -> real , x1, x2, err: real) res: real == if abs(x1 - x2) <= err and abs(f(x1) f(x2)) <= err then x1 else let m = (x1 + x2) / 2 in if sinal(f(m)) = sinal(f(x1)) then findZero(m,x2) else findZero(x1,m) pre sinal(f(x1)) <> sinal(f(x2));
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

226

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

114

O tipo funo
Funo total: arg1Type * arg2Type * +> resultType

Funo parcial: arg1Type * arg2Type * -> resultType


Pode-se ver como um nico argumento do tipo tuplo (instncia do produto de tipos)

O tipo de uma funo definido pelos tipos de argumentos e resultado Instncias de um tipo de funo (i.e. funes concretas) podem ser passadas como argumento ou retorno de funes, e guardadas (por referncia) em estruturas de dados

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

227

O tipo funo

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

228

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

115

A expresso lambda
lambda padroArg1: Tipo1, , padroArgN: TipoN & expr

Constri uma funo on the fly Padres normalmente so simplesmente identificadores de argumentos Usado normalmente para passar como argumento a outra funo (de ordem superior) Exemplo: achar um zero real de um polinmio findZero(lambda x: real & 5 * x**3 - x**2 - 2 , 0, 1, 0.0000001)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

229

Anexo D: Exemplo da Agenda Corporativa

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

230

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

116

Caracterizao sumria do sistema


Cada recurso (pessoa, espao ou equipamento) tem uma agenda associada (date book), com compromissos (appointments) e disponibilidades (slots) Um compromisso pode envolver vrios recursos e pode ocupar um conjunto de intervalos de tempo Os compromissos marcados por terceiros esto sujeitos s disponibilidade manifestadas O sistema deve ajudar o utilizador a marcar compromissos, mostrando hipteses de marcao Exemplos de aplicaes: marcao de consultas, marcao de reunies, reserva de equipamentos, etc.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

231

Requisitos (1)
1.

O sistema deve permitir gerir a marcao de compromissos envolvendo vrios recursos numa organizao. Os recursos podem ser pessoas, espaos ou equipamentos. Cada recurso tem uma agenda associada (datebook). Cada agenda tem um dono, que uma pessoa da organizao. O dono da agenda de uma pessoa a prpria pessoa. Uma agenda (datebook) tem elementos de dois tipos: compromissos (appointments) e disponibilidades (slots). Um compromisso de um certo tipo (reunio, aula, etc.), envolve um ou mais recursos e ocupa um intervalo de tempo ou um conjunto de intervalos de tempo, com resoluo ao minuto. Deve ficar registado quem marcou um compromisso (autor do compromisso).

2.

3.

4.

5.

6.

7.

8.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

232

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

117

Requisitos (2)
9.

Um recurso no pode ter dois compromissos ao mesmo tempo. Uma disponibilidade refere-se a um recurso, um tipo de compromisso e um intervalo de tempo ou um conjunto de intervalos de tempo. Quando a pessoa s pode marcar um compromisso numa agenda de que no dona, dentro das disponibilidades definidas pelo dono da agenda. S o dono da agenda pode marcar compromissos sem verificao de disponibilidades. As agendas podem ser consultadas por todas as pessoas da organizao. Os compromissos podem ser pblicos ou privados. Um compromisso privado s pode ser consultado pelo autor do compromisso, pelas pessoas envolvidas no compromisso e pelos donos das agendas dos recursos envolvidos.

10.

11.

12.

13.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

233

Requisitos (3)
14.

O sistema deve ajudar o utilizador a marcar compromissos da seguinte forma: o utilizador indica o tipo de compromisso a marcar (exemplo: reunio), os recursos envolvidos, a durao do compromisso e restries temporais para a marcao do compromisso; o sistema deve fornecer uma lista de hipteses de marcao; cada hiptese mostra um intervalo de tempo dentro do qual possvel marcar o compromisso em todos os recursos (porque tm declarada disponibilidade para o tipo de compromisso especificado e no tm marcados compromissos de qualquer tipo). Compete ao administrador do sistema registar os recursos da organizao (criando automaticamente as respectivas agendas) e definir os tipos de compromissos possveis.

15.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

234

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

118

Modelo de casos de uso em UML


Agenda Corporativa
Regist erResourcesW it hDatebooks SystemAdministr ator

actor

CreateApoint mentTypes

fronteira do sistema

DatebookOwner

CreateSlotsForApointments

generalizao
Can't create apointments in datebooks not owned by the user outside the slots previously defined MakePrivateApointment <<extend>>

restrio

EmployeeActor MakePublicApoint ment

MakeApointment

SuggestSlots

Can't see t he det ails of private apointments in which he/she does not participate and was not the author and is not the owner of t he datebook

caso de uso

QueryDatebook

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

235

Modelo de domnio em UML - estado


classe

Company
atributo

name : StringT +resources

Faltam os invariantes ...


0.. n

+apointmentTypes ApointmentType description : StringC`StringT +type 1

0.. n
agregao

Resource rid : nat1 name : StringT type : ResourceType = <EMPLOYEE> 0.. 1 +resource +owner 0..1 +datebook

multiplicidade

generalizao

Employee
associao

1 +apointments 0..n

+author

Apoint ment when : TimeRegionT visibility : VisibilityType description : StringT

role name 0.. n

DateBook +datebooks s lot s : map Apointm entTy pe t o TimeRegionT = {|->} 0..n +apointments
para facilitar mapeamento para VDM++, associao bidireccional representada por duas associaes unidireccionais tipos de dados e valores por omisso definidos em VDM++ 236

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

119

Modelo de domnio em UML - operaes


Agora com as operaes mais importantes (assinaturas omitidas por falta de espao)
Principais transaces e consultas
+apointmentTypes ApointmentType description : StringC`StringT ApointmentType() GetDescription() +t ype 1 0.. n Company name : StringT Company() AddApointmentType() AddEmployee() AddSpace() AddEquipment() AddSlot() AddApointment() SuggestSlots() GetApointments() GetSlots() GetName() GetApointmentTypes() FindApointmentType() GetResources() FindResource() AddResource()

Falta a semntica das operaes ...

+resources 0..n Resource rid : nat1 name : StringT type : ResourceType = <EMPLOYEE> Resource() GetType() GetDatebook() +resource 0..1

Employee Employee() +apointments 0..n Apointment when : TimeRegionT visibility : VisibilityType description : StringT Apointment() GetType() GetWhen() GetAuthor() AddDatebook() GetDatebooks() +apointments 0..n 0..n +datebooks 1 +author 1 +datebook 0..1 DateBook slots : map ApointmentType to TimeRegionT = {|->} DateBook() GetResource() GetOwner() AddSlot() AddApointment() GetApointments() GetSlotsOfType()

+owner

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

237

Traduo de UML para VDM++ (1)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

238

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

120

Traduo de UML para VDM++ (2)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

239

Definio de tipos de dados em VDM++ (1)


Tipos de dados a definir neste caso (*):
Tipo StringT Date UserDate Time UserTime TimeInterval Descrio cadeia de um ou mais caracteres data representada pelo nmero de dias decorridos desde uma data base, til para processamento interno data representada por uma combinao de dia, ms e ano instante de tempo, representado pelo nmero de minutos decorridos desde as 0 horas da data base instante de tempo, representado por uma combinao de minutos, horas, dia, ms e ano intervalo entre dois instantes de tempo, fechado esquerda e aberto direita, representado por 2 valores do tipo Time

Duration

uma durao em minutos (*) Normalmente estes tipos de dados estariam definidos numa biblioteca
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

240

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

121

Definio de tipos de dados em VDM++ (2)


Tipos de dados a definir neste caso (cont.)
Tipo UserTimeInterval Descrio intervalo entre dois instantes de tempo, fechado esquerda e aberto direita, representado por um par de valores do tipo UserTime regio de tempo (conjunto de intervalos de tempo) representada por um conjunto de intervalos de tempo unitrios (com 1 min de durao), representados pelos seus incios (valores do tipo Time)

TimeRegion

representao abstracta pouco eficiente, mas que permite efectuar operaes com regies de tempo usando directamente os operadores de conjuntos (reunio, interseco e diferena), simplificando a especificao
ResourceType VisibilityType tipo enumerado que admite os valores <EMPLOYEE>, <EQUIPMENT> ou <SPACE> tipo enumerado que admite os valores <PUBLIC> ou <PRIVATE>
241

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Exemplo de definio de tipos de dados em VDM++


types public UserDate :: year : nat1 definio de tipo de record month: nat1 day : nat1 invariante inv d == d.month <= 12 and d.year >= Year0 and d.day <= DaysOfMonth(d.year, d.month); values constantes construo de record private Year0 : nat1 = 1900; private UserDate0 : UserDate = mk_UserDate(Year0,1,1); functions private static IsLeapYear(year: nat1) res : bool == year mod 4 = 0 and year mod 100 <> 0 or year mod 400 = 0; private static DaysOfMonth(year, month: nat1) res : nat == (cases month : 1, 3, 5, 7, 8, 10, 12 -> 31, 4, 6, 9, 11 -> 30, 2 -> if IsLeapYear(year) then 29 else 28 pr-condio end) pre month <= 12; (...)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

242

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

122

Exemplo de definio de classe em VDM++ (variveis de instncia)


class Company instance variables
s para facilitar testes

public name : StringT; public apointmentTypes : set of ApointmentType := {}; -- Must be initialized because of invariant.
conjunto de referncias para objectos

public resources : set of Resource := {}; -- Must be initialized because of invariant. public apointments : set of Apointment := {}; -- Because there is a many to many relationship between -- datebooks and apointments, they "belong" to the company -- and are referenced by datebooks (and vice versa) ...
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

243

Exemplo de definio de classe em VDM++ (invariantes)


... -- Key constraints -- uniqueness of Resource.rid

inv forall r1, r2 in set resources & r1<> r2 => r1.rid <> r2.rid;
-- Limitation: not checked if r.rid is changed ... -- Referential integrity constraints -- referential integrity of Apointment.type

inv forall a in set apointments & a.type in set apointmentTypes;


-- Limitation: not checked if a.type is changed ... -- Generic constraints ...
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

244

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

123

Exemplo de definio de classe em VDM++ (operaes de alterao)


operations public AddApointmentType(desc: StringT) res : ApointmentType == ( dcl t: ApointmentType := new ApointmentType(desc); apointmentTypes := apointmentTypes union {t}; return t varivel de instncia que a operao pode alterar ) ext wr apointmentTypes pre desc not in set {at.description | at in set apointmentTypes} post apointmentTypes = apointmentTypes~ union {res} and res.description = desc; ...
pr-condio implicada por invariante (pode-se efectuar verificao formal) "~" designa valor antigo da varivel
245

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

Exemplo de definio de classe em VDM++ (operaes de consulta)


public SuggestSlots(type: ApointmentType, rs: set of Resource, duration: TimeDurationT, within: TimeRegionT) res: set of UserTimeIntervalT == return {TimeIntervalToUserTimeInterval(ti) | ti in set TimeRegionToTimeIntervals( dinter { let r_slots = r.GetDatebook().GetSlotsOfType(type), r_apoints = dunion {a.when | a in set r.GetDatebook().GetApointments()} in (within inter r_slots \ r_apoints) | r in set rs } ) {f(x) | x in set ...} define conjunto em compreenso & Duration(ti)>=duration dinter {...} interseco de elementos de conjunto }; dunion {...} unio de elementos de conjunto & - tal que
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

246

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

124

Anexo E: Exemplo da Colocao de Professores

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

247

Problema
Portugal, 2004 Professores concorrem a vagas; dois tipos de professores:
tinham colocao, mas pretendem mudar (se no for possvel, ficam onde estavam) no tinham colocao, e pretendem obt-la (se no for possvel, ficam sem colocao)

Cada professor indica lista totalmente ordenada de vagas a que concorre Vagas a concurso incluem posies anteriormente ocupadas pelos professores que pretendem mudar de colocao Os professores j esto totalmente ordenados segundo um ranking Neste ranking, podem aparecer intercalados professores dos dois tipos O resultado da colocao deve obedecer s seguintes restries:
R1: Professores que tinham colocao anterior tm de ficar colocados, nem que seja nessa posio R2: Para cada professor e para cada posio por ele preferida em relao quela em que foi colocado (inclui todas as posies no caso de ficar por colocar), essa posio tem de estar ocupada por um professor com melhor ranking ou pelo professor que a estava anteriormente

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

248

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

125

Formalizao do problema (1)


public static colocaProfessores(vagas: set of Vaga, professores: seq of Professor, preferencias: map Professor to seq of Vaga, colocacaoInicial: inmap Professor to Vaga) colocacaoFinal: inmap Professor to Vaga -- vagas: conjunto de vagas a concurso, incluindo posies ocupadas inicialmente por -professores que querem mudar -- professores: conjunto de professores, ordenado por ranking -- preferencias: a cada professor faz corresponder uma lista ordenada de vagas -pretendidas por ordem decrescente -- colocacaoInicial: indica os professores que tinham colocao inicial e qual a sua -colocao inicial -- colocacaoFinal: colocao final dos professores pre -- P1: no existem professores repetidos not hasRepetitions[Professor](professores) and -- P2: todos os professores indicam preferncias (dom preferencias = elems professores) and -- P3: as vagas referidas nas preferncias esto no conjunto das vagas (forall p in set dom preferencias & elems preferencias(p) subset vagas) and

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

249

Formalizao do problema (2)


-- P4: a lista de preferncias de um professor no tem repeties (forall p in set dom preferencias & not hasRepetitions[Vaga](preferencias(p))) and -- P5: os professores com colocao inicial esto no conjunto dos professores (dom colocacaoInicial subset elems professores) and -- P6: as vagas referidas na colocao inicial esto no conjunto das vagas -- (implicado por P3 e P7) (rng colocacaoInicial subset vagas) and -- P7: no caso de professores que tinham colocao inicial, a sua colocao inicial -- deve estar no fim da lista de preferncias (forall p in set dom colocacaoInicial & colocacaoInicial(p) = preferencias(p)(len preferencias(p))) post -- Q1: os professores referidos na colocao final tm de estar no conjunto de -- professores (dom colocacaoFinal subset elems professores) and -- Q2: as vagas referidas na colocao final tm de estar no conjunto de vagas (rng colocacaoFinal subset vagas) and
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

250

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

126

Formalizao do problema (3)


-- Q3: um professor s pode ser colocado numa vaga que est nas suas preferncias (forall p in set dom colocacaoFinal & colocacaoFinal(p) in set elems preferencias(p)) and -- Q4: os professores que estavam inicialmente colocados tm de continuar colocados -- no fim (implicado por Q5, dada a pr-condio P7 e a forma como est definida a -- funo "temPrecedencia") (dom colocacaoInicial subset dom colocacaoFinal) and -- Q5: todas as vagas pretendidas por um professor, com maior preferncia em -- relao posio em que ficou, tm de estar ocupadas por algum com -- precedncia sobre essa vaga (tem precedncia 1 quem estava a colocado e depois -- segue-se o ranking) estava colocado inicialmente (forall p in set elems professores & let indiceColocacao = if p in set dom colocacaoFinal then index[Vaga](colocacaoFinal(p), preferencias(p)) else len preferencias(p) + 1 in forall i in set {1, ... , indiceColocacao - 1} & let v = preferencias(p)(i) in v in set rng colocacaoFinal and temPrioridade((inverse colocacaoFinal)(v),p, v, professores, colocacaoInicial));

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

251

Critrio de optimalidade
Pode existir mais do que uma soluo que satisfaz as ps-condies Designando solues admissveis a todas as solues que satisfazem as restries indicadas, introduz-se o seguinte critrio de optimalidade:
Uma soluo admissvel S1 melhor do que uma soluo admissvel S2, se o 1 professor por ordem de ranking que tem colocao diferente nas duas solues, est melhor colocado em S1

Por este critrio, s h uma s soluo ptima, isto , que melhor que todas as outras

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

252

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

127

Exemplo com vrias solues admissveis


preferncia

Situao inicial:
posio (ou vaga)

V1

P1

P2

V2

professor

algoritmo pessimista s consegue encontrar

Solues admissveis (obedecendo s restries):

V1

P1

P2

V2

soluo no ptima

V1

P2

P1

V2

soluo ptima

algoritmo optimista consegue encontrar


Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

253

Algoritmos
Algoritmo de fora bruta
Gerar o conjunto de todos os mapeamentos injectivos de professores para vagas, rejeitar depois os que no obedecem s ps-condies e finalmente aplicar o critrio de optimalidade Tempo exponencial

Algoritmo pessimista
Seguido pela Compta, empresa que no conseguiu resolver o problema em 2004 Tempo polinomial, no garante soluo ptima (ver 1 exemplo)

Algoritmo optimista
Desenvolvido pela ATX Software, empresa que resolveu o problema em 2004 Tempo polinomial, parece garantir soluo ptima

Algoritmo de Gale-Shapley (dos casamentos estveis)


Mais eficiente (pelo menos em teoria), garante soluo ptima (?)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

254

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

128

Algoritmo de colocao pessimista


1. Consideram-se inicialmente ocupadas as posies iniciais dos professores que pretendem mudar de posio 2. Colocam-se os professores pela ordem do ranking:

2.1. Coloca-se o professor na sua melhor preferncia que est ainda livre 2.2. Se o professor estava inicialmente colocado e colocado agora numa nova posio, gera uma vaga que tem de ser recuperada: 2.3.1. Procura-se o professor j colocado de melhor ranking que pode beneficiar dessa vaga 2.3.2. Se no se encontrar nenhum professor nessas condies, a recuperao da vaga fica concluda 2.3.3. Se se encontrar um professor nessas condies, muda-se a colocao desse professor (melhorando-a), o que origina uma nova vaga que tem de ser recuperada da mesma forma

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

255

Algoritmo de colocao optimista (*)


1. Consideram-se inicialmente livres as posies iniciais dos professores que pretendem mudar de posio 2. Colocam-se os professores pela ordem do ranking, na melhor preferncia ainda livre de cada professor (alguns professores podem ficar por colocar) 3. Se os professores que estavam inicialmente colocados ficaram todos colocados, o processo termina. 4. Seno,

4.1. Os professores que estavam inicialmente colocados e ficaram por colocar so colocados definitivamente nas suas posies iniciais, que deixam de estar livres 4.2. Repete-se a colocao com menos estes lugares livres

(*) Desenvolvido pela

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

256

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

129

Relao com problema de casamentos estveis


Problema de casamentos estveis, verso clssica: Supondo que cada elemento dum grupo de n homens e n mulheres ordenou todos os de sexo oposto por ordem de preferncia estrita, pretende-se determinar um emparelhamento estvel. Sendo H = {h1, . . . , hn} e M = {m1, . . . ,mn} os conjuntos de homens e mulheres, um emparelhamento E uma qualquer funo injectiva de H em M. Informalmente, um emparelhamento , neste caso, um conjunto de n casais (monogmicos e heterossexuais). Um emparelhamento E diz-se instvel se e s se existir um par (h,m) E tal que h prefere m sua parceira em E e m tambm prefere h ao seu parceiro em E. Caso contrrio, diz-se estvel.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

257

Relao com problema de casamentos estveis


Problema de casamentos estveis com listas de preferncias incompletas
Surgiu na colocao de internos em hospitais O critrio de estabilidade das solues reformulado do modo seguinte: Um emparelhamento instvel se e s se existir um candidato r e um hospital h tais que h aceitvel para r e r aceitvel para h, o candidato r no ficou colocado ou prefere h ao seu actual hospital e h ficou com vagas por preencher ou h prefere r a pelo menos um dos candidatos com que ficou. Caso contrrio, diz-se estvel.

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

258

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

130

Relao com problema de casamentos estveis


(1962)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

259

Relao com problema de casamentos estveis


Propriedades do algoritmo de Gale-Shapley (1962):
O emparelhamento obtido por este algoritmo ptimo para os internos e pssimo para os hospitais: qualquer interno fica com o melhor hospital que pode ter em qualquer emparelhamento estvel e cada hospital fica com os piores internos. Tempo de execuo de ordem quadrtica (n de internos * n de hospitais)

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

260

Construo e Teste de Modelos Executveis Integrando VDM++ e UML

131

Relao com problema de casamentos estveis


No problema da colocao de professores, o conceito de emparelhamento o mesmo, se se considerar que a atribuio de candidatos a vagas Internos correspondem aos professores Hospitais correspondem s vagas (ou escolas?) Cada vaga prefere 1 o professor que a estava colocado anteriormente, e depois todos os outros pela ordem do ranking

Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

261

Formalizao do algoritmo (corpo)


dcl colocacaoProvisoria: inmap Professor to Vaga := {|->}; dcl prefsRestantes: map Professor to seq of Vaga := preferencias; dcl profsColocaveis: seq of Professor := professores; while profsColocaveis <> [] do -- escolhe um professor colocvel (p) e a vaga (v) cabea da sua lista de preferncias -- (esolhe o 1 professor por ordem de ranking, mas no era obrigatrio) let p = hd profsColocaveis, v = hd prefsRestantes(p) in ( -- coloca o professor escolhido na vaga preferida, tirando quem a estava eventualmente colocacaoProvisoria := (colocacaoProvisoria :-> {v}) munion {p |-> v}; -- tira esta vaga das listas de preferncias de todos os professores candidatos a esta -- vaga, mas com menor prioridade que o professor seleccionado for all p2 in set dom prefsRestantes do if v in set elems prefsRestantes(p2) then if temPrioridade(p, p2, v, professores, colocacaoInicial) then prefsRestantes(p2) := remove[Vaga](v, prefsRestantes(p2)); -- recalcula os professores colocveis (por colocar, c/lista de preferncias no vazia) profsColocaveis := [professores(i) | i in set inds professores & professores(i) not in set dom colocacaoProvisoria and prefsRestantes(professores(i)) <> [] ] ); return colocacaoProvisoria Casos de teste em ColocacaoProfessores.zip
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008

262

Das könnte Ihnen auch gefallen