Você está na página 1de 31

Java Deployment Course

Exerccio de Fixao #1
Sistema Universidade
Jorge H. C. Fernandes
Recife, 27 de Abril de 1999

Java Deployment Course:


Exerccio de Fixao #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 publicao pod
pode
e
ser reproduzida, armazenada em sistema de retrieval,
retrieval, ou transmitida,
em quaisquer formas, ou atravs de quaisquer meios, eletrnicos,
mecnicos, fotocpias, gravaes, etc,
etc, sem a prvia autorizao, 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 Cdigo
Execuo e Criao de Objetos
Exerccios e Outras Propostas de
Modificaes

Java Deployment Course - Exerccio #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 Perodo
Um Aluno se matricula em um nico Curso
Alunos se inscrevem em vrias Turmas que implementam apenas
as Disciplinas do seu Curso
Professores so responsveis por vrias Turmas
Uma Turma tem um nico Professor responsvel
Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Modelo ER Estendido

Java Deployment Course - Exerccio #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, Remunervel
Universidade
Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Pessoa, Alunos, Professores


Pessoa

Remunervel

Professor

Aluno

AlunoPos

AlunoGrad

AlunoIC

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Remunervel
interface Remuneravel {
int getDiasTrabalhados();
void setDiasTrabalhados(int diasTrabalhados);
int getRemuneracao();
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Pessoa
class Pessoa {
// Toda pessoa possui um nome e um endereo
String nome;
String endereco;
// construtor que recebe o nome e endereo
Pessoa(String nome, String endereco) {
this.nome = nome;
this.endereco = endereco;
}
// pessoa com endereo indefinido
Pessoa (String nome) {
this(nome, "Indefinido");
}
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Pessoa:
Caractersticas do Cdigo
Dois construtores
// construtor que recebe o nome e endereo
Pessoa(String nome, String endereco) {
this.nome = nome;
this.endereco = endereco;
}
// pessoa com endereo indefinido
Pessoa (String nome) {
this(nome, "Indefinido");
}

Sempre definir um construtor cannico


Pessoa(String nome, String endereco) {...}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Aluno
abstract class Aluno extends Pessoa {
Curso curso; // curso que o aluno freqenta
int
creditosPagos; // Crditos 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 crditos ao histrico do aluno
int adicionaCreditos(int creditos) {..}
// indica se o aluno j concluiu o curso
abstract boolean concluiu();
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

AlunoGrad (Graduao)
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 graduao
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 concluso
boolean concluiu() {
if (creditosPagos >= curso.creditosParaConclusao)
return true;
else
return false;
}
}
Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe AlunoGrad:
Caractersticas do Cdigo
Construtor de AlunoGrad utiliza construtor
da superclasse
AlunoGrad (String nome, String endereco, Curso curso) {
super(nome, endereco, curso);
}

Mtodo 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 - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

AlunoIC (Iniciao Cientfica)


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 ms
// construtor
AlunoIC(String nome, String endereco, Curso curso,
String projeto, Professor orientador, int valorBolsa) {
super(nome, endereco, curso);
...
}
public int getRemuneracao() {..} // retorna a remunerao do aluno
// retorna a quantidade de dias trabalhados pelo aluno
public int getDiasTrabalhados() {..}
// ajusta quantos dias o aluno trabalhou no ms
public void setDiasTrabalhados(int dias) {..}
}

Java Deployment Course - Exerccio #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 responsvel
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 - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Professor:
Caractersticas do Cdigo
 Armazenamento de objetos em um array
// turmas pelas quais o professor responsvel
private Turma[] turmas;
int qtdTurmas;

 Array com tamanho fixo


turmas = new Turma[3];

 Nmero Mgico (Por que 3 turmas?)


turmas = new Turma[3];

 Violao de encapsulamento do array


Turma[] getTurmas() { return turmas; }

 Falha silenciosa na no incluso da 4a turma


void incluiTurma(Turma novaTurma) {
if (qtdTurmas < 3) {
turmas[qtdTurmas] = novaTurma;
qtdTurmas++;
}
}

Java Deployment Course - Exerccio #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 crditos
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 +" Crditos: "+creditos;
}
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Disciplina:
Caractersticas do Cdigo
Criao de Turma a partir de uma
disciplina
Turma criaTurma(String periodo) {
return new Turma(this, periodo);
}

