aluno: Pedro de Sousa Cau Ramos Salles
2008/2o.
22/08/2008
Introdução
Neste laboratório foi possível aplicar os primeiros conceitos de orientação a objetos em Java aprendidos em aula, com base num programa que simula a produção e entrega de relatórios feitos por alunos e a correção realizada por um professor.
Com base no diagrama de classes fornecido, foram criadas 6 classes:
Aluno : Classe abstrata com alguns métodos e atributos que definem um aluno, como nome, conhecimento, entregar relatório.
AlunoEsforcado : Subclasse de aluno que define os atributos inteligência e dedicação
AlunoSafoPreguicoso: Subclasse de aluno que define o atributo inteligência com valor maior que o dedicado, porem a dedicação passa a ser um valor aleatório.
RelaQueue: Classe para mandar uma fila de relatórios enviados a serem corrigidos pelo professor.
Relatorio: O relatório propriamente dito, que contem atributos qualidade e originalidade e o aluno autor.
Professor: Classe que define o professor que vai corrigir os relatórios. Essa classe tem acesso ao RelaQueue de onde retira todos os relatórios e atribui uma nota a cada um baseado na qualidade e originalidade.
Desenvolvimento
O diagrama de classes da aplicação produzido no BlueJ está mostrado a seguir:

Temos então os seguintes codigos fonte das classes definidas:
Classe Aluno:
public abstract class Aluno { int conhecimento = 0; //conhecimento adquirido fazendo relas String nome; //nome do aluno RelaQueue queue; // referencia para a fila de relas public Aluno(String nome , RelaQueue queue) { //inicializaçoes this.nome = nome; this.queue = queue; } public void fazEEntregaRelatorio() { //equaçao que define as caracteristicas do rela baseado nas capacidades do aluno float qualidade = (2.0f * this.getDedicacao() + 1.0f * this.getInteligencia()) / 3.0f; float originalidade = (1.0f * this.getDedicacao() + 2.0f * this.getInteligencia()) / 3.0f; //adicionando o rela na fila queue.queue(new Relatorio(qualidade,originalidade,this)); //adquirindo conhecimento conhecimento++; } public int getConhecimento() { return conhecimento; } abstract public float getInteligencia(); abstract public float getDedicacao(); public String getNome() { return nome; } }
Classe AlunoEsforcado:
public class AlunoEsforcado extends Aluno { float inteligencia = 0.5f; //inteligencia definida menor que a do alunosafopreguicoso float dedicacao = 1.0f; //dedicacao definida maior que a do alunosafopreguicoso public AlunoEsforcado(String nome , RelaQueue queue) { super(nome,queue); } public float getInteligencia() { return inteligencia; } public float getDedicacao() { return dedicacao; } }
Classe AlunoSafoPreguicoso:
public class AlunoSafoPreguicoso extends Aluno { float inteligencia = 1.0f; //inteligencia definida maior que o alunodedicado public AlunoSafoPreguicoso(String nome, RelaQueue queue) { super(nome,queue); } public float getInteligencia() { //O método getInteligencia de AlunoSafoPreguicoso deve retornar um double randômico de 0 a 0,5. return inteligencia; } public float getDedicacao() { //gerando um valor aleatorio para a dedicacao de 0 a 0.5 return (float)Math.random()/ 2.0f; } }
Classe RelaQueue:
public class RelaQueue { private Relatorio[] listaRela = new Relatorio[10];//vetor de relatorios int inicio = 0; //cursor do inicio da fila int fim = 0; //cursor do final da fila public void queue(Relatorio rela) { listaRela[fim] = rela; // salva o rela no vetor fim = (fim + 1) % 10; //incrementa o fim da fila com loop sobre o vetor } public Relatorio dequeue() { if (fim != inicio) //se houver algum rela na fila { Relatorio dequeued = listaRela[inicio]; inicio = (inicio + 1) % 10; //retira um rela do inicio da fila return dequeued; // e retorna } else return null; // se nao tem rela, vai null } }
Classe Relatorio:
public class Relatorio { Aluno autor; private float qualidade; private float originalidade; public Relatorio(float qualidade, float originalidade, Aluno aluno) { this.qualidade = qualidade; this.originalidade = originalidade; autor = aluno; } public float getQualidade() { return qualidade; } public Aluno getAluno() { return autor; } public float getOriginalidade() { return originalidade; } }
Classe Professor:
public class Professor { RelaQueue queue; //referencia para a fila de relas public Professor(RelaQueue queue) { this.queue = queue; //inicializacao } private float corrigirRelatorio(Relatorio rela) { //a nota do rela eh calculada baseado na qualidade, originalidade e num //fator aleatorio de 0 a 1 pra nao ficar deterministico float fatorAleatorioDe0a1 = (float)Math.random(); float nota = (rela.getQualidade() + rela.getOriginalidade() + fatorAleatorioDe0a1) / 3 * 10; //e a nota eh impressa na tela System.out.println(rela.getAluno().getNome() + ": " + nota); return nota; } public void corrigirRelatorios() { Relatorio rela; while ((rela = queue.dequeue()) != null) { //realizar a correcao de todos os relas na fila corrigirRelatorio(rela); } } }
Para verificar o funcionamento do programa, foi primeiramente realizado um teste manual, mostrando que dois relas foram adicionados ao rela queue por dois alunos diferentes, mostrando seu conteudo:

Em seguinda foi realizado o teste final usando a classe de teste definida no roteiro, na imagem abaixo está o resultado do teste:

Onde podemos ver que e o programa passou no teste e portanto está funcionando corretamente. Os dados impressos no console também estão condizentes com o esperado.
Conclusão
Esse laboratorio foi bom para uma primeira familiarização com Orientação a Objeto em Java, por ser um programa bem simples, mas que aborta varios conceitos importantes como herança, classe abstrata e as relações entre as classes. O BlueJ é uma IDE interessante por integrar o diagrama de classes com a interface de desenvolvimento, porém o BlueJ nao possui correções de sintaxe, autocompletar e outras facilidades que outras IDEs costumam ter, o que dificulta a programação para quem não esta acostumado com a linguagem. O tema abordado no laboratorio, que foi relacionado com confecção e entrega de relatorios por alunos ao professor foi bom para obter uma visão de como orientação a objetos pode se encaixar com sistuações mais reais, porém não possui muita utilidade pratica , espero que nas proximas vezes sejam sugeridos programas que façam algo mais pratico. Em linhas gerais, o laboratorio foi muito produtivo no que se diz respeito à compreenção dos conceitos visto em sala.






Código OK. Declare as variáveis internas como private, sempre que possível. Seu relatório foi pouco analítico.
Os IDEs mais avançados não são feitos para ensinar quem não conhece a linguagem, mas facilitar a vida daqueles que sabem o que estão fazendo. O BlueJ possui correção de sintaxe (no momento de compilação). (para mais bostejo sobre IDEs veja outro comentário no rela de um aluno que disse algo parecido - esqueci quem).
Sua crítica é válida, no entanto este exemplo é prático, como que você acredita que ficaria a modelagem de uma aplicação para a confecção e entrega de relatórios a professores? O exemplo não é útil por si só, mas fazer uma aplicação completa fugiria do escopo de um laboratório somente (e a idéia é introduzir os conceitos de OO, não sobrecarregar os alunos). Ao longo do curso as coisas ficarão mais úteis.