Anda di halaman 1dari 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

(jhcf di.ufpe.br) jhcf@ Copyright 1999, 1995. Jorge H. C. Fernandes (jhcf@di.ufpe.br) pode Todos os direitos reservados. Nenhuma parte desta publicao pode retrieval, ser reproduzida, armazenada em sistema de retrieval, ou transmitida, em quaisquer formas, ou atravs de quaisquer meios, eletrnicos, etc, mecnicos, fotocpias, gravaes, etc, sem a prvia autorizao, por escrito, de Jorge Henrique Cabral Fernandes. reproduced, All rights reserved. No part of this publication may be reproduced, reserved. system, transmitted, form, stored in a retrieval system, or transmitted, in any form, or by any means, electronic, mechanical, photocopying, recording, means, electronic, mechanical, photocopying, recording, or otherwise, publisher. otherwise, without the prior consent of the publisher. Microsystems. JavaTM is a trademark of Sun 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

Aluno

Professor

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