Curso de Verão de Java
Aula 3 - Refinamento da Aplicação Controle Universitário
Na Aula 1: Introdução à Programação Orientada a Objetos, vimos como
se aplicam os conceitos do modelo de objetos na construção de programas
de computador. Para fixar estes conceitos, esta aula tem como objetivo
mostrar os principais elementos de uma aplicação orientada a objetos,
o Sistema de Controle Universitário.
Na prática de laboratório da aula anterior você teve oportunidade de
compilar e ver executando esta pequena aplicação em Java, além
de realizar pequenas modificaçoes no código. A aplicação
(controle universitário) não está completa.
Vários detalhes foram omitidos para que o
exemplo fique simples e permita que você exercite sua compreensão
dos conceitos de orientação a objetos
estendendo pequenas partes da aplicação.
Nesta aula iremos rever a estrutura da aplicação e identificar
determinadas classes e métodos que podem ter seu funcionamento
aperfeiçoado.
Objetivos do Sistema de Controle Universitário
Para que você possa desenvolver adequadamente qualquer sistema é
necessário antes de tudo que você conheça precisamente qual o
problema que irá ser solucionado pelo sistema. No nosso caso
a aplicação Sistema de Controle Universitário tem por objetivo
controlar todos os aspectos de informações tratados numa
universidade, principalmente os referentes a controles
acadêmicos e administrativos.
Domínio do Problema e Análise do Sistema
A natureza do problema a ser resolvido determina a criação de
objetos (e classes) que representam o domínio do problema.
Esta é a visao de ANÁLISE DO SISTEMA
No nosso caso específico, posto que estamos criando um sistema
para uma universidade, os objetos do domínio serão aqueles
tratados no dia-a-dia de uma instituição universitária.
Os Objetos da Aplicação
Como o nosso sistema é bastante limitado e tem caráter
didático nos concentraremos
nos detalhes que de alguma forma demonstram um leque mínimo de
aplicação de conceitos de OO. A figura abaixo ilustra
graficamente os objetos que compõem esta aplicação e como
eles se relacionam em termos de herança, trocas de mensagens e
agregações.
- SCU
Do mesmo modo que em todo programa C ou Pascal,
todo programa Java, Smalltalk ou Eiffel tem uma classe que representa o
ponto de entrada do programa. Esta classe normalmente recebe o nome
do sistema, a nossa tem o nome SCU.
Do ponto de vista do nosso sistema, os principais elementos
componentes da universidade são os Departamentos (que agregam
Professores e Disciplinas) e Cursos (que agregam Alunos). Além destes,
no domínio administrativo da instituição existe a necessidade de
setores que realizam tarefas diversas como calcular o pagamento dos
empregados e emitir convites para eventos da comunidade universitária.
Estes setores estão representados pelos objetos SetorPagamento e
SetorEventos.
- Departamento
Um departamento é uma unidade da universidade responsável por agregar
professores e disciplinas.
- Curso
Um Curso agrega um conjunto de alunos, que tem que cumprir um número
específico de disciplinas para concluir este curso. Estas
informações: Alunos e Créditos para conclusão estão representadas nas
variáveis de um objeto Curso.
- SetorPagamento
O Setor de Pagamento da universidade é responsável pelo cálculo
dos valores a serem recebidos pelas pessoas que recebem remuneração por
serviços efetuados para a universidade. Para receber pagamento estas
pessoas necessitam responder a duas perguntas específicas:
Quantos dias trabalharam no mês ?, e Qual é a sua remuneração
mensal.
As pessoas que respondem a estas perguntas específicas estão agrupadas
na Interface Remunerável.
- SetorEventos
O Setor de Eventos periodicamente cadastra eventos a serem realizados na
universidade e emite convites para estes eventos, que podem ser endereçados
a qualquer (Pessoa) membro da comunidade,
controlando o número de pessoas convidadas para cada evento.
- Disciplina
No nosso exemplo uma disciplina agrega um nome, um professor e um conjunto de
alunos. Associado a um objeto disciplina existem métodos que definem os
serviços que este objeto pode realizar para alguém: Lista incluirAluno,
indicar que é o professor da disciplina, e listar todos os alunos da
disciplina.
- Professor
Um professor é antes de tudo uma Pessoa, do mesmo modo que Aluno também
é uma Pessoa. Esta propriedade é indicada pela herança que Professor e
Aluno fazem de Pessoa. Além disto um Professor tem um nível, um conjunto
de Disciplinas que leciona e recebe uma remuneração mensal baseada
no número de dias trabalhados.
- Aluno, AlunoPos e AlunoGraduação
Estas três classes representam um conjunto de informações
relacionadas com alunos no nosso Sistema. A classe Aluno representa as
informações e comportamentos que são comuns a todos os alunos, sejam de
graduação ou pós-graduação. A classe AlunoPos representa APENAS
as informações
e comportamentos que diferenciam um aluno (em geral)
de um aluno de pós-graduação. Do mesmo modo a classe AlunoGraduacao
representa as informações diferenciadas de um aluno desta natureza,
neste caso apenas o modo como se verifica se um aluno de graduação
já concluiu seu curso.
- AlunoIC
Além de ser um aluno de graduação um aluno de iniciação científica
apresenta características peculiares: está associado a um
projeto, tem um professor orientador e recebe uma remuneração mensal
baseada no número de dias trabalhados no mês.
- Remunerável
Representa as pessoas que trabalham na universidade e recebem
remuneração mensal. As classes Professor e AlunoIC implementam esta
interface porque possuem esta característica.
Funcionamento da Aplicação
O método main da classe SCU realiza uma série de
atividades pertinentes ao funcionamento do Sistema de Controle
Universitário. Vamos analisar cada um dos trechos de código
desta classe.
Declaração da Classe e Variáveis Estáticas com
Inicialização Automática
O código abaixo declara a classe SCU como sendo pública. Algumas
vezes uma classe que é utilizada apenas no escopo local de seu
programa deve ser declarada privada.
As quatro variáveis estáticas setorPagamento, setorEventos, departamentos e
cursos são inicializadas automaticamente sempre que este código é
carregado pelo interpretador de Java. Os valores atribuidos às variáveis
são objetos criados através dos métodos construtores: SetorPagamento(),
SetorEventos(), Departamento(String) e Curso(String, int), declarados nas
classes correspondentes.
O fato das variáveis serem declaradas estáticas significa que elas
não são variáveis de instância, mas sim variáveis associadas com a classe
SCU. Perceba que a classe SCU não tem um construtor, isto significa
que neste exemplo NÃO SÃO CRIADAS INSTÂNCIAS (OBJETOS) DA CLASSE SISTEMA.
O que existe é um espaço reservado para a classe SCU, que contém
as variáveis e métodos estáticos, a partir destas variáveis estáticas
se tem acesso a todos os objetos que compõem o sistema.
public class SCU {
static SetorPagamento setorPagamento = new SetorPagamento();
static SetorEventos setorEventos = new SetorEventos();
static Departamento deptoInformatica = new Departamento("Informatica");
static Curso graduacaoComputacao = new Curso("Bacharelado em Computacao",100);
O Método main
Toda Aplicação "stand-alone" de Java tem um método main,
com a assinatura abaixo. Se você passar argumentos de linha
de comando para a aplicação você os receberá através do
array de String args[].
Applets NÃO NECESSITAM IMPLEMENTAR O MÉTODO main.
Eles devem implementar
o método init(), como ficará claro nas próximas aulas.
public static void main (String args[]) {
Declaração de Variáveis Locais
As variáveis tp, ju e andre tem existência apenas
no escopo do método main. Elas são declaradas conter objetos pertencentes
à classe Professor. De modo similar declara-se abaixo cinco variáveis de
nomes java, logica, algoritmos, calculo e teoria, da classe Disciplina.
Professor tp, ju, andre;
Disciplina java, logica, algoritmos, calculo, teoria;
Criação de Objetos e Atribuição a Variáveis
Nas linhas que se seguem são criados vários objetos das classes
Professor e Disciplina, com valores diversos. Na criação de
Professor são utilizados dois construtores distintos:
Professor(String, String, int) e Professor(). Na criação de
Disciplinas também são usados construtores diversos.
tp = new Professor("Jose Tepedino", "padrao 4", 3000);
ju = new Professor("Julianne Pepeu", "aep", 1000);
andre = new Professor();
java = new Disciplina("Linguagens (Java)", tp);
logica = new Disciplina("Logica", ju);
algoritmos = new Disciplina("Algoritmos", tp);
teoria = new Disciplina("Teoria da Computacao");
calculo = new Disciplina("Calculo 1");
Envio de Mensagens: a festa começa
Embora tenhamos neste ponto vários objetos (um departamento,
um curso, um setor de pagamento, um setor de eventos, três professores
e cinco disciplinas) criados, estes objetos ainda não estão
relacionados entre si, e nenhum serviço realmente útil foi efetuado.
Tal situação é similar a
ter os dados digitados mas ainda não processados.
No código abaixo temos o envio de diversas mensagens ao objeto
deptoInformatica. A mensagem incluiProfessor(tp) enviada ao
deptoInformatica
faz com que este inclua o professor tp entre seus membros. De modo
similar as outras duas mensagens incluem os professores ju e andre
no deptoInformatica. Do mesmo modo que neste método (main)
estamos criando
objetos e enviando mensagens, nos métodos incluiProfessor,
incluiAluno e alocaDisciplina podem
estar sendo criados e enviados um número arbitrário de objetos e
mensagens.
deptoInformatica.incluiProfessor(tp);
deptoInformatica.incluiProfessor(ju);
deptoInformatica.incluiProfessor(andre);
deptoInformatica.incluiDisciplina(java);
deptoInformatica.incluiDisciplina(logica);
deptoInformatica.incluiDisciplina(algoritmos);
deptoInformatica.incluiDisciplina(teoria);
deptoInformatica.incluiDisciplina(calculo);
deptoInformatica.alocaDisciplina(teoria, ju);
Mais Declaração e Criação de Objetos
AlunoGraduacao ivo =
new AlunoGraduacao("Ivo","Ipsep",bachComputacao);
Aluno paulo = new AlunoGraduacao("Paulo","Ipsep",bachComputacao);
AlunoIC luiz =
new AlunoIC("Luiz Gonzaga", "Pina", bachComputacao,
"Pre-Calculo", andre, 240);
AlunoGraduacao chico =
new AlunoIC("Francisco","CDU",bachComputacao,
"Java Browser", tp, 240);
AlunoPos pedro = new AlunoPos("Pedro", "Boa Viagem", bachComputacao);
Aluno salete = new AlunoPos("Salete", "Varzea", bachComputacao);
Matriculando Alunos em Disciplinas
teoria.incluiAluno(paulo);
teoria.incluiAluno(pedro);
teoria.incluiAluno(salete);
logica.incluiAluno(chico);
logica.incluiAluno(pedro);
logica.incluiAluno(ivo);
java.incluiAluno(salete);
java.incluiAluno(ivo);
calculo.incluiAluno(luiz);
Emissão de Relatórios
No código abaixo temos a geração de relatórios em tela. O primeiro
relatório é uma listagem de disciplinas por departamento, com seus
professores e alunos. O segundo relatório imprime os valores de
remuneração dos professores e alunos de iniciação científica.
Perceba como a emissão dos relatórios depende da execução de
serviços efetuados pelos objetos Departamento, Disciplina,
Professor, AlunoIC, etc.
System.out.println();
System.out.print("Relatorio do Departamento de ");
System.out.println(deptoInformatica.nome);
System.out.println();
System.out.println("Disciplinas Oferecidas:");
System.out.println("-----------------------");
deptoInformatica.listaDisciplinas();
System.out.println();
/* Movimento do setor financeiro */
tp.diasTrabalhados(25);
ju.diasTrabalhados(12);
andre.diasTrabalhados(22);
luiz.diasTrabalhados(20);
setorPagamento.iniciaFolha();
System.out.println("Calculando a folha de pagamento...");
System.out.println("");
System.out.print("Jose Tepedino: ");
System.out.println(setorPagamento.calculaPagamento(tp));
System.out.print("Juliane: ");
System.out.println(setorPagamento.calculaPagamento(ju));
System.out.print("Andre: ");
System.out.println(setorPagamento.calculaPagamento(andre));
System.out.print("luiz: ");
System.out.println(setorPagamento.calculaPagamento(luiz));
System.out.println("");
System.out.print("Total da Folha:");
System.out.println(setorPagamento.valorFolhaPagamento);
}
}
Jorge Fernandes, jhcf@di.ufpe.br
Última edição em 11 de janeiro de 1996.
URL: http://www.di.ufpe.br/~java/verao/aula2/aula2.html