Beruflich Dokumente
Kultur Dokumente
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
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
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
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
Modelo formal
(ling. restries: OCL, VDM++,)
inv m() pre post Especificao completa, no ambgua, verificvel Mais detalhe
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
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
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
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, Joo Pascoal Faria, 2008
11
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
12
Definitions
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
14
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
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
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
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}
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
20
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
<identificador>
<Branco>, <Preto>
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
21
inmap A to B
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
22
12
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
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
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
26
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
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
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
16
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;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
32
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
34
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
36
19
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
37
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
38
20
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
40
21
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
Tambm se podiam marcar os atributos pblicos para leitura, dispensando mtodos Get
0..1 -conjuge
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..*
42
22
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
43
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
23
Outras consultas
45
46
24
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
Soluo comum: objecto raiz que d acesso aos restantes objectos do sistema, de forma hierrquica
Algumas navegaes em sentido inverso
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
48
25
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
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
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
27
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
53
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
54
28
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
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
29
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
subtarefas *
Tarefa
{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
30
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
59
subtarefas *
Tarefa
atmica: bool
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
60
31
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
61
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
62
32
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
64
33
Tarefa
0..1 supertarefa
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
65
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;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
66
34
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
68
35
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
69
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
70
36
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
71
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
37
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
73
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
74
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
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
39
1) Formalizar cada estado por uma condio nas variveis de instncia estadoCivil = <Divorciado> estadoCivil = <Casado>
Vivo
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
77
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
Inicializar variveis de instncia c/ argumentos Restrio dinmica Junta a conj. de instncias Retornar o prprio objecto
78
40
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
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
41
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;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
82
42
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
83
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
43
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
Behavioral subtyping
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
86
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
88
45
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
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)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
91
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
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)
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
48
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
95
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
49
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
97
while condio do instruo for contador = N1 to N2 [by N3] do instruo for all padro in set conjunto do instruo
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
98
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
100
51
101
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
52
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
103
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
53
Refinamento
105
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
106
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.)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
108
55
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
56
(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
Falecido
Falecimento
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
112
57
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
: TestPessoa
2. Falecimento
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
113
114
58
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
115
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
116
59
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
117
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
118
60
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
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
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
122
62
Em curso
Devoluo
Concludo
Evento temporal
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
123
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
124
63
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
TestBiblioteca
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
125
TestBiblioteca
p1 : Publicao
Clock
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
126
64
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
127
128
65
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
130
66
Classe AlarmListener
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
131
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
132
67
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
133
134
68
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
69
Concorrncia e sincronizao
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
137
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
138
70
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
71
echo(texto)
Operao que escreve o texto, possivelmente com sequncias de escape, no standard output. Exemplo: echo(ola\n")
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
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
#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
73
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
146
74
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
147
148
75
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
149
: BoundedBufferTest
objectos activos
Exemplo de execuo
Test1()
b : BoundedBuffer
r : ReceiverAgent
(wait)
(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( )
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
150
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
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
77
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
153
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
154
78
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
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
158
80
2 3
Convm criar uma pasta para cada projecto Caminho no pode ser muito comprido, seno falha!
159
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
81
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
161
estilo VDM
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
162
82
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
163
Sintaxe Ok
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
164
83
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
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
84
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
167
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
168
85
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
169
print s
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
170
86
print s
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
171
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
172
87
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
173
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
174
88
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
175
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
176
89
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
178
90
Etc.
179
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
180
91
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
182
92
1 seleccionar
3 aparece
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
183
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
93
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
185
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
186
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
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
96
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
si
P (s1)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
191
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
192
97
Construo de conjuntos
Em extenso: {e1, e2, , en}
Exemplos: {1, 3, 5}, { }
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
193
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
194
98
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
l1(2, ..., 4)
[1, 4, 1]
196
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
99
Construo de sequncias
Em extenso: [e1, e2, , en]
Exemplos: [1, 3, 1, 5], [ ]
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
197
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.
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
198
100
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)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
199
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: =, <>
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
200
101
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
201
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
202
102
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)
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
204
103
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
205
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
206
104
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
207
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
208
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
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 <> {};
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
210
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
212
107
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
108
Quantificadores
forall binding & condio
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
216
109
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
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
110
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;
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
219
220
111
C1
C5
C6
C2
C4
C3
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
221
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
222
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
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);
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
225
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
114
O tipo funo
Funo total: arg1Type * arg2Type * +> resultType
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
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
230
116
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
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
118
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
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
Company
atributo
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
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
119
+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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
238
120
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
239
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
121
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
242
122
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
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
244
123
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
246
124
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
125
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
249
250
126
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
127
Situao inicial:
posio (ou vaga)
V1
P1
P2
V2
professor
V1
P1
P2
V2
soluo no ptima
V1
P2
P1
V2
soluo ptima
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
254
128
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
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
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
256
129
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
257
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
258
130
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
259
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
260
131
Construo e Teste de Modelos Executveis integrando VDM++ e UML, Joo Pascoal Faria, 2008
261
262