Comentários

0%

FOCO NO MERCADO DE TRABALHO

TRATAMENTO DE EXCEÇÕES E USO DE CLASSES ABSTRATAS

Jesimar da Silva Arantes

Maior sofisticação na construção do simulador de robô

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.

Sem medo de errar

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.

Código 3.11 | Nova modelagem das classes App, RoboIdeia, Robo e CaixaIdeia
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 {
    ...
}
Fonte: elaborado pelo autor.
Bons estudos!

AVALIE ESTE MATERIAL

OBRIGADO PELO SEU FEEDBACK!