Curso de Verão de Java



Aula 3 - Refinamento da Aplicação Controle Universitário


Introdução

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.

Arquitetura da Aplicação

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.

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