Java Deployment Course
Exercício de Fixação #1
Sistema Universidade
Jorge H. C. Fernandes
Recife, 27 de Abril de 1999
Java Deployment Course:
Exercício de Fixação #1
Sistema Universidade
Copyright © 1999, 1995. Jorge H. C. Fernandes (jhcf
(jhcf@
jhcf@di.
di.ufpe.br)
ufpe.br)
Todos os direitos reservados. Nenhuma parte desta publicação pod
pode
e
ser reproduzida, armazenada em sistema de retrieval,
retrieval, ou transmitida,
em quaisquer formas, ou através de quaisquer meios, eletrônicos,
mecânicos, fotocópias, gravações, etc,
etc, sem a prévia autorização, por
escrito, de Jorge Henrique Cabral Fernandes.
All rights reserved.
reserved. No part of this publication may be reproduced,
reproduced,
stored in a retrieval system,
system, or transmitted,
transmitted, in any form,
form, or by any
means,
means, electronic,
electronic, mechanical,
mechanical, photocopying,
photocopying, recording,
recording, or
otherwise,
otherwise, without the prior consent of the publisher.
publisher.
JavaTM is a trademark of Sun Microsystems.
Microsystems.
Sistema Universidade
Requisitos
Classes e Código
Execução e Criação de Objetos
Exercícios e Outras Propostas de
Modificações
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Requisitos do Sistema
Universidade agrega Departamentos e Cursos
Um Departamento agrega Disciplinas e Professores
Um Curso agrega Alunos e Disciplinas
Uma Disciplina está alocada a um único Departamento
Um Professor está lotado em um único Departamento
Departamentos criam Turmas apenas para as Disciplinas que
agregam
Uma Turma implementa uma única Disciplina em um único Período
Um Aluno se matricula em um único Curso
Alunos se inscrevem em várias Turmas que implementam apenas
as Disciplinas do seu Curso
Professores são responsáveis por várias Turmas
Uma Turma tem um único Professor responsável
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Modelo ER Estendido
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classes do Projeto
Pessoa
Aluno, AlunoGrad, AlunoIC, AlunoPos
Professor
Departamento, Curso, Disciplina, Turma
SetorEventos, Convite
SetorPagamento, Remunerável
Universidade
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Pessoa, Alunos, Professores
Pessoa
Remunerável
Professor
Aluno
AlunoPos
AlunoGrad
AlunoIC
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Remunerável
interface Remuneravel {
int getDiasTrabalhados();
void setDiasTrabalhados(int diasTrabalhados);
int getRemuneracao();
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Pessoa
class Pessoa {
// Toda pessoa possui um nome e um endereço
String nome;
String endereco;
// construtor que recebe o nome e endereço
Pessoa(String nome, String endereco) {
this.nome = nome;
this.endereco = endereco;
}
// pessoa com endereço indefinido
Pessoa (String nome) {
this(nome, "Indefinido");
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Pessoa:
Características do Código
Dois construtores
// construtor que recebe o nome e endereço
Pessoa(String nome, String endereco) {
this.nome = nome;
this.endereco = endereco;
}
// pessoa com endereço indefinido
Pessoa (String nome) {
this(nome, "Indefinido");
}
Sempre definir um construtor canônico
Pessoa(String nome, String endereco) {...}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Aluno
abstract class Aluno extends Pessoa {
Curso curso; // curso que o aluno freqüenta
int
creditosPagos; // Créditos já pagos pelo aluno
// cria um aluno (abstrato)
Aluno (String nome, String endereco, Curso curso) {
super(nome,endereco);
this.curso = curso;
this.creditosPagos = 0;
}
// adiciona créditos ao histórico do aluno
int adicionaCreditos(int creditos) {..}
// indica se o aluno já concluiu o curso
abstract boolean concluiu();
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
AlunoGrad (Graduação)
public class AlunoGrad extends Aluno {
AlunoGrad (String nome, String endereco, Curso curso) {
super(nome, endereco, curso);
}
// cria um aluno de IC a partir de um aluno de graduação
AlunoIC iniciacaoCientifica(String projeto,
Professor orientador, int valorBolsa) {
return (new AlunoIC(nome, endereco, curso,
projeto, orientador, valorBolsa));
}
// indica se o aluno já cumpriu os requisitos para conclusão
boolean concluiu() {
if (creditosPagos >= curso.creditosParaConclusao)
return true;
else
return false;
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe AlunoGrad:
Características do Código
Construtor de AlunoGrad utiliza construtor
da superclasse
AlunoGrad (String nome, String endereco, Curso curso) {
super(nome, endereco, curso);
}
Método para criar um AlunoIC a partir de
um AlunoGrad
AlunoIC iniciacaoCientifica(String projeto,
Professor orientador,
int valorBolsa) {
return (new AlunoIC(nome, endereco, curso,
projeto, orientador, valorBolsa));
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
AlunoIC (Iniciação Científica)
public class AlunoIC extends AlunoGrad implements Remuneravel {
String projeto;
// Projeto ao qual o aluno está alocado
Professor orientador;
// Professor orientador
private int valorBolsa;
// valor da bolsa
private int diasPesquisa; // Quantos dias o aluno trabalhou no mês
// construtor
AlunoIC(String nome, String endereco, Curso curso,
String projeto, Professor orientador, int valorBolsa) {
super(nome, endereco, curso);
...
}
public int getRemuneracao() {..} // retorna a remuneração do aluno
// retorna a quantidade de dias trabalhados pelo aluno
public int getDiasTrabalhados() {..}
// ajusta quantos dias o aluno trabalhou no mês
public void setDiasTrabalhados(int dias) {..}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Professor
public class Professor extends Pessoa implements Remuneravel {
...
// turmas pelas quais o professor é responsável
private Turma[] turmas;
int qtdTurmas;
Professor(String nomeProfessor, String formacaoProfessor,
int salarioProfessor) {
..
turmas = new Turma[3];
qtdTurmas = 0;
}
Turma[] getTurmas() { return turmas; }
// inclui uma nova turma para o professor
void incluiTurma(Turma novaTurma) {
if (qtdTurmas < 3) {
turmas[qtdTurmas] = novaTurma;
qtdTurmas++;
}
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Professor:
Características do Código
Armazenamento de objetos em um array
// turmas pelas quais o professor é responsável
private Turma[] turmas;
int qtdTurmas;
Array com tamanho fixo
turmas = new Turma[3];
Número Mágico (Por que 3 turmas?)
turmas = new Turma[3];
Violação de encapsulamento do array
Turma[] getTurmas() { return turmas; }
Falha silenciosa na não inclusão da 4a turma
void incluiTurma(Turma novaTurma) {
if (qtdTurmas < 3) {
turmas[qtdTurmas] = novaTurma;
qtdTurmas++;
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Disciplina
public class Disciplina {
String nome; // nome da disciplina
int creditos; // quantidade de créditos
Disciplina (String nomeDisciplina, int creditosDisciplina) {
nome = nomeDisciplina;
creditos = creditosDisciplina;
}
Turma criaTurma(String periodo) {
return new Turma(this, periodo);
}
public String toString() {
return "Nome Disciplina: "+nome +" Créditos: "+creditos;
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Disciplina:
Características do Código
Criação de Turma a partir de uma
disciplina
Turma criaTurma(String periodo) {
return new Turma(this, periodo);
}
Implementação do Método toString()
public String toString() {
return "Nome Disciplina: "+nome +" Créditos: "+creditos;
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Turma
public class Turma {
Disciplina disciplina; // turma implementa uma disciplina específica
String periodo;
// em um período de oferta
Professor professor;
// professor responsável pela disciplina
private Aluno alunos[];// alunos inscritos na turma
int qtdAlunos;
// quantidade de alunos inscritos
Turma(Disciplina disciplina, String periodo) { // cria uma turma
...
alunos = new Aluno[30];
qtdAlunos = 0;
}
void alocaProfessor(Professor prof) {..} //aloca professor à turma
void incluiAluno (Aluno aluno) {
// inclui aluno à turma
if (qtdAlunos < 30) {
alunos[qtdAlunos] = umAluno;
qtdAlunos = qtdAlunos + 1;
}
}
public void liste() {..} // lista informações da turma
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Turma:
Características do Código
Armazenamento de objetos em um array
Array com tamanho fixo
Número Mágico (Por que 30 alunos?)
Falha silenciosa na não inclusão do 31o
aluno
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Departamento (1/2)
public class Departamento {
String nome; // nome do departamento
Professor professores[]; //professores lotados no depto
int qtdProfessores;
Disciplina disciplinas[]; // disciplinas oferecidas
int qtdDisciplinas;
Turma turmas[]; // turmas criadas
int qtdTurmas;
static final int MAX_TURMAS = 300;
Departamento (String umNome) {...} // cria departamento
boolean incluiProfessor(Professor umProfessor) {...}
boolean incluiDisciplina(Disciplina umaDisciplina) {...}
boolean incluiTurma(Turma umaTurma) {...}
void listaProfessores() {...}
void listaDisciplinas() {...}
void listaTurmas() {...}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Departamento (2/2)
class Departamento {
...
// inclui uma turma no departamento
boolean incluiTurma (Turma turma) {
if (qtdTurmas < MAX_TURMAS) {
turmas[qtdTurmas] = turma;
qtdTurmas++;
return true;
}
return false;
}
// lista as turmas ofertadas pelo departamento
void listaTurmas() {
for(int i=0; i<qtdTurmas; i++) {
System.out.println(turmas[i]);
}
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Class Departamento:
Características do Código
Substituição de Números Mágicos por
constantes
static final int MAX_TURMAS = 300;
Possível inclusão de turma cuja disciplina
não pertence ao departamento
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Curso (1/2)
public class Curso {
String nome; // nome do Curso
int creditosParaConclusao; // créditos para conclusão
static final int MAX_ALUNOS = 300;// tamanho máximo do array
private Aluno alunos[];
// alunos matriculados
int qtdAlunos;
// quantidade de alunos no array
Curso(String nome, int creditos) {
this.nome = nome;
this.creditosParaConclusao = creditos;
this.alunos = new Aluno[MAX_ALUNOS];
this.qtdAlunos = 0;
}
void listaConcluintes() {...} // lista os concluintes
public String toString() {
// informações sobre o curso
return "Curso: "+ nome + " | "+
"Créditos: "+ creditosParaConclusao + " | "+
"Qtd Alunos: "+ qtdAlunos + "|";
}
// testa criação de cursos
public static void main(String[] args) {...}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Curso (2/2)
public class Curso {
..
// testa criação de cursos
public static void main(String[] args) {
Curso curso1 = new Curso("Bach. Informática", 360);
Curso curso2 = new Curso("Ph.D. Informática", 48);
Curso curso3 = new Curso("M.Sc. Informatica", 36);
System.out.println(curso1);
System.out.println(curso2);
System.out.println(curso3);
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Curso:
Características do Código
Implementação do Método toString()
Método de teste para criação de alguns
objetos
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Classe Universidade
public class Universidade { ...
public static void main (String args[]) { ...
/* Criação de setor de pagamentos, eventos, departamento e curso */
/* Variáveis para armazenar professores, disciplinas, turmas */
/* Criando alguns professores */
/* Incluindo professores no departamento de Informática */
/* Criando algumas disciplinas */
/* Criando algumas turmas */
/* Incluindo disciplinas no departamento de informática */
/* Alocando professores a disciplinas */
/* Criando alunos */
/* Matriculando os alunos em turmas */
/* Emite relatório do Departamento */d
/* Movimento do setor financeiro */
}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Exercícios
Acompanhe a execução do método main da classe Universidade. Observe
como ocorre a criação de objetos das várias classes: Departamento,
SetorEventos, SetorPagamento, Curso, Disciplina, Professor, Turma, Aluno,
AlunoGrad, AlunoIC
Esboce um grafo dos objetos que são criados durante a execução de main
Acompanhe a execução das rotinas de cálculo da folha
Confrontando a implementação com os requisitos do sistema, percebe-se
que existem várias falhas conceituais na implementação. Algumas destas
falhas estão listadas no slide a seguir. Proponha soluções para elas. Tente
identificar outras.
O código apresenta algumas deficiências de lógica de programação, ou
esquemas de codificação que tornam o sistema mais susceptível a falhas
(menos robusto). Algumas destas deficiências estão listadas em um slide à
frente. Proponha soluções para estas. Tente identificar outras deficiências.
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Implementação versus
Requisitos
Departamento permite que se inclua uma Turma cuja Disciplina não
pertença ao conjunto de disciplinas que ele agrega
Um Professor pode ministrar Disciplinas que não pertençam ao seu
Departamento
Alunos podem se inscrevem em Turmas cuja Disciplina não são do
seu Curso
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Codificação Frágil
Alguns métodos de inclusão de professor e turma falham
silenciosamente quando se ultrapassa o limite do array utilizado.
Existem alguns números mágicos que não estão documentados
O limite no tamanho dos arrays é um requisito do sistema, ou um
esquema de codificação frágil?
Não existe teste de duplicidade na inserção de alunos, professores,
turmas, disciplinas, etc
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Fim
Download

31 slides