Lab2 Luty Rodrigues

aluno: Luty Rodrigues Ribeiro
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 02/09/2008 (6)

Introdução

Neste laboratório, serão feitas algumas modificações no programa feito no 1º Laboratório. Essas mudanças proporcionarão ao programa uma maior flexibilidade, com relação a possíveis escolhas sobre o comportamento dos alunos e sua instituição de ensino. Para isso, serão utilizados alguns padrões de projeto exemplificados em sala de aula, assim como novas funcionalidades que forão aprendidas no decorrer do curso.

Desenvolvimento

Primeira parte
Nesta primeira parte, fizemos a classe Simulador, que continha uma função main (public static void main ). Esta classe tem como principal objetivo testar o programa, que rodará em linhas de comando. Para isso, usamos a classe Console. Abaixo, segue o código da classe Simulador:
Cite os principais trechos do código usando:

import java.io.Console;
 
public class Simulador {
    public static void main(String[] args) {
        Console c = System.console();
 
        Aluno[] aluno= new Aluno[50];
        RelaQueue q = new RelaQueue();
        int num = 0;        
        System.out.println("Criação de alunos");
        String nome = c.readLine("Dê o nome do aluno: ");
        String tipo = c.readLine("Diga que tipo de aluno é: (safo ou esforçado)");
        while(!tipo.equals("safo") && !tipo.equals("esforçado") )
            tipo = c.readLine("Diga que tipo de aluno é: (safo ou esforçado)");
 
        if( tipo.equals("safo") ) {
            aluno[num] = new AlunoSafoPreguicoso(nome ,q);
        }
        else aluno[num] = new AlunoEsforcado(nome, q);     
        num++;
 
        String resp = c.readLine("Deseja inserir um novo aluno(sim/nao)? ");
        while(!resp.equals("sim") && !resp.equals("nao") )
            resp = c.readLine("Deseja inserir novo aluno(sim/nao)? ");
        while(resp.equals("sim")) {
            nome = c.readLine("Dê o nome do aluno: ");
            tipo = c.readLine("Diga que tipo de aluno é: (safo ou esforçado)");
            while(!tipo.equals( "safo") && !tipo.equals("esforçado") )
                tipo = c.readLine("Diga que tipo de aluno é: (safo ou esforçado)");
            if(tipo.equals("safo") ) aluno[num] = new AlunoSafoPreguicoso(nome ,q);
            else aluno[num] = new AlunoEsforcado(nome, q); 
            num++;
            resp = c.readLine("Deseja inserir um novo aluno(sim/nao)? ");
            while(!resp.equals("sim") && !resp.equals("nao") )
                resp = c.readLine("Deseja inserir novo aluno(sim/nao");            
        }
 
        Professor prof = new Professor(q);
 
        int i;
        while(true){
            nome = c.readLine("Qual aluno fez e entregou seu relatório agora? ");
            for(i=0; i<num; i++) {
                if(aluno[i].getNome().equals(nome) ) {
                    aluno[i].fazEEntregaRelatorio();
                    break;
                }
            }
            if(i==num) System.out.println("Não há nenhum aluno com esse nome!!!");
            resp = c.readLine("Deseja que o professor corrija agora os relatórios(sim/nao)? ");
            while(!resp.equals("sim") && !resp.equals("nao") )
                resp = c.readLine("Deseja que o professor corrija agora os relatórios(sim/nao)? ");
 
            if(resp.equals("sim") ) {
                prof.corrigirRelatorios();                
                resp = c.readLine("Deseja encerrar a simulação(sim/nao)? ");
                if(resp.equals("sim") ) break;
            }
        }    
    }
 
}

Para rodar o programa através desta classe Simulador, utilizamos o prompt de comando, localizando o diretório onde estão as classes correspondentes. Depois de devidamente localizado,
executamos a função main chamando a sua classe, pelo comando "java Simulador":

lab2.1-1.JPG

A seguir, temos uma imagem mostrando a execução do programa:

lab2.1-2.JPG

Abaixo, temos o diagrama de classes observado no BlueJ:

lab2.1-3.JPG

Essa foi a primeira parte deste trabalho.

Segunda Parte

A segunda parte foi aperfeiçoar o programa acima, para que aceitasse outros comportamentos além de "safo" e "esforçado", além de poder ser de outras instituições. Para resolver o problema do comportamento, foi utilizado o padrão de projeto Strategy, comentado em sala de aula. Criamos uma classe comporamento, que possuía como suas subclasses os possíveis comportamentos de um aluno. Para as instituições, a classe Aluno mudou de abstrata para concreta, e criamos as subclasses AlunoITA, AlunoUSP e AlunoUnicamp. Conseguida esta modificação, o passo seguinte foi impor algumas restrições entre comportamento e os alunos.
As restrições (a nível apenas de exeplificar o conceito de restrições) foram:

  • O aluno do ITA não podem ter como comportamento Burro;
  • Um aluno da USP ou da Unicamp não pode ser nem Summa, e nem SafoPreguicoso;

Para implementar estas restrições, primeiro, indicamos que o método poderá lançar uma exceção, como por exemplo:

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

Fazemos o uso do tratamento de exceções, com a construção try-catch, como por exemplo em (trecho de código utilizado na nova classe Simulador, que será construída para testar o programa nas linhas de comando):

else if(tipo.equals("burro") ) {
     try {
           aluno[num].setComportamento(new Burro(aluno[num]) );
     } catch(Exception e){
           System.out.println("Você tentou fazer algo impossível!");
     }
}

Feitas estas alterações, a classe Simulador foi alterada para que o usuário possa também dizer qual a instituição do aluno que está sendo inserido, e seja feito o tratamento proposto para as exceções.
A última modificação foi a criação de Queue (fila) para elementos genéricos, pois a queue que implementada até então só armazena objetos do tipo Relatorio. Abaixo, mostramos o código da nova classe Queue (da qual RelaQueue será uma subclasse):