Implementao do Mtodo toString()


public String toString() {
return "Nome Disciplina: "+nome +" Crditos: "+creditos;
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Turma
public class Turma {
Disciplina disciplina; // turma implementa uma disciplina especfica
String periodo;
// em um perodo de oferta
Professor professor;
// professor responsvel 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 informaes da turma
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Turma:
Caractersticas do Cdigo
Armazenamento de objetos em um array
Array com tamanho fixo
Nmero Mgico (Por que 30 alunos?)
Falha silenciosa na no incluso do 31o
aluno

Java Deployment Course - Exerccio #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 - Exerccio #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 - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Class Departamento:
Caractersticas do Cdigo
Substituio de Nmeros Mgicos por
constantes
static final int MAX_TURMAS = 300;

Possvel incluso de turma cuja disciplina


no pertence ao departamento

Java Deployment Course - Exerccio #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; // crditos para concluso
static final int MAX_ALUNOS = 300;// tamanho mximo 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() {
// informaes sobre o curso
return "Curso: "+ nome + " | "+
"Crditos: "+ creditosParaConclusao + " | "+
"Qtd Alunos: "+ qtdAlunos + "|";
}
// testa criao de cursos
public static void main(String[] args) {...}
}
Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Curso (2/2)
public class Curso {
..
// testa criao de cursos
public static void main(String[] args) {
Curso curso1 = new Curso("Bach. Informtica", 360);
Curso curso2 = new Curso("Ph.D. Informtica", 48);
Curso curso3 = new Curso("M.Sc. Informatica", 36);
System.out.println(curso1);
System.out.println(curso2);
System.out.println(curso3);
}
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Curso:
Caractersticas do Cdigo
Implementao do Mtodo toString()
Mtodo de teste para criao de alguns
objetos

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Classe Universidade
public class Universidade { ...
public static void main (String args[]) { ...
/* Criao de setor de pagamentos, eventos, departamento e curso */
/* Variveis para armazenar professores, disciplinas, turmas */
/* Criando alguns professores */
/* Incluindo professores no departamento de Informtica */
/* Criando algumas disciplinas */
/* Criando algumas turmas */
/* Incluindo disciplinas no departamento de informtica */
/* Alocando professores a disciplinas */
/* Criando alunos */
/* Matriculando os alunos em turmas */
/* Emite relatrio do Departamento */d
/* Movimento do setor financeiro */
}
}

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Exerccios
 Acompanhe a execuo do mtodo main da classe Universidade. Observe
como ocorre a criao de objetos das vrias classes: Departamento,
SetorEventos, SetorPagamento, Curso, Disciplina, Professor, Turma, Aluno,
AlunoGrad, AlunoIC
 Esboce um grafo dos objetos que so criados durante a execuo de main
 Acompanhe a execuo das rotinas de clculo da folha
 Confrontando a implementao com os requisitos do sistema, percebe-se
que existem vrias falhas conceituais na implementao. Algumas destas
falhas esto listadas no slide a seguir. Proponha solues para elas. Tente
identificar outras.
 O cdigo apresenta algumas deficincias de lgica de programao, ou
esquemas de codificao que tornam o sistema mais susceptvel a falhas
(menos robusto). Algumas destas deficincias esto listadas em um slide
frente. Proponha solues para estas. Tente identificar outras deficincias.

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Implementao versus
Requisitos
 Departamento permite que se inclua uma Turma cuja Disciplina no
pertena ao conjunto de disciplinas que ele agrega
 Um Professor pode ministrar Disciplinas que no pertenam ao seu
Departamento
 Alunos podem se inscrevem em Turmas cuja Disciplina no so do
seu Curso

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Codificao Frgil
 Alguns mtodos de incluso de professor e turma falham
silenciosamente quando se ultrapassa o limite do array utilizado.
 Existem alguns nmeros mgicos que no esto documentados
 O limite no tamanho dos arrays um requisito do sistema, ou um
esquema de codificao frgil?
 No existe teste de duplicidade na insero de alunos, professores,
turmas, disciplinas, etc

Java Deployment Course - Exerccio #1. Copyright 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.

Fim

Você também pode gostar