Comentários
Leitura de dados do teclado para movimentação do robô, tratamento de exceção para deixar a aplicação mais tolerante a falhas e criação de uma classe robô abstrata para modelar a ideia da entidade robô.
Fonte: Shutterstock.
Deseja ouvir este material?
Áudio disponível no material digital.
A startup em que você faz estágio lhe passou a tarefa de melhorar a modelagem do simulador de robô que está produzindo. Dessa maneira, o seu chefe, após revisar o seu código, listou as seguintes tarefas para desenvolver:
Após olhar com calma todas as sugestões de seu chefe, você, então, partiu do Código 2.14 que tinha e percebeu que a primeira coisa que devia fazer era alterar a classe App. Nessa classe, você criou um objeto da classe Scanner, que receberá os comandos por meio do teclado, sendo estas as possíveis teclas a serem pressionadas: 'w', ‘a', ‘s’ e ‘d’. (Caso a tecla zero (0) seja pressionada, então, será encerrada a aplicação, mas caso alguma outra tecla seja pressionada, uma exceção será lançada e uma nova tecla será requisitada.) Em seguida, você criou a classe RoboIdeia, na qual constam os seguintes atributos: posicaoX, posicaoY, orientacao, nome e peso, bem como a definição de que todo robô deve sobrescrever os métodos move, moveX e moveY. Após isso, a classe Robo foi criada como uma subclasse de RoboIdeia. Entre as linhas 35 e 80, foram destacados alguns aspectos modificados do código anterior. Nessa versão do código, você colocou os métodos move, moveX e moveY para lançarem exceções do tipo IllegalArgumentException caso o argumento seja NaN (Not a Number) ou infinito. O método setOrientacao, por sua vez, também lança uma exceção caso não seja pressionada nenhuma das teclas 'w', ‘a', ‘s’ e ‘d’.
Por fim, você apenas modificou a assinatura da classe CaixaIdeia, conforme mostrado na linha 81, para transformá-la em uma classe abstrata. Após esses passos, o seu programa ficou pronto, apresentando todas as alterações do seu chefe, e parecido com o Código 3.11. Repare que diversas partes foram omitidas, mas o código completo pode ser acessado no GitHub do autor.
public class App {
public static void main(String[] args) {
Robo robo = new Robo();
String tecla = "";
Scanner scan = new Scanner(System.in);
boolean ok = false;
do {
try {
tecla = scan.next();
robo.setOrientacao(tecla.charAt(0));
robo.printPos();
} catch (IllegalArgumentException ex){
if (tecla.charAt(0) == '0') {
ok = true;
} else {
System.out.println("Valor errado");
scan.nextLine();
ok = false;
}
}
} while(!ok);
robo.printPos();
}
}
public abstract class RoboIdeia {
protected float posicaoX;
protected float posicaoY;
protected int orientacao;
protected String nome;
protected float peso;
public abstract void move(float posX, float posY);
public abstract void moveX(float dist);
public abstract void moveY(float dist);
}
public class Robo extends RoboIdeia {
...
@Override
public void move(float posX, float posY) {
if (Float.isNaN(posX) || Float.isNaN(posY) ||
Float.isInfinite(posX) || Float.isInfinite(posY)) {
throw new IllegalArgumentException("Args não válidos");
}
super.posicaoX = posX;
super.posicaoY = posY;
}
@Override
public void moveX(float dist) {
if (Float.isNaN(dist) || Float.isInfinite(dist)) {
throw new IllegalArgumentException("Arg não válido");
}
super.posicaoX += dist;
}
@Override
public void moveY(float dist) {
if (Float.isNaN(dist) || Float.isInfinite(dist)) {
throw new IllegalArgumentException("Arg não válido");
}
super.posicaoY += dist;
}
public void setOrientacao(char tecla) {
if (tecla == 'w') {
super.orientacao = FRENTE;
moveY(5);
} else if (tecla == 's') {
super.orientacao = ATRAS;
moveY(-5);
} else if (tecla == 'a') {
super.orientacao = ESQUERDA;
moveX(-5);
} else if (tecla == 'd') {
super.orientacao = DIREITA;
moveX(5);
} else {
throw new IllegalArgumentException("Arg não válido");
}
}
}
public abstract class CaixaIdeia {
...
}