Transcript
Page 1: Jass - Java with assertions

Jass - Java with assertions

Sérgio Soares

Page 2: Jass - Java with assertions

Assertions descrevem propriedades que devem ser verdadeiras em determinados pontos da execução do programa Especificação formal como parte da

linguagem Especificação documentada no código

Jass

Page 3: Jass - Java with assertions

Checagem em tempo de execução Precondições e poscondições Invariantes (de classe e de loop) e variantes

(de loop) Tratamento de violação de assertions (rescue

e retry)Exceções indicam violação das condições.Precompilador traduz assertions em

comandos Java.

Jass

Page 4: Jass - Java with assertions

require precondiçãoensure poscondição ìnvariant de classe ou loopvariant de loop (deve ser positivo e decrescente

com a execução do loop)check verifica assertions em qualquer parte do

código rescue bloco executado caso assertion seja false retry executa novamente o método (só pode

ser utilizado dentro do bloco rescue)

Comandos de Jass

Page 5: Jass - Java with assertions

Exemplos de Assertions

/** require a!=0 **/

/** require a!=0; isEven(a) **/

/** require -1 > c.m() **/

Page 6: Jass - Java with assertions

Definições recursivas Chamar o método que declara a

assertion direta ou indiretamente.Se um método é chamado durante a

avaliação de uma assertion e neste método é declarada uma assertion, está não é avaliada.

Restrições de Assertions

Page 7: Jass - Java with assertions

Construtores especiais

Old (poscondição) representa o estado inicial do objeto antes

da execução do método o método clone deve ser implementado

changeonly (poscondição) limita a alteração de atributos da classe os atributos do objeto são comparados com

os de Old pelo método equals, o qual deve ser rescrito

Page 8: Jass - Java with assertions

public void addElement (Object o) { /** require !isFull(); o != null; **/ buffer[in % buffer.length] = o; in++; /** ensure changeonly{in,buffer}; Old.in == in - 1; **/}

Exemplo de Assertion

Page 9: Jass - Java with assertions

Implementação das assertionsNo caso de chamada de métodos na definição da

assertion O corpo do método é copiado em uma versão

sem assertionsO invariante de classe vira um método que é

chamado na precondição e na poscondição.Em loops o invariante é checado a cada execução

e é criada uma variável para armazenar o variante.

Checks são expandidos como macros

Page 10: Jass - Java with assertions

Refinamento

Para cada método sobrescrito: Se o método abstrato e aplicável o

concreto também pode ser chamado O método concreto é mais

determinístico O invariante da superclasse deve ser

válido onde o da subclasse se aplique

Page 11: Jass - Java with assertions

Refinamento

Enfraquecer a precondição pre_a -> pre_c

Fortalecer a poscondição mais restrições (determinismo)

Page 12: Jass - Java with assertions

public void addElement (Object o) { /** require !isFull(); o != null; **/ buffer[in % buffer.length] = o; in++; /** ensure changeonly{in,buffer}; Old.in == in - 1; **/ }

public void addElement (Object o) { /** require !isFull(); **/ if (o==null) buffer[in % buffer.length] = new Default(); else buffer[in % buffer.length] = o; in++; /** ensure changeonly{in,buffer}; Old.in == in - 1; o!=null ? contains(o) : true; **/ }

Page 13: Jass - Java with assertions

Passos para refinar métodos

Implementar a interfacejass.runtime.refinement

Implementar a função de “abstração”

jassGetSuperState()

Page 14: Jass - Java with assertions

public class UnlimitedBuffer { ... private Buffer jassGetSuperState() { Buffer b = new Buffer(v.size()+1); b.in = v.size(); b.out = 0; for (int i = 0; i < b.buffer.length-1; i++) b.buffer[i] = v.elementAt(i); return b; }}

Passos para refinar métodos

Page 15: Jass - Java with assertions

Referencias

Jass: Java with assertions, May 1999. http://semantik.informatik.uni-oldenburg.de/~jass.


Top Related