1 / 43

Especificação Formal de Software

Especificação Formal de Software. Alexandre Mota (acm@cin.ufpe.br). Desenvolvendo o Sistema. Documento de Requisitos. Problema. Solução. Um Modelo. Banco. 1. 1. 0..*. 0..*. 1..*. 1..*. Conta. Cliente. Poupança. Mais Precisão.

ulla
Télécharger la présentation

Especificação Formal de Software

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Especificação Formal de Software Alexandre Mota (acm@cin.ufpe.br)

  2. Desenvolvendo o Sistema Documento de Requisitos Problema Solução ...

  3. Um Modelo Banco 1 1 0..* 0..* 1..* 1..* Conta Cliente Poupança

  4. Mais Precisão... • Para caracterizar melhor um sistema, sem entrar em detalhes de implementação, fazemos uso de: • Pré-condições • Pós-condições • Invariantes • Propriedades

  5. Pré-condição • Pré-condições são associadas a operações (métodos) • Sua utilidade é caracterizar uma condição (restrição) sobre a aplicabilidade da operação • Se a condição for válida, a execução da operação é garantida não gerar exceções

  6. Pós-condição • Pós-condições são associadas a operações também • Sua utilidade é descrever em que condição o sistema irá estar após a realização com sucesso (terminação) da operação

  7. Invariante • Para modelos orientados a objetos, o invariante é associado a classes • Daí, denominar-se de invariante da classe • Sua utilidade é estabelecer os limites válidos sobre as instâncias (objetos) criadas por uma classe • Assim, devido ao invariante, nem todos as instâncias são possíveis de serem criadas ou de efetuarem certas operações que mudem seus atributos

  8. Propriedades • Todo sistema é esperado satisfazer a propriedades desejáveis • Ausência de deadlock, composições de operações bem-sucedidas, etc. • Portanto, para toda classe podemos estabelecer quais propriedades ela deve satisfazer • Tais propriedades podem ser usadas posteriormente na fase de testes

  9. Anotando um Modelo • Um diagrama de classes UML pode ser anotado com formalismos • O padrão de UML é anotar seus diagramas com OCL (Object Contraint Language) • OCL é uma linguagem que explora textualmente elementos de lógica de predicados e teoria dos conjuntos •  é substituído por implies •  é substituído por forall

  10. Anotando um Modelo Banco 1 1 0..* 0..* 1..* 1..* Conta Cliente idade: int {idade>17} Poupança

  11. Anotando um Modelo • Infelizmente, OCL não possui suporte de ferramentas para explorar as restrições estabelecidas • A única ferramenta para OCL atualmente é um verificador de sintaxe e de tipos (parcial) • Portanto, usaremos lógica de predicados e teoria dos conjuntos (Z) pois existem mais ferramentas

  12. A Notação • Tal qual OCL, nossa linguagem também é bastante textual • Assim, •  é obtido através de \implies •  é conseguido com \forall • Essa linguagem é nada mais que uma codificação em LaTeX (versão LaTeX para os elementos gráficos de Z)

  13. Tipos Pré-Definidos • Em nossa notação, assumiremos três tipos básicos pré-definidos • Naturais (\nat) • 0, 1, 2, 3, ... • Inteiros (\num) • ..., -3, -2, -1, 0, 1, 2, 3, ... • Booleanos (Bool) • true, false

  14. Construtores de Tipos • Dispomos de vários tipos para caracterizarmos os problemas • Given sets (conjuntos genéricos) • Free-types (tipos enumerados) • Conjunto potência (das partes) • Produto cartesiano • Relações • Funções • Seqüências • Bags

  15. Hierarquia de Tipos Given Sets Conjuntos ( P) I Free-Types Tuplas (...) Relações () Funções () Seqüências (seq) Bags (bag)

  16. Given Sets • Usam-se given sets quando não se tem interesse sobre a estrutura dos elementos de tais conjuntos • Elementos de given sets são meramente identificadores • Somente operações sobre conjuntos independentes de tipos podem ser aplicadas a given sets (, , , etc.) • Para criá-los em um diagrama, basta digitar seus nomes nos espaços referentes a tipos

  17. Exemplo de Given Set Cliente id: ID Given set ID

  18. Free-Types • São os conhecidos tipos enumerados de linguagens de programação (apesar de mais versáteis) • Sua versatilidade advém do fato de podermos definir tipos recursivos (construtores) • Normalmente usados para caracterizar as mensagens que o sistema irá exibir

  19. Free-Types <<enumeration>> Mensagens ok falha Enumeração Simples <<enumeration>> Nat zero succ \ldata Nat \rdata Enumeração Recursiva

  20. Produto Cartesiano • Quando se deseja formar tuplas de elementos de tipos base • Usa-se T1 \cross T2 \cross ... \cross Tn • Seus elementos são identificados como (A, 2, casa) ou (3, 4) • As funções first e second aplicam-se a 2-uplas ou pares • first (1, 2) = 1 e second (1, 2) = 2

  21. Produtos Cartesianos • first (x, y) • second (x, y)

  22. Conjunto Potência • Para usar o conjunto potência, basta prefixar o tipo base com \power • Exemplo: • \power \{0, 1\} = \{ \{\}, \{0\}, \{1\}, \{0, 1\}\} • O tipo potência deve ser usado quando instâncias são conjuntos em si

  23. Conjuntos Potência • # A • A = B, A  B • x  A, x  A • , A  B, A  B • A  B, A  B, A \ B •  AA,  AA

  24. Relações • O tipo relação é obtido através do operador \rel entre dois tipos • Pessoa \rel Endereço • Produz subconjuntos de produtos cartesianos • Usado para capturar dependência entre dois tipos base

  25. ) | ( | Relações • dom R, ran R • R;S, S  R • A R, R A • AR, R A • R~ • RA    

  26. Funções • Funções são tipos especiais de relações • Assim, funções provém de relações com acréscimos de restrições • Tipo mais comum de função é a parcial • Pessoa \pfun Endereço • Esse relacionamento indica que nem toda pessoa tem endereço

  27. Funções • F  G

  28. Seqüências • Seqüências são especializações de funções • São obtidas com o prefixo \seq sobre o tipo base • \seq Pessoa • Contrariamente a conjuntos, seqüências são empregadas quando se deseja capturar a ordem entre os elementos

  29. Seqüências ( • S1 S2 • head S, tail S • front S, last S • rev S

  30. Bags • Bags são usados para capturar a repetição de elementos através de freqüência (ocorrência) • Usa-se o operador \bag prefixado sobre o tipo base • Normalmente, bags são usados como armazenadores de quantidades (“estoques”)

  31. Bags • count B x • x in B • B1 B2, B1 B2 • items S + -

  32. Detalhando o Modelo: Banco Banco cadastrar remover creditar debitar getSaldo transferir clientes contas 0..n 0..n Conta numero: NUM saldo: \nat getNum getSaldo creditar debitar Cliente id: ID nome: NOME getId getNome dono 1 0..n Poupança renderJuros

  33. Detalhando as Classes • Para cada classe do diagrama anterior: • Descrever a funcionalidade de cada método através de: • Pré-condição • Pós-condição • Caracterizar o invariante da classe

  34. getId() pré: pós: result! = id setId(id: ID) pré: pós: id’ = id? getNome() pré: pós: result! = nome setNome(nome: NOME) pré: pós: nome’ = nome? Classe Cliente Cliente - id: ID - nome: NOME getId setId getNome setNome

  35. getNum() pré: pós: result! = num setNum(num: NUM) pré: pós: num’ = num? getSaldo() pré: pós: result! = saldo setSaldo(saldo: IN) pré: pós: saldo’ = saldo? Classe Conta Conta - num: NUM - saldo: IN getNum() setNum() getSaldo() setSaldo() creditar() debitar()

  36. creditar(val: IN) pré: pós: saldo’ = saldo + val? debitar(val: IN) pré: saldo  val? pós: saldo’ = saldo - val? Classe Conta Conta - num: NUM - saldo: IN ... creditar() debitar()

  37. Invariante Classe Banco • cl: clientes  cl  null • cc: contas  cc  null • c1,c2: contas | c1  c2  c1.getNum()  c2.getNum() • cl1,cl2: clientes | cl1  cl2  cl1.getId()  cl2.getId()

  38. cadastrar(conta: Conta) pré: conta?  null  cc:contas  cc.getNum()  conta? pós: contas´ = contas  {conta?} remover(conta: Conta) pré: conta?  null  cc:contas  cc.getNum() = conta? pós: contas´ = contas \ {conta?} Classe Banco ATENÇÃO: Esta classe possui dois atributos implícitos nomeados de contas: IP Conta e clientes: IP Cliente, respectivamente Banco cadastrar() remover() creditar() debitar() transferir()

  39. O que eu desejo GARANTIR na minha solução??? Desenvolvendo o Sistema Problema Solução ...

  40. Operadores em Propriedades • Para estabelecer propriedades entre operações, podemos usar • , , , ,  • , , \ • (.../...) • pre, ;

  41. Propriedade sobre Conta • É verdade que, para uma mesma conta, creditar um valor e, em seguida, debitar o mesmo valor resultará no mesmo estado inicial da conta? • Como garantir isso? • v, saldo, saldo’: IN  creditar(v) ; debitar(v)  saldo’=saldo

  42. Propriedade sobre Conta • Como garantir que creditar é uma operação comutativa? Ou seja, creditar um valor v1 e depois v2 é o mesmo que creditar o valor v2 e depois o v1.

  43. Bibliografia • Booch, G. et al. The Unified Modeling Language User Guide • Sommerville, I. Software Engineering • Tepfenhart, W. et al. Practical Object-Oriented Development with UML and Java • Woodcock, J. et al. Using Z (http://www.usingz.com/) • Spivey, J.M. The Z Notation (http://spivey.oriel.ox.ac.uk/~mike/zrm/) • Kruchten, P. The Rational Unified Process: An Introduction

More Related