Upload
regis-melo
View
426
Download
2
Embed Size (px)
DESCRIPTION
Java Assertions
Citation preview
@regismelo 1
Assertions
@regismelo 2
Objetivos
• Saber quando, como e em quais situações usar assertions.
• Como compilar código-fonte, controlar a execução do programa, adicionar e remover assertions.
Assertions
@regismelo 3
Por que usar Assertions?
Assertions
• Como programadores, devemos fazer mais do que checagem de erro.
• Código de tratamento de erro inclui uma quantidade substancial de esforço de programação.
• Não é possível eliminar todos os erros, mas podemos planejar à frente do inesperado.
• Assertion pode ser usado para capturar condições que não esperávamos acontecer.
@regismelo 4
Por que usar Assertions?
Assertions
• Assertions vs. outro código de erro;
• Design-by-Contract
– Pré-condições;
– Pós-condições;
– Invariantes;
@regismelo 5
Sintaxe
Assertions
• assert expressao1;
Exemplo:
assert foo != null;
Equivalente a
if ( ! (foo != null) ) {
throw new AssertionError();
}
@regismelo 6
Sintaxe
Assertions
• assert expressao1 : expressao2;
Exemplo:
assert foo != null : “Assertion”;
Equivalente a
if ( ! (foo != null) ) {
throw new AssertionError(“Assertion”);
}
@regismelo 7
Compilando com Assertions
Assertions
• java –source 1.3
– usa a sintaxe antiga.
• java –source 1.4
– usa a sintaxe nova, com assertion.
@regismelo 8
Controlando Assertions
Assertions
• Linha de comando
Símbolo Exemplo______________
-ea java –ea
-da java –da
-ea:<classname> java –ea:AssertClass
-da:<classname> java –da:AssertClass
-ea:<packagename> java –ea:Package0
-da:<packagename> java –da:Package0
@regismelo 9
Controlando Assertions
Assertions
• Linha de comando
Símbolo Exemplo______________
-esa java –esa
-dsa java –das
esa = enable system Assretion
@regismelo 10
Controlando Assertions
Assertions
• Programaticamente.
• Habilita ou desabilita o uso de assertions para uma classe.
– public void setClassAssertionStatus(
String className, boolean enabled);
- Habilita ou desabilita o uso de assertions para um pacote.
– public void setPackageAssertionStatus(
String packageName, boolean enabled);
@regismelo 11
Controlando Assertions
Assertions
• Programaticamente.
• Habilita o uso de assertions como default.
– public void setDefaultAssertionStatus(
boolean enabled);
• Desabilita o uso de todas as assertions.
– public void clearAssertionStatus();
@regismelo 12
Quando usar Assertions
Assertions
• Reforçar suposições sobre aspectos de estruturas de dados.
• Reforçar constraints em argumentos de métodos private.
• Checar condições que nunca deveriam ocorrer.
• Checar condições que nunca deveriam ocorrer, mesmo que você esteja certo disso.
@regismelo 13
Quando usar Assertions
Assertions
• Checar condições relacionadas ao início de qualquer método.
• Checar coisas no meio de loops grandes.
• Qualquer assertion é melhor do que nada.
@regismelo 14
Quando não usar Assertions
Assertions
• Reforçar o uso na linha de comando.
• Reforçar constraints em argumentos de métodos públicos.
• Reforçar uso público de padrões ou protocolos.
• Reforçar uma propriedade de qualquer informação de um usuário.
@regismelo 15
Quando não usar Assertions
Assertions
• Como se fosse o seguinte:
– If (something) error();
• Como um controle condicional externo.
• Checar a corretude de seu compilador, sistema operacional ou hardware.
@regismelo 16
Exemplos(regras de uso)
Assertions
Regra: não usar assertions para reforçar o uso da linha de comando.
public class Application {
public static void main(String[] args) {
//BAD!!
assert args.length == 3;
}
}
@regismelo 17
Exemplos(regras de uso)
Assertions
Regra: usar assertions para reforçar o uso de constraints de argumentos para métodos private.
public class aClass {
private void method(Object required, Object optional) {
assert (required != null) : “method():required = null”;
}
}
@regismelo 18
Exemplos(regras de uso)
Assertions
Regra: não usar assertions para reforçar constraints de argumentos para métodos public.
public class aClass {
public void disconnect(Source required, Object optional)
{
//BAD!!
assert (required != null) : “method():required = null”;
}
}
@regismelo 19
Exemplos(regras de uso)
Assertions
Regra: não usar assertions para reforçar uso público de padrões ou protocolos.
public class Connection {
private boolean isOpen = false;
public void close() {
//BAD!!
assert isOpen : “Cannot close a connection!”;
}
}
@regismelo 20
Exemplos(regras de uso)
Assertions
Regra: não usar assertions para reforçar uma propriedade de uma informação de usuário.
public void processZipCode(String zipCode) {
if (zipCode.length() == 5) { //ok }
else {
//BAD!!
assert false:”Only 5- and 9- digit supported!”;
}
}
@regismelo 21
Exemplos(regras de uso)
Assertions
Regra: usar assertions para reforçar suposições internas sobre aspectos de estruturas de dados.
private void showDate(int array[]) {
assert (array.length == 3);
}
@regismelo 22
Exemplos(regras de uso)
Assertions
Regra: usar assertions para checar condições no fim de qualquer método.
public void open() {
//...
isOpen = true;
//...
assert isOpen;
}
@regismelo 23
Exemplos(regras de uso)
Assertions
Regra: usar assertions para checar condições que nunca aconteceriam.
public void method() {
int a = getValue(); //returns 0
if (a == 0) { //deal with 0 }
else { assert false : “Impossible!!!” }
}
@regismelo 24
Exemplos(regras de uso)
Assertions
Regra: usar assertions para checar condições que nunca aconteceriam, mesmo que você tenha certeza.
public void method() {
int a = getValue(); //returns 0
assert a < 0 || a > 0 : “Impossible!!!”
}
@regismelo 25
Exemplos(regras de uso)
Assertions
Regra: usar assertions para checar condições relacionadas ao início de qualquer método.
public void processZipCode(String zipCode) {
assert zipCodeMapIsValid();
//.....
}
@regismelo 26
Exemplos(regras de uso)
Assertions
Regra: usar assertions para checar coisas no meio de um loop grande.
public void method() {
while (true) {
Socket socket = serverSocket.accept(); //long pause
assert socketListIsValid();
}
}
@regismelo 27
Exemplos(regras de uso)
Assertions
Regra: não usar assertions como algo do tipo: “if (something) error();”
public class Server {
private int port;
public void listen() {
//BAD!!
assert port >= 1024 : “No permission to listen!”;
}
}
@regismelo 28
Exemplos(regras de uso)
Assertions
Regra: não usar assertions como uma condição de controle externa.
public class App {
static private boolean turnLoggingOn() { return true; }
static public void main(String[] args) {
//BAD!!
assert turnLoggingOn();
}
}
@regismelo 29
Exemplos(regras de uso)
Assertions
Regra: não usar assertions para checar a corretude de seu compilador, sistema operacional ou hadware, a não ser que você esteja depurando.
public void method() {
int a = 10;
//REDUNDANT!!
assert a == 10;
}