UNIVERSIDADE TÉCNICA DE LISBOA
INSTITUTO SUPERIOR TÉCNICO
Ano Lectivo de 2005/2006, 2o Ano, 1o Semestre
Projecto de Programação com Objectos
Gestão de Mediateca
09 de Novembro de 2005
INFORMAÇÕES IMPORTANTES
O projecto não tem nota mı́nima e contribui com um máximo de 10 valores (50%) para a nota final. Fraudes na execução do
projecto terão como resultado a classificação de 0 (zero) valores.
Datas: 14 de Novembro de 2005 (entrega intermédia); 30 de Novembro de 2005 (entrega final); 13, 14 e 15 de Dezembro
de 2005 (discussão e teste prático).
Dúvidas que não possam ser esclarecidas presencialmente ou através do material no Fénix, devem ser colocadas através
de correio electrónico (ver endereço no Fénix). Advertem-se os alunos contra a utilização de fontes de informação não
oficialmente associadas ao corpo docente.
1 Introdu~ao
O objectivo do projecto é desenvolver um sistema que auxilie o trabalho de um bibliotecário que tem a cargo a gestão do acervo
de uma mediateca. O acervo contém à disposição dos utentes, entre outros tipos de obras, livros e DVDs. O sistema deverá
permitir (i) fazer pesquisas de obras; (ii) registar dados de utentes; (iii) registar dados de obras; e (iv) registar requisições de
obras para consulta domiciliária.
2 Desri~ao
Esta secção descreve os conceitos e funcionalidade básica da mediateca sem considerar pormenores de interacção.
2.1 Obras
As obras a considerar inicialmente são livros e DVDs. A mediateca pode manter vários exemplares de cada obra. A cada obra
está associado um identificador único dentro do sistema, bem como o número de exemplares existentes no acervo.
• Livros – O sistema deverá manter, para cada livro, a seguinte informação: tı́tulo, autor (apenas um, por simplicidade),
preço, categoria e ISBN (International Standard Book Number) (cadeia com dez caracteres).
• DVDs – Para cada DVD, o sistema deverá manter: tı́tulo, realizador (apenas um, por simplicidade), preço, categoria e o
número de registo na IGAC (Inspecção-Geral das Actividades Culturais) (cadeia com dez caracteres).
• Outros tipos de obras – Deve ser possı́vel criar novos tipos de obras. O impacto da introdução dos novos tipos na
implementação desenvolvida deve ser mı́nimo.
2.2 Categorias
Cada obra tem uma categoria, de acordo com o assunto nela tratado. Inicialmente, consideram-se as seguintes categorias: (i)
obras de referência: onde se incluem dicionários, gramáticas, enciclopédias e documentários; (ii) obras de ficção; e (iii) obras
técnicas e cientı́ficas. Deve ser possı́vel criar novas categorias, com um impacto mı́nimo sobre o sistema desenvolvido.
2.3 Utentes
O sistema mantém um registo de utentes da mediateca. Cada utente é identificado por um número de utente. O sistema mantém
ainda, para cada utente, o seu nome, endereço de correio electrónico e informação sobre a situação do utente perante a mediateca:
(i) activo, i.e., o utente pode fazer requisições; (ii) suspenso, i.e., o utente não pode fazer novas requisições.
Um utente é suspenso se não devolver uma obra requisitada dentro do prazo estipulado; permanece suspenso até devolver a obra
e pagar a multa referente ao atraso na entrega.
A mediateca distingue entre utentes que cumprem as regras de funcionamento e utentes que violam sistematicamente os compromissos. Existe ainda uma classificação intermédia para novos utentes ou para utentes com comportamento misto.
Um utente que nas últimas 3 requisições não tenha cumprido os prazos de devolução, é classificado como faltoso. Um utente
faltoso que proceda a 3 devoluções consecutivas dentro do prazo é considerado normal. Um cliente que tenha cumprido rigorosamente os prazos de entrega nas últimas 5 requisições é classificado como cumpridor. Em todos os outros casos, o utente não
tem classificação especial e é considerado normal. Como se verá adiante, a classificação influencia a capacidade de requisição
do utente.
O comportamento (no que diz respeito a entrega, dentro ou fora do prazo, de obras requisitadas antes da suspensão) de um utente
suspenso influencia a sua classificação após o pagamento da multa. Por exemplo, se antes de pagar a multa, o utente entregar 3
obras dentro do prazo e regularizar a sua situação então passará a ser um utente que pode efectuar requisições com a classificação
de normal.
Deve ser possı́vel discriminar os utentes quanto à sua conduta, considerando outros critérios ou novas classificações, com um
impacto mı́nimo na implementação desenvolvida.
2.4 Requisições
O sistema garante o cumprimento de regras para a requisição de obras. As regras dependem das caracterı́sticas da obra que
se pretende requisitar e da conduta passada do utente. Utentes cumpridores estão sujeitos a regras permissivas enquanto que a
utentes faltosos são aplicadas regras restritivas. Os restantes utentes seguem um conjunto de regras de base. As regras gerais a
respeitar pelos utentes são:
0. Não pode requisitar obras um utente que esteja suspenso;
1. Não pode requisitar obras cujos exemplares tenham sido já todos requisitados;
2. Não pode ter mais que n obras requisitadas em cada momento (valor base: 3; utentes cumpridores: 5; utentes faltosos: 1);
3. Não pode requisitar obras de referência;
4. Não pode requisitar obras com um preço superior a e25,00 (não aplicável a utentes cumpridores);
No caso de violação da regra 1, o utente pode pedir para ser notificado assim que algum exemplar seja devolvido. A notificação
consiste, por omissão, no envio de uma mensagem por correio electrónico ao utente, indicando que a obra já se encontra disponı́vel (ver §4).
Ao requisitar uma obra, o utente deve ser informado da data limite para a devolução. O tempo de requisição permitido para cada
obra depende do número total de exemplares que constem do acervo da mediateca e da conduta do utente. Os prazos, em dias,
são os seguintes:
• Obras com apenas um exemplar – valor de base: 3; utentes cumpridores: 8; utentes faltosos: 2;
• Obras com 5 exemplares ou menos – valor de base 8; utentes cumpridores: 15; utentes faltosos: 2;
• Obras com mais de 5 exemplares – valor de base 15; utentes cumpridores: 30; utentes faltosos: 2.
Se o utente não entregar as obras requisitadas no prazo devido fica imediatamente suspenso, não podendo requisitar mais obras
até regularizar a situação. Por cada dia de atraso, o utente fica sujeito ao pagamento de uma multa de e5,00 (cinco euros). A
situação só se considera regularizada após a devolução das obras em atraso e o pagamento da multa. Para efeitos de pagamento
de multas, fracções de dia contam como um dia (a unidade de tempo do sistema é o dia).
Deve ser possı́vel alterar ou acrescentar regras para a requisição de obras, bem como fazer alterações aos tempos de requisição
permitidos. As alterações devem ter impacto mı́nimo na implementação desenvolvida.
2
2.5 Pesquisas no Acervo
Para permitir que o bibliotecário ajude os utentes a determinar a existência de uma obra, o sistema deverá permitir efectuar
pesquisas. As pesquisas consideram os campos relevantes das várias obras (ver §3.1.2). Deve ser possı́vel introduzir novos
métodos de pesquisa de uma obra com um impacto mı́nimo na implementação desenvolvida.
2.6 Tempo
A unidade de tempo do sistema é o dia. A data do sistema começa no dia 0 (zero), quando o sistema arranca sem recuperar estado
anterior (ver §5). Sempre que a data é alterada, deve ser verificada a situação dos utentes.
3 Intera~ao om o Utilizador
Nesta secção é descrita a funcionalidade máxima da mediateca, descrevendo-se a interacção com o utilizador. Nos exemplos
de código apresentados, o tipo de letra fixo indica um literal; o sı́mbolo indica um espaço; e o tipo de letra itálico indica uma
parte variável.
Assume-se que as excepções documentadas nesta secção serão devidamente tratadas pela classe Menu. Todas as interacções
com o utilizador (leitura e escrita), têm de ser realizadas através da classe InteraccaoUtilizador (semelhante à utilizada
nas aulas práticas) utilizando as mensagens descritas abaixo. Uma lista completa das classes disponibilizadas pode ser obtida na
documentação javadoc associada a este enunciado (disponı́vel através do Fénix).
Utilizam-se mediateca.mensagens.Utente.pedidoDeNumero() e mediateca.mensagens.Obra.pedidoDeNumero(),
nas opções abaixo, para pedir os identificadores de utentes ou obras (respectivamente). As excepções UtenteInexistente ou
ObraInexistente devem ser lançadas pela mediateca quando se detectem identificadores inválidos para utentes ou obras (respectivamente).
3.1 Menu Principal
O menu principal permite ver obras, efectuar pesquisas, aceder aos submenus de requisições e utentes, ver e avançar a data e sair
da aplicação (as etiquetas das opções deste menu estão definidas em mediateca.mensagens.Menu).
3.1.1 Ver Obra
Esta opção pede ao bibliotecário o identificador da obra a consultar. A informação resultante da consulta deve ser apresentada
como se segue (os atributos estão em itálico), respectivamente, para livros e DVDs:
id - Livro - titulo - autor - preco - categoria - isbn
id - DVD - titulo - realizador - preco - categoria - numeroigac
3.1.2 Efectuar Pesquisa
Esta opção realiza uma procura por termo: utilizando a mensagem mediateca.mensagens.Obra.pedidoDeTermo(), o
sistema pede ao bibliotecário que introduza o termo (uma cadeia de caracteres). Como resultado, deve ser apresentada uma
lista das obras encontradas pela pesquisa, ordenadas por ordem crescente do seu identificador. A apresentação de cada obra
deve ser feita como descrito em §3.1.1. O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e
minúsculas) com os campos relevantes de cada obra: para DVDs, o realizador e o tı́tulo; para livros, o autor e o tı́tulo. Só devem
ser apresentadas obras que contenham o termo de pesquisa num dos campos relevantes. Assim, considerando as quatro obras
abaixo, uma pesquisa pelo termo casa retornaria as obras com os identificadores 3, 4 e 5.
3
4
5
6
-
Livro
DVD Livro
Livro
- Casa Azul - Joao Fonseca - 15 - Ficcao - 1234567891
Casamento Real - Antonio Fonseca - 8 - Ficcao - 200400500
- Dicionario - Pedro Casanova - 45 - Referencia - 1234567893
- Enciclopedia - Ze Fonseca - 100 - Tecnica e Cientifica - 1234567894
Caso não sejam encontradas obras, não deve ser produzido qualquer resultado.
3
3.2 Menu Requisições
O menu de requisições permite requisitar e devolver obras e regressar ao menu principal (as etiquetas das opções deste menu
estão definidas em mediateca.mensagens.Menu).
3.2.1 Requisitar uma Obra
No processo de requisição de uma obra, o sistema pede, primeiro, a identificação do utente e, de seguida, o identificador da obra
a requisitar. Se o utente não puder requisitar a obra, o bibliotecário deverá ser avisado acerca do motivo (considerando-se as
regras definidas em §2.4), utilizando a seguinte mensagem:
mediateca.mensagens.Utente.violacaoRegra(idUtente, idObra, numeroRegra)
Se a requisição não for possı́vel por falta de exemplares (violação da regra 1), deve-se perguntar ao utilizador, utilizando a
mensagem mediateca.mensagens.Utente.desejaAvisoDevolucao(), se deseja ser notificado da devolução.
Utiliza-se a mensagem mediateca.mensagens.Obra.devolucaoDia(idObra, numeroDias) para comunicar o prazo de
devolução, em caso de requisição bem sucedida.
3.2.2 Devolver uma Obra
No processo de devolução de uma obra, o sistema pede, primeiro, o identificador do utente e, de seguida, o da obra a devolver.
Se a obra não tiver sido requisitada pelo utente indicado, deve-se lançar uma excepção ObraNaoRequisitada. Caso contrário,
o sistema processa a entrega e o bibliotecário é notificado, caso haja lugar ao pagamento de multa, através da mensagem
mediateca.mensagens.Obra.apresentarMulta(idUtente, euros).
O utente pode entregar uma obra sem pagar a multa, continuando suspenso até regularizar a situação, sem prejuı́zo da obra ser
assinalada como entregue. Antes liquidar a multa, o sistema interroga o utilizador sobre o desejo de pagamento, através da
mensagem mediateca.mensagens.Obra.desejaPagarMulta(). Se a resposta for positiva, a multa é liquidada e o utente
fica activo.
3.3 Menu Utentes
Este menu permite gerir os utentes (criar, listar e saldar multas) da mediateca. Dispõe de uma opção para voltar ao menu principal
(as etiquetas das opções deste menu estão definidas em mediateca.mensagens.Menu).
3.3.1 Criar Utente
Na criação de utentes, o sistema pede o nome e endereço de correio electrónico do novo utente (respectivamente, através das
mensagens mediateca.mensagens.Utente.pedidoDeNome() e mediateca.mensagens.Utente.pedidoDeEmail()).
O sistema assinala o registo do novo utente através da mensagem mediateca.mensagens.Utente.criado(idUtente) (em
que idUtente é o identificador do novo utente).
3.3.2 Listar Utentes
Esta opção mostra a lista de todos os utentes, ordenados por ordem crescente do seu nome. Caso haja mais do que um utente com
o mesmo nome, será listado primeiro o utente com menor número identificador. Cada utente deverá ser listado como indicado de
seguida, respectivamente, para utentes activos e suspensos. A multa a apresentar, para utentes suspensos, é um valor inteiro.
id - nome - email - ACTIVO
id - nome - email - SUSPENSO - EUR valorMultaAPagar
Por exemplo:
2 - Alberto Meireles - [email protected] - ACTIVO
1 - Fernando Meireles - [email protected] - SUSPENSO - EUR 10
3 - Fernando Meireles - [email protected] - ACTIVO
4
3.3.3 Saldar Multa
Esta opção permite que um utente salde uma multa. Para tal, o sistema pede ao bibliotecário o identificador do utente. Se o utente
estiver suspenso, a multa é saldada e o utente passa a poder requisitar obras, de acordo com as regras gerais (ver §2). Se o utente
não estiver suspenso (i.e., não tem multas por saldar), deve lançar-se uma excepção UtenteActivo.
3.4 Ver e Avançar Data
A data actual do sistema é apresentada através da mensagem mediateca.mensagens.Data.actual(dataActual).
Para avançar a data do sistema, utiliza-se mediateca.mensagens.Data.pedidoDeDias() para pedir ao bibliotecário que
indique o número de dias a adicionar à data actual. Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos
que dela dependam, designadamente, a situação dos utentes.
4 Notiao~es
Para proceder a notificações, invoca-se o método enviar da classe CorreioElectronico.
Deve ser possı́vel definir novas entidades a avisar em caso de devolução de obras (e.g. bibliotecários que estejam interessados no
empréstimo, ou editoras interessadas em determinar perfis de leitura) com impacto mı́nimo na implementação desenvolvida. A
mensagem e a forma de envio dependem da entidade em causa: deve ser possı́vel acrescentar novas formas de aviso (e.g. SMS)
com um mı́nimo de alterações.
5 Iniializa~ao e Persist^enia
As obras da mediateca são inicialmente lidas de um ficheiro, segundo o formato abaixo, respectivamente, para DVDs e livros
(a categoria de uma obra é um número, tal como descrito em §2.2). Assume-se que os tı́tulos das obras não podem conter o
carácter : e que o preço é um inteiro (sugere-se a utilização do método split da classe String). Não há entradas mal-formadas
e entradas repetidas (linhas iguais) ao longo do ficheiro (independentemente de serem consecutivas ou não) correspondem a
múltiplos exemplares da mesma obra.
DVD:tituloDVD:realizadorDVD:preco:categoria:numeroIGAC
Livro:tituloLivro:autorLivro:preco:categoria:ISBN
Um exemplo de conteúdo do ficheiro inicial é como se segue:
DVD:Era uma vez na Amadora:Fernando Fonseca:20:2:200505550
DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551
Livro:A arte de sobreviver no 36:Joao Fonseca:20:2:1234567892
Livro:Bairro Alto e o Budismo Zen:Zun Tse Fonseca:20:2:1234567891
DVD:48 Horas para o Exame:Orlando Fonseca:12:2:200505553
Livro:Analise Matematica sem Mestre:Carlos Fonseca:20:2:1234567890
DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551
DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551
Execuções subsequentes do sistema já não utilizam o ficheiro inicial: os dados das obras carregadas na execução inicial deverão
ser mantidos persistentemente usando a serialização do Java. Além da informação sobre as obras, os dados respeitantes aos
utentes, requisições, histórico (devoluções efectuadas) e data do sistema deverão também ser mantidos persistentemente. Os
ficheiros de serialização são definidos por duas propriedades: estadoEntrada (ficheiro para leitura dos dados serializados) e
estadoSaida (ficheiro para escrita dos dados serializados).
6 Considerao~es
6.1 Introdução de Modificações
Este projecto deve ser implementado de forma a possibilitar um conjunto de futuras extensões ou alterações de funcionalidade
com um esforço mı́nimo de alteração do código pré-existente. Assim, deverá ser simples:
5
• Adicionar novos tipos (e.g., CDs ou VHS) e novas categorias de obras;
• Definir novas entidades que desejem ser notificadas da requisição ou devolução de obras;
• Introduzir alterações nas regras para requisição de obras ou nos prazos de requisição permitidos;
• Permitir novas classificações para os utentes, para além de faltoso, cumpridor ou normal.
6.2 Excepções
Note-se que, além das excepções descritas, é possı́vel a definição de outras. As novas excepções não devem, no entanto, substituir
as fornecidas nos casos descritos por este enunciado. Por exemplo, a excepção a lançar quando não se encontra um utente é
UtenteInexistente e não outra qualquer.
6.3 Identificação de Autoria
Todas as classes implementadas devem possuir o método obtemAutoria, tal como habitualmente definido nos exercı́cios de
avaliação. A ausência deste método conduz a uma penalização de 100%.
6.4 Execução
Usando o ficheiro de obras obras.txt e os ficheiros ENTRADA.dat e SAIDA.dat (a disponibilizar) é possı́vel verificar automaticamente se o programa produz o resultado esperado para o exemplo. Em Unix, e supondo que os ficheiros ENTRADA.dat e
SAIDA.dat estão no mesmo directório que o pacote mediateca, se for dado o comando abaixo, deve ser produzido um ficheiro
de saı́da, chamado SAIDA1.dat, que deve ser igual ao ficheiro SAIDA.dat (o ponto de entrada da aplicação a desenvolver é o
método main da classe mediateca.Mediateca).
java -Dobras=obras.txt -DentradaDados=ENTRADA.dat -DsaidaDados=SAIDA1.dat mediateca.Mediateca
Os ficheiros podem ser comparados com o comando diff -b SAIDA.dat SAIDA1.dat. Se forem iguais, este comando não
deve produzir qualquer resultado. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido,
apenas verificando algumas funcionalidades.
Após obter as classes que obedeçam às especificações fornecidas, crie um arquivo, denominado PROJ.jar, contendo apenas os
ficheiros source (.java) de todas as classes concretizadas. O ficheiro PROJ.jar deve ser submetido para avaliação através da
ligação apresentada no Fénix (utilizar a autenticação Fénix). São possı́veis múltiplas submissões até à data limite de entrega, mas
será avaliada apenas a última versão.
Não serão consideradas quaisquer alterações aos ficheiros disponibilizados: eventuais submissões desses ficheiros serão automaticamente substituı́das durante a avaliação da funcionalidade do código submetido.
6.5 Erratas
Correções a este enunciado esteja sujeito serão devidamente anunciadas na página da disciplina e documentadas na secção
Projecto.
7 Funionalidades neessarias para ada entrega
A entrega intermédia pressupõe a definição de um diagrama UML com as classes da solução final, a correcta execução do
processamento inicial das obras a partir do ficheiro de entrada, e a funcionalidade de procura e listagem de obras. Todos os
menus devem estar implementados. Deve ser implementada uma classe de teste que verifica a se a procura de obras funciona
correctamente.
A entrega final pressupõe a correcta execução da restante funcionalidade, assim como a apresentação da versão final do diagrama
UML.
6
7.1 Aspectos avaliados
Os seguintes pontos influenciam a avaliação do projecto:
• Avaliação intercalar: funcionalidade, correcta aplicação dos conceitos de programação com objectos (máximo: 4 valores).
Esta nota é comunicada pelo docente das aulas práticas na primeira aula prática depois da data limite da entrega intermédia;
• Correcta aplicação de padrões de desenho (máximo 4: valores);
• Correcta aplicação de conceitos de programação com objectos (máximo: 6 valores);
• Correcto funcionamento do programa (máximo 6 valores, a atribuir automaticamente através da execução de uma bateria
de testes). É essencial que o código compile correctamente com as classes disponibilizadas. Quando submeter o trabalho,
não serão executados testes de avaliação;
• Se algum teste falhar, devido a não ter seguido a ordem na inserção de dados, especificada no ponto “Funcionalidade
máxima da mediateca”, será atribuı́da a cotação de zero valores nesse teste.
7.2 Penalizações
Alertam-se os alunos para as possı́veis penalizações abaixo descritas.
• Qualidade dos comentários que acompanham classes e métodos alterados ou introduzidos para a resolução deste exercı́cio
de programação: só é considerado o material correspondente à codificação da funcionalidade exigida para a entrega intercalar (máximo: 2 valores).
• A não utilização da classe pt.utl.ist.po.ui.InteraccaoUtilizador conduz a uma classificação de 0 (zero) valores.
• A não definição do método obtemAutoria conduz a uma classificação de 0 (zero) valores.
• O uso de System.exit(), Runtime.getRuntime().exit() ou qualquer outro tipo de exit(), bem como o tratamento indiscriminado de excepções, e.g. uso de catch(Exception e) (ou hierarquicamente superiores) conduz a uma
classificação de 0 (zero) valores.
• A entrega de código não compilável conduz a uma classificação de 0 (zero) valores, na avaliação da funcionalidade do
módulo correspondente. Não serão aceites quaisquer justificações.
• O não cumprimento das convenções de codificação em Java implica uma penalização de 25%.
• A entrega de ficheiros adicionais descrevendo o código conduz a uma classificação de 0 (zero) valores (toda a documentação,
exceptuando diagramas UML, deve fazer parte dos comentários Javadoc).
• A entrega fora do prazo corresponde à não avaliação do exercı́cio de programação, ou seja, conduz a uma classificação
de 0 (zero) valores. A indisponibilidade temporária da página de submissão, desde que inferior a 24 horas, não justifica
atrasos na submissão de um trabalho. Sugere-se que os alunos verifiquem, com antecedência, os requisitos exigidos pelo
processo de submissão.
• A submissão de um ficheiro pressupõe o compromisso de honra que o trabalho incluso foi realizado pelos alunos referenciados nos ficheiros submetidos para avaliação. A quebra deste compromisso, ou seja a tentativa de um grupo se apropriar
de trabalho realizado por colegas, tem como consequência a reprovação de todos os alunos envolvidos (incluindo os que
possibilitaram a ocorrência) neste ano lectivo.
7
Download

Gest˜ao de Mediateca