domingo, 25 de julho de 2010

[Java] Identificar os usos adequados e inadequados de declarações


Como foi introduzido no post anterior, as declarações ou assertivas são utilizadas para verificar a validade de um programa quanto a falhas de lógica de programação e bugs. A instrução assert é utilizada para fazer a validação das declarações e não modificar o código após a verificação. Para que a instrução assert seja vericada durante a execução do código é necessária a habilitação da opção. Para executar o programa com assertivas digite: java -ea <NomeDaClasse>. A instrução assert avalia uma expressão boolean e determina se é verdadeira ou falsa.

Sintaxe da instrução assert

assert <expressão_booleana>;
assert <expressão_booleana> : &ltexpressão_de_detalhes>;

A primeira forma da sintaxe da instrução assert avalia a expressão booleana e lança um AssertionException se a mesma for false. A segunda forma da sintaxe avalia a expressão booleana e lança um AssertionExeption com a expressão de detalhes como a mensagem de erro se a expressão booleana for false.

Uso adequado de declarações

Utilizar declarações para documentar e validar a lógica interna de um único método:
  • Invariante interno

  • if (x > 0) {
    // Faz uma coisa
    } else {
    assert ( x == 0 );
    // Faz outra coisa, a não ser que x seja negativo
    }


  • Invariante de controle de fluxo

  • switch (naipe) {
    case Naipe.PAUS: // ...
    break;
    case Naipe.OUROS: // ...
    break;
    case Naipe.COPAS: // ...
    break;
    case Naipe.ESPADAS: // ...
    break;
    default: assert false : "Naipe indeterminado!!";
    break;
    }


  • Invariante de pós condição

  • public Object pop() {
    int size = this.getElementCount();
    if (size == 0) {
    throw new RuntimeException("Tentativa de retirar elemento de uma pilha vazia!");
    }

    Object result = /* Código para recuperar o elemento retirado */ ;

    // testa a pós condição
    assert (this.getElementCount() == size - 1);

    return result;
    }
Uso inadequado de declarações
  • Não utilize declarações para verificar os parâmetros de um método público. Bem como para validar parâmetros da linha de comando.

  • public void fazAlgo(int x) {
    assert (x > 0); // INAPROPRIADO!!
    // faz coisas com x
    }


    Como você não possui controle dos códigos que fazem chamada a um método público não é recomendado fazer a verificação dos parâmetros recebidos de um método público, pois a instrução assert pode ser desativada e sua verificação não mais será realizada. Ao invés de usar assert, utilize exceções!

  • Não utilize declarações que possam desencadear efeitos colaterais.

  • public void fazAlgumaCoisa() {
    assert (modificaAlgo());
    // ...
    }
    public boolean modificaAlgo() {
    y = x++;//Mudança no valor de variável
    return true;
    }


    Não é recomendado utilizar declarações que possam desencadear efeitos colaterais, pois a regra geral da utilização da instrução assert é de testar algo e deixar o código exatamente como antes do teste. Instruções assert nem sempre ocorrem, assim é impossível manter o controle do código se a instrução produzir efeistos colaterais.

Nenhum comentário:

Postar um comentário