Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2019-2020 (rascunho 2501): Difference between revisions
From Wiki**3
| Line 84: | Line 84: | ||
= Funcionalidade da aplicação = | = Funcionalidade da aplicação = | ||
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir | A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir utentes, obras e empréstimos. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo). | ||
A base de dados com os conceitos pré-definidos é [[#Leitura de Dados a Partir de Ficheiros Textuais|carregada no início da aplicação]]. Não é possível | A base de dados com os conceitos pré-definidos é [[#Leitura de Dados a Partir de Ficheiros Textuais|carregada no início da aplicação]]. Não é possível remover utentes ou obras durante a execução da aplicação. | ||
{{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da funcionalidade do ''core'' da aplicação, tal como é visível pelos comandos da aplicação.}} | {{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da funcionalidade do ''core'' da aplicação, tal como é visível pelos comandos da aplicação.}} | ||
{{CVSCode|A interface geral do ''core'' já está parcialmente implementada na classe ''' | {{CVSCode|A interface geral do ''core'' já está parcialmente implementada na classe '''m19.LibraryManager''' e outras fornecidas (cujos nomes devem ser mantidos), devendo ser adaptadas onde necessário. É ainda necessário criar e implementar as restantes classes que suportam a operação da aplicação.}} | ||
== Gestão de informação sobre pessoas == | == Gestão de informação sobre pessoas == | ||
Revision as of 15:33, 11 January 2019
| AVISOS - Avaliação em Época Normal |
|---|
|
Esclarecimento de dúvidas:
|
|
Requisitos para desenvolvimento, material de apoio e actualizações do enunciado (ver informação completa em Projecto de Programação com Objectos):
|
|
Processo de avaliação (ver informação completa em Avaliação do Projecto):
|
| Material de Uso Obrigatório |
|---|
| As bibliotecas po-uuilib e o conteúdo inicial do CVS são de uso obrigatório: |
|
| A máquina virtual, fornecida para desenvolvimento do projecto, já contém todo o material de apoio. |
| Uso Obrigatório: Repositório CVS |
| Apenas se consideram para avaliação os projectos existentes no repositório CVS oficial.
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. |
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 sistema deverá permitir, entre outras operações, (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.
Neste texto, o tipo negrito indica um literal (i.e., é exactamente como apresentado); o símbolo <amsmath>\verb*| |</amsmath> indica um espaço; e o tipo itálico indica uma parte variável (i.e., uma descrição).
Conceitos e Relações do Modelo
Existem vários conceitos importantes neste contexto: obras e suas categorias, utentes, requisições e tempo.
Os conceitos listados não são os únicos possíveis no modelo e as suas relações (assim como relações com outros conceitos não mencionados) podem depender das escolhas do projecto.
Obras e Categorias
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 (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.
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.
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.
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:
- Não pode requisitar obras um utente que esteja suspenso;
- Não pode requisitar obras cujos exemplares tenham sido j´a todos requisitados;
- Não pode ter mais que n obras requisitadas em cada momento (valor base: 3; utentes cumpridores: 5; utentes faltosos: 1);
- Não pode requisitar obras de referência;
- Não pode requisitar obras com um preço superior a €25,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.
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 €5,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.
Pesquisas
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. Deve ser possível introduzir novos métodos de pesquisa de uma obra com um impacto mínimo na implementação desenvolvida.
Gestão de 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. Sempre que a data é alterada, deve ser verificada a situação dos utentes.
Notificações
Deve existir um mecanismo de mensagens que permita avisar eventuais interessados quando as obras ficam em determinadas situações:
- Quando uma obra é emprestada, quer-se enviar uma mensagem a todos as entidades que demonstraram interesse nessa operação.
- Quando uma obra é devolvida, quer-se enviar uma mensagem a todos as entidades que demonstraram interesse nessa operação.
A apresentação das mensagens enviadas para um dado utilizador deve ser feita quando se visualiza o utilizador (ver abaixo). Quando se faz a visualização, são anexadas à descrição do utilizador (no final) todas as notificações recebidas. Após esta visualização, considera-se que o utilizador fica sem mensagens. As mensagens devem ser apresentadas pela mesma ordem em que foram enviadas pelo sistema.
Requisitos de Desenho
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim:
- 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.
Funcionalidade da aplicação
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir utentes, obras e empréstimos. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).
A base de dados com os conceitos pré-definidos é carregada no início da aplicação. Não é possível remover utentes ou obras durante a execução da aplicação.
Gestão de informação sobre pessoas
Um utilizador registado pode ver todos os utilizadores ou só um dado utilizador, procurar um utilizador e actualizar o seu número de telefone.
Gestão de actividades dos alunos
Um utilizador registado que seja aluno pode realizar as seguintes tarefas: entregar um projecto, preencher um inquérito e ver resultados de um inquérito.
Gestão de actividades dos delegados
Um utilizador registado que seja delegado tem à sua disposição as seguinte funcionalidade: criar inquéritos, apagar inquéritos, abrir inquéritos, fechar inquéritos, finalizar inquéritos e ver os resultados de inquéritos.
Gestão de actividades dos professores
Um utilizador registado que seja um docente pode realizar as seguintes actividades: criar projectos, fechar projectos, ver as submissões de um projecto, ver os alunos de uma disciplina leccionada e ver resultados de inquéritos.
Serialização
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relacionada com a universidade e que foi descrita acima.
Interacção com o utilizador
Descreve-se nesta secção a funcionalidade máxima da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de proceder à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção Sair (fecha o menu).
As operações de pedido e apresentação de informação ao utilizador devem realizar-se através dos objectos form e display, respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das bibliotecas de suporte (po-uuilib e sth-app). As mensagens não podem ser usadas no núcleo da aplicação (sth-core). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.
As excepções usadas na interacção, excepto se indicado, são subclasses de pt.tecnico.po.ui.DialogException, são lançadas pelos comandos e tratadas por pt.tecnico.po.ui.Menu. Outras excepções não devem substituir as fornecidas nos casos descritos.
Início da aplicação: estabelecimento da identidade do utilizador
Antes de iniciar o menu principal, a aplicação deve primeiro registar o utilizador. Assim, pede-se o identificador do utilizador a registar (requestPersonId()}. Se o identificador não corresponder a um utilizador conhecido, a aplicação termina. Caso contrário, o menu principal é aberto.
Note-se que nesta fase, não existem nunca notificações para apresentar, já que não é possível recuperar aqui nenhum estado anterior.
Menu Principal
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: Abrir, Guardar e Portal Pessoal, Portal do Docente, Portal do Estudante e Portal do Delegado. Inicialmente, a aplicação apenas tem informação sobre as pessoas, cursos e disciplinas que foram carregados no arranque. Note-se que nem todas as opções do menu estão disponíveis para todos os utilizadores (ver abaixo).
As etiquetas das opções deste menu estão definidas na classe sth.app.main.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.main.Message.
Salvaguarda do estado actual da aplicação
O conteúdo da aplicação (toda a informação detida pela universidade actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: java.io.Serializable). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:
- Abrir -- Carrega os dados de uma sessão anterior a partir de um ficheiro previamente guardado (ficando este ficheiro associado à aplicação, para futuras operações de salvaguarda). Pede-se o nome do ficheiro a abrir (openFile()). Caso o ficheiro não exista, é apresentada a mensagem fileNotFound(). Esta opção substitui toda a informação da aplicação. Note-se que quando esta operação é executada, o login actual deve ser revalidado (i.e., o identificador do utilizador deve ser verificado contra o novo conteúdo). Caso o identificador do utilizador actual não exista na informação que está no ficheiro a carregar, a operação falha e deve ser lançada a excepção NoSuchPersonException, não sendo subtituída a informação actual da aplicação. Caso o utilizador exista, são apresentadas as mensagens enviadas para esse utilizador, de acordo com o formato seguinte.
| Formatos de mensagens para o utilizador |
|---|
Pode preencher inquérito do projecto NOME-DO-PROJECTO da disciplina NOME-DA-DISCIPLINA Resultados do inquérito do projecto NOME-DO-PROJECTO da disciplina NOME-DA-DISCIPLINA |
| Exemplo de mensagens para o utilizador |
|---|
Pode preencher inquérito do projecto Gatos Simples da disciplina Programação com Objectos
Resultados do inquérito do projecto Gatos Complexos da disciplina Programação com Objectos
Resultados do inquérito do projecto 1º Projecto da disciplina Fundamentos da Programação
|
- Guardar -- Guarda o estado actual da aplicação no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado. Esta interacção realiza-se através do método newSaveAs(). Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.
Note-se que a opção Abrir não permite a leitura de ficheiros de texto (estes apenas são utilizados na inicialização da aplicação).
A opção Sair nunca guarda o estado da aplicação, mesmo que existam alterações.
Gestão e consulta de dados da aplicação
- Portal Pessoal -- Abre o menu de consulta de informações sobre pessoas.
- Portal do Docente -- Abre o menu de gestão de actividades dos professores (esta opção apenas está disponível para professores).
- Portal do Estudante -- Abre o menu de gestão de actividades dos alunos (esta opção apenas está disponível para alunos).
- Portal do Delegado -- Abre o menu de gestão de actividades dos delegados (esta opção apenas está disponível para delegados).
Portal Pessoal
Este menu permite efectuar operações sobre a base de dados de pessoal da universidade, estando disponível para todos os utilizadores. A lista completa é a seguinte: Mostrar pessoa, Alterar número de telefone, Mostrar pessoas, Procurar pessoa.
As etiquetas das opções deste menu estão definidas na classe sth.app.person.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.person.Message.
Sempre que for pedido o identificador de uma pessoa (requestPersonId()) e a pessoa não existir, é lançada a excepção NoSuchPersonException.
Mostrar pessoa
Apresenta as informações sobre a pessoa especificada pela identificação fornecida pelo processo de login, de acordo com o seguinte formato (e variações descritas abaixo).
| Formato de apresentação (cabeçalho) |
|---|
TIPO|identificador|telefone|nome |
Dependendo do tipo de pessoa, TIPO pode tomar os valores FUNCIONÁRIO, DOCENTE, ALUNO e DELEGADO (para alunos que são delegados). Se os utilizadores forem do tipo DOCENTE, então à linha de identificação devem seguir-se as linhas com os nomes dos cursos e das disciplinas que lecciona nesses cursos, ordenados por ordem alfabética do nome do curso e da disciplina (dentro do curso). Se os utilizadores forem do tipo ALUNO ou DELEGADO, então à linha de identificação devem seguir-se as linhas com os nomes das disciplinas em que está inscrito, ordenados por ordem alfabética do nome da disciplina.
| Exemplo de apresentação (professor) |
|---|
DOCENTE|100050|987654321|Maria João * Informática - Análise e Síntese de Algoritmos * Matemática - Algebra |
| Exemplo de apresentação (aluno) |
|---|
ALUNO|101090|123456789|João Maria * Informática - Análise e Síntese de Algoritmos * Informática - Inteligência Artificial * Informática - Sistemas Operativos * Informática - Fundamentos da Programação * Informática - Programação com Objectos |
Alterar número de telefone
Pede o novo número de telefone (requestPhoneNumber()). De seguida, altera o número de telefone da pessoa registada e apresenta as informações da pessoa (tal como descrito em Mostrar pessoa).
Mostrar pessoas
Apresenta informações sobre todas as pessoas conhecidas.
A lista é ordenada pelo identificador da pessoa e o formato é o descrito em Mostrar pessoa.
Procurar pessoa
Pede o nome da pessoa a procurar (requestPersonName()). A operação apresenta a lista de pessoas (ordenadas por ordem alfabética do nome) cujo nome satisfaz a procura (o nome da pessoa deve conter a cadeia de caracteres em questão). O formato de apresentação é o descrito em Mostrar pessoa.
Portal do Docente
Este menu apresenta as operações disponíveis para docentes, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Criar projecto, Fechar projecto, Ver submissões de um projecto, Ver alunos de disciplina leccionada, Ver resultados de um inquérito.
As etiquetas das opções deste menu estão definidas na classe sth.app.teaching.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.teaching.Message.
Sempre que é pedido o nome da disciplina (requestDisciplineName()), é lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o docente não leccionar a disciplina em causa.
Criar projecto
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção DuplicateProjectException, se o projecto já existir. Em caso de identificação bem sucedida, o projecto é criado.
Fechar projecto
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchProjectException, se o projecto não existir. Em caso de identificação bem sucedida, o projecto é fechado.
Se o projecto já estiver fechado, o comando não executa nenhuma acção.
Ver submissões de um projecto
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchProjectException, se o projecto não existir. Em caso de identificação bem sucedida, as submissões do projecto são apresentadas, ordenadas pelo número de aluno que realizou a submissão, e com o seguinte formato.
| Formato de apresentação |
|---|
Nome da Disciplina - Nome do Projecto * Identificador do 1º aluno - submissão do 1º aluno ... * Identificador do Nº aluno - submissão do Nº aluno |
| Exemplo de apresentação |
|---|
Programação com Objectos - Gatos Simples
* 0234 - Gato.java
* 6789 - Cat.java
* 7912 - Tigre.java
|
Este comando pode operar, tanto sobre projectos abertos, como sobre projectos fechados.
Ver alunos de disciplina leccionada
É pedido o nome da disciplina. Em caso de identificação bem sucedida, é apresentada a lista de alunos, ordenada pelo identificador de aluno, no formato definido em Mostrar pessoa.
Ver resultados de um inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina (requestProjectName()). É lançada a excepção NoSuchProjectException, se o projecto não existir, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, os resultados do inquérito são apresentados de acordo com o formato seguinte.
| Formato de apresentação para inquéritos criados (por abrir) |
|---|
Nome da disciplina - Nome do projecto (por abrir) |
| Formato de apresentação para inquéritos abertos |
|---|
Nome da disciplina - Nome do projecto (aberto) |
| Formato de apresentação para inquéritos fechados |
|---|
Nome da disciplina - Nome do projecto (fechado) |
| Formato de apresentação para inquéritos finalizados |
|---|
Nome da disciplina - Nome do projecto * Número de submissões: Número de submissões * Número de respostas: Número de respostas * Tempos de resolução (horas) (mínimo, médio, máximo): Tempo mínimo de resolução do projecto, Tempo médio de resolução do projecto, Tempo máximo de resolução do projecto |
| Exemplo de apresentação |
|---|
|
Note-se que apenas deve ser apresentado um inquérito (o do projecto especificado). A lista apenas ilustra várias hipóteses. Programação com Objectos - Coisas Estranhas (aberto)
Programação com Objectos - Gatos Simples
* Número de submissões: 30
* Número de respostas: 20
* Tempos de resolução (horas) (mínimo, médio, máximo): 10, 16, 20
Programação com Objectos - Gatos Sofisticados (fechado)
|
Portal do Estudante
Este menu apresenta as operações disponíveis para alunos, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Entregar projecto, Preencher inquérito, Ver resultados de inquérito.
As etiquetas das opções deste menu estão definidas na classe sth.app.student.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.student.Message.
Sempre que é pedido o nome da disciplina (requestDisciplineName()), é lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se o aluno não estiver inscrito. Sempre que é pedido o nome do projecto no contexto dessa disciplina (requestProjectName()), é lançada a excepção NoSuchProjectException, se o projecto não existir.
Entregar projecto
É pedido o nome da disciplina, o nome do projecto no contexto dessa disciplina e o texto relativo à entrega (requestDeliveryMessage()). É lançada a excepção NoSuchProjectException, se o projecto não estiver aberto.
Em caso de identificação bem sucedida, a submissão do projecto é registada.
Preencher inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. De seguida, é pedido o número de horas gasto a realizar o projecto (requestProjectHours()) e o comentário ao projecto (requestComment()), procedendo-se ao registo da resposta ao inquérito.
É lançada a excepção NoSuchProjectException, se o aluno não tiver feito nenhuma submissão, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa ou não estiver aberto.
Ver resultados de inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção NoSuchProjectException, se o aluno não tiver feito nenhuma submissão, e NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa. Em caso de identificação bem sucedida, os resultados do inquérito são apresentados de acordo com o formato seguinte.
Para os inquéritos criados (por abrir), abertos e fechados, o formato de apresentação é como para os docentes.
| Formato de apresentação para inquéritos finalizados |
|---|
Nome da disciplina - Nome do projecto * Número de respostas: Número de respostas * Tempo médio (horas): Tempo médio |
| Exemplos de apresentação |
|---|
|
Note-se que apenas deve ser apresentado um inquérito (o do projecto especificado). A lista apenas ilustra várias hipóteses. Programação com Objectos - Coisas Estranhas (aberto)
Programação com Objectos - Gatos Simples
* Número de respostas: 20
* Tempo médio (horas): 16
Programação com Objectos - Gatos Sofisticados (fechado)
|
Portal do Delegado
Este menu apresenta as operações disponíveis para delegado, estando apenas disponível para estes utilizadores. A lista completa é a seguinte: Criar inquérito, Apagar inquérito, Abrir inquérito, Fechar inquérito, Finalizar inquérito, Mostrar inquéritos de uma disciplina.
As etiquetas das opções deste menu estão definidas na classe sth.app.representative.Label. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe sth.app.representative.Message.
Sempre que é pedido o nome da disciplina (requestDisciplineName()), é lançada a excepção NoSuchDisciplineException, se a disciplina indicada não existir ou se não for do curso do delegado. Sempre que é pedido o nome do projecto no contexto dessa disciplina (requestProjectName()), é lançada a excepção NoSuchProjectException, se o projecto não existir no contexto dessa disciplina.
Criar inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção DuplicateSurveyException, se o inquérito já existir. Em caso de identificação bem sucedida, o novo inquérito é criado. Se o projecto já estiver fechado, é lançada a excepção NoSuchProjectException.
Cancelar inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Se o inquérito estiver aberto e já tiver pelo menos uma resposta, não pode ser removido, devendo ser lançada a excepção NonEmptySurveyException.
Não é possível cancelar inquéritos finalizados, pelo que, neste caso, deve ser lançada a excepção SurveyFinishedException.
Em caso de identificação bem sucedida, a operação é executada.
Abrir inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, o inquérito é aberto. Erros de operação causam o lançamento da excepção OpeningSurveyException.
Fechar inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, o inquérito é fechado. Erros de operação causam o lançamento da excepção ClosingSurveyException.
Finalizar inquérito
É pedido o nome da disciplina e o nome do projecto no contexto dessa disciplina. É lançada a excepção NoSurveyException, se o inquérito não tiver sido criado para o projecto em causa.
Em caso de identificação bem sucedida, o inquérito é finalizado. Erros de operação causam o lançamento da excepção FinishingSurveyException.
Mostrar inquéritos de uma disciplina
É pedido o nome da disciplina. Em caso de identificação bem sucedida, os inquéritos são apresentados de acordo com o formato seguinte, ordenados por ordem alfabética de nome de projecto.
Para os inquéritos criados (por abrir), abertos e fechados, o formato de apresentação é como para os docentes.
| Formato de apresentação para inquéritos finalizados |
|---|
Nome da disciplina - Nome do projecto - Número de respostas respostas - Tempo médio de execução horas |
| Exemplo de apresentação |
|---|
Programação com Objectos - Coisas Estranhas (aberto)
Programação com Objectos - Gatos Simples - 20 respostas - 16 horas
Programação com Objectos - Gatos Sofisticados (fechado)
Programação com Objectos - Mais Gatos - 10 respostas - 2 horas
|
Caso uma disciplina não tenha projectos ou projectos com inquéritos, não deve ser apresentada nenhuma saída.
Leitura de Dados a Partir de Ficheiros Textuais
Além das opções de manipulação de ficheiros descritas no menu principal, é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java import.
Exemplo de ficheiro a importar
Cada utilizador tem uma descrição distinta mas que segue o seguinte formato geral.
TIPO|identificador|telefone|nome
Dependendo do tipo de pessoa, TIPO pode tomar os valores FUNCIONÁRIO, DOCENTE, ALUNO e DELEGADO (para alunos que são delegados).
A seguir à linha da descrição, podem seguir-se outras (iniciadas pelo carácter #) que acrescentam informação adicional para o utilizador em causa. A informação adicional para os alunos (delegados ou não) e para os docentes é uma lista de cursos e disciplinas (uma por linha): para os alunos, são as disciplinas que frequentam; para os docentes, são as disciplinas que leccionam. Para os funcionários, não há informação adicional a processar.
# Nome do curso|Nome da disciplina
| Exemplo de ficheiro de entrada textual |
|---|
FUNCIONÁRIO|100001|123789456|Maria José
DELEGADO|100010|123456789|João Maria
# Informática|Fundamentos da Programação
# Informática|Algoritmos e Estruturas de Dados
# Informática|Programação com Objectos
# Informática|Análise e Síntese de Algoritmos
DELEGADO|100011|123456789|João Manuel
# Informática|Fundamentos da Programação
# Informática|Algoritmos e Estruturas de Dados
# Informática|Programação com Objectos
# Informática|Análise e Síntese de Algoritmos
DELEGADO|100012|123456789|João Miguel
# Matemática|Álgebra Linear
# Matemática|Probabilidades e Estatística
# Matemática|Cálculo I
# Matemática|Métodos Numéricos
ALUNO|100013|123456789|José Manuel
# Matemática|Álgebra Linear
# Matemática|Probabilidades e Estatística
# Matemática|Cálculo I
# Matemática|Métodos Numéricos
DOCENTE|100100|987654321|Ana Maria
# Informática|Análise e Síntese de Algoritmos
# Matemática|Álgebra Linear
FUNCIONÁRIO|101010|789456123|José Carlos
|
A codificação dos ficheiros a ler é garantidamente UTF-8.
Execução dos Programas e Testes Automáticos
Usando os ficheiros test.import, test.in e test.out, é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável CLASSPATH (ou da opção equivalente -cp do comando java), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação (sth.app.App.main). As propriedades são tratadas automaticamente pelo código de apoio.
java -Dimport=test.import -Din=test.in -Dout=test.outhyp sth.app.App
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída test.outhyp. Em caso de sucesso, os ficheiros das saídas esperada (test.out) e obtida (test.outhyp) devem ser iguais. A comparação pode ser feita com o comando:
diff -b test.out test.outhyp
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.
Notas de Implementação
Tal como indicado acima, algumas classes fornecidas como material de apoio, são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.
A serialização Java usa as classes da package java.io, em particular, a interface java.io.Serializable e as classes de leitura java.io.ObjectInputStream e escrita java.io.ObjectOutputStream (entre outras).