aluno: Yves Conselvan
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)
Introdução
Este laboratório teve por objetivo a introdução dos principais conceitos de orientação a objetos. Para tanto desenvolvemos as classes para simulação de um sistema de entrega e correção de relatórios.
Para o desenvolvimento das classes utilizamos a linguagem Java com ambiente de desenvolvimento BlueJ.
Desenvolvimento
Funcionamento do sistema
Os alunos fazem seus relatorios, com qualidade e originalidade baseados em sua inteligencia e dedicação, e os entregam na fila de relatórios.
Existem dois tipos de alunos, esforçado e safo preguiçoso.
O professor corrige os relatorios da fila a partir da media entre qualidade, originalidade e um fator pseudo-aleatório.
Implementação
Para o desenvolvimento da atividade foi necessária a implementação de uma fila para a entrega dos relatorios. Optei pela implementação de uma fila baseada em estrutura encadeada. Foi necessário para isto a implementação de uma classe que representa um item na fila de relatorios.
Na implementação de todas as classes as propriedades são privadas acessando-se seus valores através de métodos get e set. Algumas propriedades, definidas no construtor ou intrínsecas à classe, não possuem método set.
Apresento abaixo o código de cada uma das classes implementadas
Classe Abstrata Aluno
A classe Aluno encapsula os métodos e propriedades básicas de um aluno.
É uma classe abstrata, apresentando dois métodos abstratos. Dessa forma os alunos poderão ser implementados com suas características específicas derivando desta classe, reutilizando código.
public abstract class Aluno { private int conhecimento = 0; private String nome; private RelaQueue queue; //contrutor da classe //seta nome e pega referencia à fila de relatorios public Aluno(String nome, RelaQueue queue) { this.nome = nome; this.queue = queue; } //metodo abstrato para retornar a inteligencia public abstract float getInteligencia(); //metodo abstrato para retornar a dedicação public abstract float getDedicacao(); //retorna o nome public String getNome() { return this.nome; } //retorna o conhecimento public int getConhecimento() { return this.conhecimento; } //gera um novo relatorio e coloca na fila de relatorios public void fazEEntregaRelatorio() { float qualidade = (2 * this.getDedicacao() + 1 * this.getInteligencia() ) / 3 ; float originalidade = (1 * this.getDedicacao() + 2 * this.getInteligencia() ) / 3 ; queue.queue(new Relatorio(qualidade, originalidade, this)); } }
Classe AlunoEsforcado - Subclasse de Aluno
A classe AlunoEsforcado deriva da classe Aluno, implementa seus métodos abstratos e chama o construtor da super classe.
public class AlunoEsforcado extends Aluno { private float inteligencia = 0.5f; private float dedicacao = 1; //construtor da classe //chama o construtor da super classe com os mesmos parâmetros public AlunoEsforcado(String nome, RelaQueue queue) { super(nome, queue); } //retorna a inteligencia a partir da propriedade public float getInteligencia() { return this.inteligencia; } //retorna a dedicação a partir da propriedade public float getDedicacao() { return this.dedicacao; } }
Classe AlunoSafoPreguicoso - Subclasse de Aluno
A classe AlunoEsforcado deriva da classe Aluno, implementa seus métodos abstratos e chama o construtor da super classe.
Na implementação desta classe foi necessária a utilização da biblioteca java.util.Random, para a geração pseudo-aleatória de uma das propriedades.
import java.util.Random; public class AlunoSafoPreguicoso extends Aluno { private float inteligencia = 1; //construtor da classe //chama o construtor da super classe com os mesmos parâmetros public AlunoSafoPreguicoso(String nome, RelaQueue queue) { super(nome, queue); } //retorna a inteligencia a partir da propriedade public float getInteligencia() { return this.inteligencia; } //retorna a dedicação do aluno a partir de um valor pseudo-aleatório public float getDedicacao() { Random generator = new Random(); float r = generator.nextFloat(); return r * 0.5f; } }
Classe Relatorio
A classe Relatorio guarda as propriedades dos relatorios produzidos pelos alunos. Após a criação de um objeto apenas é possível ler suas propriedades, dessa forma os dados ficam protegidos de alterações.
public class Relatorio { private float qualidade, originalidade; private Aluno aluno; //construtor da classe //seta as propriedades do relatorio public Relatorio(float qualidade, float originalidade, Aluno aluno) { this.qualidade = qualidade; this.originalidade = originalidade; this.aluno = aluno; } //retorna a qualidade do relatorio public float getQualidade() { return this.qualidade; } //retorna a originalidade do relatorio public float getOriginalidade() { return this.originalidade; } //retorna o aluno que fez o relatorio public Aluno getAluno() { return this.aluno; } }
Classe RelaQueueItem
A classe RelaQueueItem representa um item na fila de relatorios. Suas propriedades são o relatório para o qual apontam (item) e qual é o proximo objeto na fila.
public class RelaQueueItem { private Relatorio item; private RelaQueueItem next; //construtor da classe //recebe a referencia de um relatorio public RelaQueueItem(Relatorio rela) { item = rela; this.next = null; } //retorna o proximo item da fila public RelaQueueItem getNext() { return this.next; } //seta o proximo item da fila public void setNext(RelaQueueItem p) { this.next = p; } //retorna o relatorio referenciado por este item da lista public Relatorio getItem() { return this.item; } }
Classe RelaQueue
A classe RelaQueue implementa uma fila de relatórios utilizando estrutura encadeada. São utilizadas referências para o inicio e o fim da fila, e no construtor é criado um item utilizado como cabeça da lista.
public class RelaQueue { private RelaQueueItem inicio, fim; //construtor da classe //cria um nó cabeça public RelaQueue() { inicio = new RelaQueueItem(null); fim = inicio; } //coloca um item na fila public void queue(Relatorio rela) { fim.setNext(new RelaQueueItem(rela)); fim = fim.getNext(); } //retira um item da fila public Relatorio dequeue() { Relatorio ret = null; if (inicio.getNext() != null) { ret = inicio.getNext().getItem(); if (inicio.getNext() == fim) { fim = inicio; } inicio.setNext(inicio.getNext().getNext()); } return ret; } }
Clase Professor
A classe Professor apresenta externamente apenas o método para correção dos relatórios, sendo que cada relatório é corrigido por um método privado.
Nesta classe também foi necessária a utilização da biblioteca import java.util.Random.
import java.util.Random; public class Professor { private RelaQueue queue; public Professor(RelaQueue queue) { this.queue = queue; } public void corrigirRelatorios() { Relatorio rela; while ((rela = queue.dequeue()) != null) { System.out.println(rela.getAluno().getNome() + ": " + corrigirRelatorio(rela)); } } private float corrigirRelatorio(Relatorio rela) { Random generator = new Random(); return ( rela.getQualidade() + rela.getOriginalidade() + generator.nextFloat() ) / 3 * 10; } }
ScreenShoot´s
Diagrama de classes do BlueJ
Objetos instanciados manualmente
Tela do teste
Tela de saida
Conclusão
Na implementação do aluno para reutilizar o código do construtor da classe abstrata Aluno foi utilizado o método super a partir dos construtor das classes que derivam de Aluno. Pelo construtor padrão do Java o método super é chamado automaticamente para o construtor sem argumentos da super classe, para passar as informações necessárias, nome do aluno e lista de relatorios, foi necessário chamar explicitamente o método super passando estes parâmetros.
Na implementação da fila de relátorio optei pela lista encadeada para treinar a programação destas estruturas referenciadas em Java.






Yves,
Anexe, por favor, um .zip da pasta do projeto do bluej ao seu relatório, para facilitar a nossa correção.
Obrigado e abraços, Bernardo
Código OK e mérito por ter sido o único a implementar a Queue de forma diferente da fornecida em aula. Esqueceu de incrementar o conhecimento quando um rela é entregue.