public class Queue<T> {    
    private Vector<T> array = new Vector<T>();
    private int inicio = 0; 
    private int fim = 0;
    private T valor;

    public void queue(T rela) {
        //array[fim] = rela;
        array.insertElementAt(rela, fim);
        fim = (fim + 1)%10;
    }

    public T dequeue() {
        if (inicio == fim) {
            return null;
        }
        else {
            valor = array.get(inicio);
            inicio = (inicio + 1)%10;
        }
        return valor;
    }
}

Neste caso, também foi utilizada a classe Vector, também mencionada em sala de aula, e são utilizados alguns de seus métodos no código acima

A seguir, exibimos o código da classe Simulador:

public class Simulador {
    public static void main(String[] args) {
        Console c = System.console();

        String nome, univ, tipo, resp;

        Aluno[] aluno= new Aluno[50];
        RelaQueue q = new RelaQueue();
        int num = 0;        
        System.out.println("Criação de alunos");
        do {
            nome = c.readLine("Dê o nome do aluno: ");
            univ = c.readLine("Qual a instituição(ITA, USP, UNICAMP)? ");
            while(!univ.equals("ITA") && !univ.equals("USP") && !univ.equals("UNICAMP") )
                univ = c.readLine("Qual a instituição(ITA, USP, UNICAMP)? ");
            if(univ.equals("ITA") ) {
                aluno[num] = new AlunoITA(nome, q);
            }
            else if(univ.equals("USP")) {
                aluno[num] = new AlunoUSP(nome, q);
            }
            else aluno[num] = new AlunoUnicamp(nome, q);

            tipo = c.readLine("Diga que tipo de aluno é: (safo,esforçado,pemba,burro,imprevisivel,summa) ");
            while(!tipo.equals("safo") && !tipo.equals("esforçado") && !tipo.equals("pemba")
               && !tipo.equals("burro") && !tipo.equals("imprevisivel") && !tipo.equals("summa"))
                tipo = c.readLine("Diga que tipo de aluno é: (safo,esforçado,pemba,burro,imprevisivel,summa) ");

            if( tipo.equals("safo") ) {
                try{
                    aluno[num].setComportamento(new SafoPreguicoso(aluno[num]) );
                } catch(Exception e) {
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }
            else if (tipo.equals("esforçado")) {
                try {
                    aluno[num].setComportamento(new Esforcado(aluno[num]) );
                } catch(Exception e) {
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }     
            else if(tipo.equals("pemba")) {
                try{
                    aluno[num].setComportamento(new Pemba(aluno[num]) );
                } catch(Exception e) {
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }
            else if(tipo.equals("burro") ) {
                try {
                    aluno[num].setComportamento(new Burro(aluno[num]) );
                } catch(Exception e){
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }
            else if(tipo.equals("imprevisivel") ) {
                try{
                    aluno[num].setComportamento(new Imprevisivel(aluno[num]) );
                } catch(Exception e) {
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }
            else{
                try{
                    aluno[num].setComportamento(new Summa(aluno[num]) );
                } catch(Exception e) {
                    System.out.println("Você tentou fazer algo impossível!");
                }
            }
            num++;

            resp = c.readLine("Deseja inserir um novo aluno(sim/nao)? ");
            while(!resp.equals("sim") && !resp.equals("nao") )
                resp = c.readLine("Deseja inserir novo aluno(sim/nao)? ");
        } while(resp.equals("sim"));

        Professor prof = new Professor(q);

        int i;
        while(true){
            nome = c.readLine("Qual aluno fez e entregou seu relatório agora? ");
            for(i=0; i<num; i++) {
                if(aluno[i].getNome().equals(nome) ) {
                    aluno[i].fazEEntregaRelatorio();
                    break;
                }
            }
            if(i==num) System.out.println("Não há nenhum aluno com esse nome!!!");
            resp = c.readLine("Deseja que o professor corrija agora os relatórios(sim/nao)? ");
            while(!resp.equals("sim") && !resp.equals("nao") )
                resp = c.readLine("Deseja que o professor corrija agora os relatórios(sim/nao)? ");

            if(resp.equals("sim") ) {
                prof.corrigirRelatorios();                
                resp = c.readLine("Deseja encerrar a simulação(sim/nao)? ");
                if(resp.equals("sim") ) break;
            }
        }    
    }

}

Mesmo tendo modificado a classe RelaQueue (que passou a não ter nenhum código, herda apenas as características de Queue<Relatorio>), esta continua com a mesma funcionalidade, e, para o usuário, não haverá nenhuma alteração.
A imagem seguinte mostrará a execução do programa, através desta classe Simulador nas linhas de comando:

lab2.2-1.JPG

Abaixo, temos uma imagem do diagrama de classes visto no BlueJ:

lab2.2-2.JPG

Por fim, foi criada uma classe de teste, com o código fornecido na própria página descrevendo este laboratório, que está na figura acima.
Abaixo, mostramos o resultado obtido após executar a opção "Test All" na classe Teste:

lab2.2-3.JPG

Conclusão

Neste laboratório, foi possível conhecer um pouco mais da linguagem java, bem como pôr em prática alguns conceitos de orientação a objeto. Foram implementados alguns dos padrões de projeto vistos em sala de aula, visando atender as necessidades do programa da melhor forma possível. Foi possível também ter uma idéia da importância de se modelar bem o programa desejado, procurando sempre manter a coesão e o maior desacoplamento possível entre as classes, de forma a possibilitar uma maior facilidade no caso de eventuais modificações se fazerem necessárias, ou seja, para que não seja preciso apagar boa parte do código e reescrever um novo código.

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