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