aluno: Nome do Aluno
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)
Introdução
Neste laboratório iremos ampliar um pouco mais o programa feito no primeiro laboratório. Inicialmente criaremos uma classe simulador que irá possibilitar a interação de um um usuário qualquer pela linha de comando. Essa classe simulador terá um método que main que irá guiar toda a interação com o usuário. A seguir, iremos modificar um pouco a estrutura do programa. Iremos criar diversos tipos de comportamento que descreveram o tipo de comportamento de cada aluno, que agora será uma classe única com uma variável do tipo comportamento. A seguir, criaremos três subclasses de aluno, mas referenciando sua escola de origem, e aplicando algumas restrições quanto ao comportamento de cada aluno de uma determinada universidade. Por fim, modificaremos a classe Simulador para que ela comporte as mudanças feitas no programa.
Desenvolvimento
Inicialmente criamos a classe simulador que deveria funcionar com as classes feitas no laboratório passado. No método main, é criado um array de alunos que irá guardar todos os alunos criados. A seguir será solicitado se o usuário deseja criar um aluno, caso a resposta seja positiva, será perguntado o comportamento e o nome do aluno. Será perguntando ao usuário se ele deseja criar outro aluno. Após criar todos os alunos, o método main irá mandar todos os alunos fazerem e entregarem o relatório, e a seguir o professor corrigí-los. O código da classe simulador segue abaixo.
import java.util.ArrayList; import java.io.*; import java.io.Console; import java.util.Scanner; public class Simulador { public static void main(String[] args) { Console c = System.console(); ArrayList<Aluno> alunos = new ArrayList<Aluno>(); System.out.println(); String op2 = c.readLine("Deseja inserir novo aluno?(s/n): "); System.out.println(); String op; String nome; int i=0; RelaQueue q = new RelaQueue(); Professor p = new Professor(q); Aluno temp; //Aqui criamos uma variável do tipo Aluno que servirá para todos os tipos de alunos, aplicando o Polimorfismo while(op2.equals("s")) { op = c.readLine("O aluno é safo ou esforcado?: "); if(op.equals("safo")) { nome = c.readLine("O nome do aluno: "); temp = new AlunoSafoPreguicoso(nome,q); \\Aqui o temp está sendo usado como referencia de um AlunoSafoPreguicoso alunos.add(i,temp); \\Exemplo do polimorfismo citado na declaração da variavel temp } else { if(op.equals("esforcado")) //Aqui, é utilizado o método do obejto String op, que verifica se o seu conteúdo é igual ao passado por referencia { nome = c.readLine("O nome do aluno: "); temp = new AlunoEsforcado(nome,q); alunos.add(i,temp); \\Aqui, é utilizado um método da ArrayList que adiciona um objeto a lista } else {System.out.println("tipo de aluno invalido! Tente denovo!");continue;} } i++; System.out.println(); op2=c.readLine("Deseja inserir novo aluno?(s/n): "); System.out.println(); } for(i=0;i<alunos.size();i++) { (alunos.get(i)).fazEEntregaRelatorio(); //será percorrida toda a ArrayList, utilizando seu método de retornar seus objetos, e já acessando um método desse obejto que será retornado } System.out.println("Notas dos Relatorios:"); p.corrigirRelatorios(); } }
Realizamos vários testes para verificar o bom funcionamento da classe simulador:
Então tornamos a classe aluno concreta, e inserimos nela uma variável do tipo Comportamento. Comportamento é uma classe abstrata que foi criada, que terá várias subclasses, como SafoPreguicoso, Burro, Pemba, dentre outras. Essas subclasses irão implementar os métodos de fornecer a inteligência e a dedicação de cada aluno. Os códigos estão anexados, por isso não estão representados aqui neste texto. Criamos três subclasses de alunos, de acordo com sua escola de origem. As subclasses irão sobrescrever os metódos de setar o comportamento do aluno. Caso o comportamento não seja setado ou o seja inválido, o comportamento será definido como Esforcado no construtor do aluno(desde sua criação). Realizamos as restrições de comportamento criando exceções e tratando-as antes de usá-las no método main da classe Simulador. Por exemplo, os alunos da USP não podem ser safos nem summa:
public class AlunoUSP extends Aluno { public AlunoUSP(String n, RelaQueue q){super(n,q);} public void setComportamento(Comportamento comportamento) throws Exception //podemos ver a exceção sendo lançada { if((comportamento instanceof Summa)||(comportamento instanceof SafoPreguicoso)) throw new Exception(); //apenas iteanos sao safos! super.setComportamento(comportamento); //chama a o metodo da superclasse. } }
Também criamos uma classe genérica para Queue usando um ArryList internamente. O diagrama de classes está representado abaixo:
Após todas as modificações, alteramos a classe simulador para que ela seja capaz de comportar as mudanças feitas no programa. As exceções lançadas nos alunos foram tratadas no momento de setar os comportamentos, conforme segue abaixo:
import java.util.ArrayList; import java.io.*; import java.io.Console; import java.util.Scanner; public class Simulador { public static void main(String[] args) { Console c = System.console(); //inicia o Array de alunos ArrayList<Aluno> alunos = new ArrayList<Aluno>(); System.out.println(); String op2 = c.readLine("Deseja inserir novo aluno?(s/n): "); System.out.println(); String op; String nome; int i=0; RelaQueue q = new RelaQueue();//cria a queue Professor p = new Professor(q); //cria o professor Aluno temp; //os alunos serao criados até q o operador nao deseje mais while(op2.equals("s")) { //inicialmente sera perguntado a Escola e o Nome do aluno op = c.readLine("Qual a escola do aluno?: "); if(op.equals("ITA")) { nome = c.readLine("O nome do aluno: "); temp = new AlunoITA(nome,q); alunos.add(i,temp); } else { if(op.equals("USP")) { nome = c.readLine("O nome do aluno: "); temp = new AlunoUSP(nome,q); alunos.add(i,temp); } else { if(op.equals("Unicamp")) { nome = c.readLine("O nome do aluno: "); temp = new AlunoUnicamp(nome,q); alunos.add(i,temp); } else {System.out.println("tipo de aluno invalido! Tente denovo!");continue;} } } i++; //sera atribuido o comportamento do aluno op = c.readLine("Qual o comportamento do aluno?: "); if(op.equals("SafoPreguicoso")) { try { temp.setComportamento(new SafoPreguicoso(temp)); }catch (Exception e){System.out.println("Apenas iteanos sao Safos!");} //temos aqui um exemplo de uma exceção sendo tratada } else { if(op.equals("Esforcado")) { try { temp.setComportamento(new Esforcado(temp)); }catch (Exception e){} } else { if(op.equals("Summa")) { try { temp.setComportamento(new Summa(temp)); }catch (Exception e){System.out.println("Apenas os iteanos são Summa");} } else{ if(op.equals("Pemba")){ try { temp.setComportamento(new Pemba(temp)); }catch (Exception e){} } else{ if(op.equals("Imprevisivel")) { try { temp.setComportamento(new Imprevisivel(temp)); }catch (Exception e){} } else{ if(op.equals("Burro")) { try { temp.setComportamento(new Burro(temp)); }catch (Exception e){System.out.println("Iteanos nao sao burros");} } else {System.out.println("tipo de aluno invalido! Ele sera considerado Esforcado!");} } } } } } System.out.println(); op2=c.readLine("Deseja inserir novo aluno?(s/n): "); System.out.println(); } //faz todos os alunos criados fazerem e entregarem o relatorio for(i=0;i<alunos.size();i++) { (alunos.get(i)).fazEEntregaRelatorio(); } p.corrigirRelatorios(); } }
A seguir, realizamos um série de teste com a nova classe simulador:
Conclusão
Assim, neste laboratório podemos aprender a trabalhar com a captação de dados através da linha de comando, utilizando pela primeira vez uma classe com o método main. Também podemos trabalhar com a criação de uma classe genérica e com exceções. De modo geral, podemos trabalhar esses conceitos e entendê-los melhor. A maior parte do código não foi representada neste relatório devido a grande extensão e a pouco contribuição que teria. Mas, o código completo está em anexo com os devidos comentários ao longo do mesmo. Este laboratório foi uma ótima tarefa, a maior dificuldade esteve em captar os dados do usuário. O restante estava bem indicado na descrição do laboratório.
corrigido. Esqueceu de falar sobre o Queue no rela, mas fez.