sistema universidade exercício de fixação #1 java ...jhcf/mybooks/itjava/slides/... · java...
TRANSCRIPT
Java Deployment CourseExercício de Fixação #1Sistema Universidade
Jorge H. C. FernandesRecife, 27 de Abril de 1999
Java Deployment Course: Exercício de Fixação #1Sistema Universidade
CopyrightCopyrightCopyrightCopyright © 1999, 1995. Jorge H. C. Fernandes (© 1999, 1995. Jorge H. C. Fernandes (© 1999, 1995. Jorge H. C. Fernandes (© 1999, 1995. Jorge H. C. Fernandes (jhcfjhcfjhcfjhcf@@@@didididi....ufpeufpeufpeufpe.br).br).br).br)
Todos os direitos reservados. Nenhuma parte desta publicação podTodos os direitos reservados. Nenhuma parte desta publicação podTodos os direitos reservados. Nenhuma parte desta publicação podTodos os direitos reservados. Nenhuma parte desta publicação pode e e e ser reproduzida, armazenada em sistema deser reproduzida, armazenada em sistema deser reproduzida, armazenada em sistema deser reproduzida, armazenada em sistema de retrievalretrievalretrievalretrieval, ou transmitida, , ou transmitida, , ou transmitida, , ou transmitida, em quaisquer formas, ou através de quaisquer meios, eletrônicos,em quaisquer formas, ou através de quaisquer meios, eletrônicos,em quaisquer formas, ou através de quaisquer meios, eletrônicos,em quaisquer formas, ou através de quaisquer meios, eletrônicos,mecânicos, fotocópias, gravações,mecânicos, fotocópias, gravações,mecânicos, fotocópias, gravações,mecânicos, fotocópias, gravações, etcetcetcetc, sem a prévia autorização, por , sem a prévia autorização, por , sem a prévia autorização, por , sem a prévia autorização, por escrito, de Jorge Henrique Cabral Fernandes. escrito, de Jorge Henrique Cabral Fernandes. escrito, de Jorge Henrique Cabral Fernandes. escrito, de Jorge Henrique Cabral Fernandes.
All rights reservedAll rights reservedAll rights reservedAll rights reserved. No. No. No. No part of this publication may be reproducedpart of this publication may be reproducedpart of this publication may be reproducedpart of this publication may be reproduced,,,,stored instored instored instored in aaaa retrieval systemretrieval systemretrieval systemretrieval system,,,, or transmittedor transmittedor transmittedor transmitted,,,, in any formin any formin any formin any form,,,, or by any or by any or by any or by any meansmeansmeansmeans,,,, electronicelectronicelectronicelectronic,,,, mechanicalmechanicalmechanicalmechanical,,,, photocopyingphotocopyingphotocopyingphotocopying,,,, recordingrecordingrecordingrecording, , , , or or or or otherwiseotherwiseotherwiseotherwise,,,, without thewithout thewithout thewithout the priorpriorpriorprior consent of the publisherconsent of the publisherconsent of the publisherconsent of the publisher....
JavaJavaJavaJavaTMTMTMTM is is is is a a a a trademark of Sun Microsystemstrademark of Sun Microsystemstrademark of Sun Microsystemstrademark of Sun Microsystems....
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
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, ProfessoresPessoa
AlunoPos
Aluno
AlunoGrad
AlunoIC
Professor
Remunerável
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Remunerávelinterface 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.
Pessoaclass 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ônicoPessoa(String nome, String endereco) {...}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Alunoabstract 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çãoAlunoIC 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ãoboolean concluiu() {
if (creditosPagos >= curso.creditosParaConclusao)return true;
elsereturn 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 superclasseAlunoGrad (String nome, String endereco, Curso curso) {
super(nome, endereco, curso);}
�Método para criar um AlunoIC a partir de um AlunoGradAlunoIC 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á alocadoProfessor orientador; // Professor orientadorprivate int valorBolsa; // valor da bolsaprivate int diasPesquisa; // Quantos dias o aluno trabalhou no mês
// construtorAlunoIC(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 alunopublic int getDiasTrabalhados() {..}// ajusta quantos dias o aluno trabalhou no mêspublic void setDiasTrabalhados(int dias) {..}
}
Java Deployment Course - Exercício #1. Copyright © 1999, 1995. Jorge H. C. Fernandes. Todos os Direitos Reservados.
Professorpublic class Professor extends Pessoa implements Remuneravel {...// turmas pelas quais o professor é responsávelprivate 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 professorvoid 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ávelprivate Turma[] turmas;int qtdTurmas;
� Array com tamanho fixoturmas = new Turma[3];
� Número Mágico (Por que 3 turmas?)turmas = new Turma[3];
� Violação de encapsulamento do arrayTurma[] getTurmas() { return turmas; }
� Falha silenciosa na não inclusão da 4a turmavoid 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.
Disciplinapublic 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 disciplinaTurma 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.
Turmapublic class Turma {Disciplina disciplina; // turma implementa uma disciplina específicaString periodo; // em um período de ofertaProfessor professor; // professor responsável pela disciplinaprivate Aluno alunos[];// alunos inscritos na turmaint qtdAlunos; // quantidade de alunos inscritosTurma(Disciplina disciplina, String periodo) { // cria uma turma
...alunos = new Aluno[30];qtdAlunos = 0;
}void alocaProfessor(Professor prof) {..} //aloca professor à turmavoid incluiAluno (Aluno aluno) { // inclui aluno à turmaif (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 departamentoboolean incluiTurma (Turma turma) {
if (qtdTurmas < MAX_TURMAS) {turmas[qtdTurmas] = turma;qtdTurmas++;return true;
}return false;
}
// lista as turmas ofertadas pelo departamentovoid 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 constantesstatic 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 Cursoint creditosParaConclusao; // créditos para conclusãostatic final int MAX_ALUNOS = 300;// tamanho máximo do arrayprivate Aluno alunos[]; // alunos matriculadosint qtdAlunos; // quantidade de alunos no arrayCurso(String nome, int creditos) {this.nome = nome;this.creditosParaConclusao = creditos;this.alunos = new Aluno[MAX_ALUNOS];this.qtdAlunos = 0;
}void listaConcluintes() {...} // lista os concluintespublic String toString() { // informações sobre o cursoreturn "Curso: "+ nome + " | "+
"Créditos: "+ creditosParaConclusao + " | "+"Qtd Alunos: "+ qtdAlunos + "|";
}// testa criação de cursospublic 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 cursospublic 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 Universidadepublic 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ãopertença ao conjunto de disciplinas que ele agrega
� Um Professor pode ministrar Disciplinas que não pertençam ao seuDepartamento
� 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
Fim