Lab2 Jorge Augusto

aluno: Jorge Augusto Melegati Gonçalves
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 20/08/2008 (4)

Introdução

Este laboratório teve como objetivo o desenvolvimento da classe Simulador que implementa uma interação com o usuário via consolo, possibilitando-o a utilização da aplicação. Posteriormente, aplicando o padrão Strategy, aumentou-se a robustez da aplicação modificando a forma de implementação dos comportamentos safo-preguiçoso e esforçado e, também, aumentado a lista de comportamentos possíveis. Além disso, possibilitou-se a criação de alunos de diferentes instituições e, utilizando tratamento de exceções, introduzir restrições nas suas criações.

Desenvolvimento

Criação da classe Simulador

Na primeira etapa do laboratório, foi implementada a classe Simulador, que faz a interface com o usuário pelo console. Para isso, nessa classe foi escrita a função main(String args[]) e, além disso, aumentando a modularização, criou-se a função escreveMenu, cujo nome já diz sua utilidade.
O código está anexado no arquivo lab2.1.zip.

Mudanças na classe Aluno

Para melhorar o acoplamento da nossa aplicação, utilizando-se do padrão Strategy, criou-se uma classe abstrata Comportamento, para a qual a classe Aluno irá delegar as funções getInteligencia e getDedicacao. Para isso, cria-se classes concretas que herdam da classe abstrata, implementando esses métodos, conforme o comportamento.
A próxima tarefa dizia de criar alunos de diferentes instituições como AlunoITA, AlunoUSP, AlunoUnicamp, de forma que fosse possível restringir os diferentes comportamentos para alunos de determinada instituição através do lançamento de exceções. O código a seguir exemplifica essa questão.

public void setComportamento(Comportamento comportamento) throws Exception {
        if(comportamento instanceof Burro) throw new Exception();
        super.setComportamento(comportamento);
    }

O trecho responde pela função da classe AlunoITA que setará o comportamento associada a esta instância. Ela evita que um AlunoITA tenha o comportamento de Burro, lançando uma exceção.
Caso contrário, ela chama a função da classe pai que fará o set propriamente dito.

Alterações na classe Simulador
O lançamento de exceções se refletiu no novo código da classe Simulador que incorpora as novas facilidades da nossa aplicação. O seguinte trecho mostra o tratamento da exceção, indicando ao usuário que a operação solicitada não é legal.

try{
                    switch(opcao){
                        case 1:
                            turma[num_alunos].setComportamento(new Esforcado(turma[num_alunos]));
                            break;
                        case 2:
                            turma[num_alunos].setComportamento(new SafoPreguicoso(turma[num_alunos]));
                            break;
                        case 3:
                            turma[num_alunos].setComportamento(new Burro(turma[num_alunos]));
                            break;
                        case 4:
                            turma[num_alunos].setComportamento(new Imprevisivel(turma[num_alunos]));
                            break;
                        case 5:
                            turma[num_alunos].setComportamento(new Summa(turma[num_alunos]));
                            break;
                        }
                        num_alunos++; 
                    }
                    catch(Exception e){
                        System.out.println("Voce tentou fazer algo impossivel. O aluno não foi adicionado!");
                    }

As outras modificações requeridas na classe foram executadas sem maiores problemas.

Criação da Queue com genéricos

A classe Queue<T>, implementada através do tipo genérico T, seguiu, praticamente, o mesmo código da classe RelaQueue, portanto, bastou-se copiar o código desta mudando o tipo do elemento do tipo Relatorio para o tipo genérico T. A única dificuldade, para a qual foi necessária procurar soluções na internet, foi a impossibilidade de criação de um array do tipo genérico. Esse problema foi solucionado com a criação do array com o tipo Object e posterior casting para o tipo T, conforme o código:

public Queue()
    {
        array = (T[]) new Object[10];
        inicio = 0;
        fim = 0;
    }

Com isso, foi possível, para fins de compatibilidade com a aplicação, a modificação da classe RelaQueue, que se resume ao seguinte código, conforme o enunciado do problema:

public class RelaQueue extends Queue<Relatorio>
{
 
}

Os arquivos do projeto depois dessas modificações está no arquivo lab2.2.zip.
A seguinte figura mostra o diagrama de classes no BlueJ.

jorge1.jpg
Fig. 1. Diagrama de classes no BlueJ.

Figuras da execução de testes

A seguinte figura mostra a execução bem sucedida dos testes propostos.

jorge2.jpg
Fig. 2. Resultados dos testes propostos.

A seguinte figura mostra a inserção de um aluno via interface implementada pela classe Simulador,
entrega de relatórios e correção da fila de relatórios pelo professor.

jorge3.jpg
Fig. 3. Exemplo de utilização da aplicação.

E, finalmente, a tentativa de inserção de um aluno com uma característica não permitida, neste caso, AlunoUnicamp com o comportamento Summa.

jorge4.jpg
Fig. 4. Exemplo do controle sobre a entrada de alunos pela aplicação.

Conclusão

No laboratório foram abordadas vários conceitos novos de orientação a objetos: tratamento de exceções e genéricos além de introduzir um padrão de projeto: o Strategy. De forma geral, o laboratório mostrou-se muito interessante dando exemplos claros dos conceitos introduzidos. Entretanto, a fluência na utilização da linguagem consumirá tempo e muitos outros exercícios.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License