Trabalho Final

Sumário

Objectivos

O Trabalho Final da disciplina de Programação Orientada para Objectos consiste no desenvolvimento de uma aplicação para gestão de uma biblioteca.  O trabalho encontra-se dividido em duas fases.  A primeira fase destina-se a motivar os alunos para que ataquem o problema e se esboce o projecto de solução o mais cedo possível.  Assim, pretende-se que se especifique e implemente um programa para gestão de itens relativos a uma biblioteca.  Este programa deve comportar os seguintes aspectos:

Passados em revista os aspectos gerais sobre os componentes a representar, indica-se pormenorizadamente a informação a representar pelo programa:

Interface com o utilizador

A interface será muito simples, recorrendo simplesmente a linhas de comandos (usando-se para isso os canais cin e cout).  Não pode ser usado qualquer outro tipo de interacção, pois impedirá o teste sistemático dos programas desenvolvidos.

Em vez de se descrever a interface completa, optou-se por disponibilizar uma versão oficial do programa.  Os alunos devem testá-lo e emular a sua interface.  Ou seja, os programas a desenvolver deverão ter exactamente a mesma interface do programa oficial.

2.1  Exemplo de interacção com o utilizador

Lista-se abaixo um exemplo simples de interacção do programa com o utilizador.  A negrito apresentam-se as entradas do utilizador.

rdmr@mercurio ~> gestor_de_biblioteca_oficial -h

  Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>

Uso: gestor_de_biblioteca_oficial [ficheiro_dos_utilizadores ficheiro_das_publicações]

rdmr@mercurio ~> gestor_de_biblioteca_oficial 

  Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
--------------------------------------------------
Utilizador: admin
--------------------------------------------------

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 1

*** Gestão de utilizadores ***

1 - Adiciona utilizador
2 - Remove utilizador
3 - Altera tipo de utilizador
4 - Consulta dados de utilizador
5 - Mostra utilizadores

0 - Menu anterior

Opção: 1

*** Adiciona utilizador ***

Nome do utilizador: mz
Nome completo: Manel Zé
Tipo de utilizador: normal

*** Gestão de utilizadores ***

1 - Adiciona utilizador
2 - Remove utilizador
3 - Altera tipo de utilizador
4 - Consulta dados de utilizador
5 - Mostra utilizadores

0 - Menu anterior

Opção: 5

*** Mostra utilizadores ***

Nome do utilizador: admin
Nome completo: Administrador por omissão
Tipo: administrador

Nome do utilizador: mz
Nome completo: Manel Zé
Tipo: normal

*** Gestão de utilizadores ***

1 - Adiciona utilizador
2 - Remove utilizador
3 - Altera tipo de utilizador
4 - Consulta dados de utilizador
5 - Mostra utilizadores

0 - Menu anterior

Opção: 0

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 2

*** Adiciona publicação ***

1 - Livro
2 - Colecção
3 - Revista
4 - Jornal

0 - Voltar ao menu anterior

Opção: 1

*** Adiciona livro ***

Título: Data Structures and Other Objects Using C++
Ano: 1997
Editora: Addison-Wesley
ISBN: 0-8053-7470-1
Autores (para terminar introduza um .): 
--> Michael Main
--> Walter Savitch
--> .

1 - Livro
2 - Colecção
3 - Revista
4 - Jornal

0 - Voltar ao menu anterior

Opção: 0

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 4

*** Consultas ***

Título ou parte: Struct

Foi encontrada a seguinte publicação: 

Título: Data Structures and Other Objects Using C++
Ano: 1997
Editora: Addison-Wesley
ISBN: 0-8053-7470-1
Autor(es): 
   Michael Main
   Walter Savitch

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 5

*** Listagens de publicações ***

1 - Por ano
2 - Por tipo de publicação
3 - Por autor
4 - Por autor entre dois anos

0 - Menu anterior

Opção: 1

Ano: 2000
Não foram encontradas publicações.

*** Listagens de publicações ***

1 - Por ano
2 - Por tipo de publicação
3 - Por autor
4 - Por autor entre dois anos

0 - Menu anterior

Opção: 2

Tipo: livro
Data Structures and Other Objects Using C++ 1997 livro

*** Listagens de publicações ***

1 - Por ano
2 - Por tipo de publicação
3 - Por autor
4 - Por autor entre dois anos

0 - Menu anterior

Opção: 0

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 6

Pretende guardar a informação da biblioteca (s/n)?
--> s
O nome do ficheiro dos utilizadores é utilizadores.dat.
Pretende usar outro (s/n)?
--> n
O nome do ficheiro das publicações é publicacoes.dat.
Pretende usar outro (s/n)?
--> n
Sessão encerrada.

--------------------------------------------------
Utilizador: mz
--------------------------------------------------

*** Biblioteca ***

1 - Consulta publicação
2 - Listagens

3 - Terminar sessão
4 - Sair

Opção: 2

*** Listagens de publicações ***

1 - Por ano
2 - Por tipo de publicação
3 - Por autor
4 - Por autor entre dois anos

0 - Menu anterior

Opção: 1

Ano: 1997
Data Structures and Other Objects Using C++ 1997 livro

*** Listagens de publicações ***

1 - Por ano
2 - Por tipo de publicação
3 - Por autor
4 - Por autor entre dois anos

0 - Menu anterior

Opção: 0

*** Biblioteca ***

1 - Consulta publicação
2 - Listagens

3 - Terminar sessão
4 - Sair

Opção: 4

Até breve!

rdmr@mercurio ~> gestor_de_biblioteca_oficial utilizadores.dat publicacoes.dat

  Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
--------------------------------------------------
Utilizador: admin
--------------------------------------------------

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 2

*** Adiciona publicação ***

1 - Livro
2 - Colecção
3 - Revista
4 - Jornal

0 - Voltar ao menu anterior

Opção: 4

*** Adiciona jornal ***

Título: Expresso
Ano: 2003
Periodicidade: semanal
Número: 1591
ISSN: 0-1234-5678-9
Director: José António Saraiva

1 - Livro
2 - Colecção
3 - Revista
4 - Jornal

0 - Voltar ao menu anterior

Opção: 0

*** Biblioteca ***

1 - Gestão de utilizadores

2 - Adicionar publicação
3 - Remover publicação

4 - Consulta publicação
5 - Listagens

6 - Terminar sessão
7 - Sair

Opção: 6

Pretende guardar a informação da biblioteca (s/n)?
--> s
O nome do ficheiro dos utilizadores é utilizadores.dat.
Pretende usar outro (s/n)?
--> n
O nome do ficheiro das publicações é publicacoes.dat.
Pretende usar outro (s/n)?
--> n
Sessão encerrada.

--------------------------------------------------
Utilizador: mz
--------------------------------------------------

*** Biblioteca ***

1 - Consulta publicação
2 - Listagens

3 - Terminar sessão
4 - Sair

Opção: 1

*** Consultas ***

Título ou parte: Expresso

Foi encontrada a seguinte publicação: 

Título: Expresso
Ano: 2003
Periodicidade: semanal
Número: 1591
ISSN: 0-1234-5678-9
Director: José António Saraiva

*** Biblioteca ***

1 - Consulta publicação
2 - Listagens

3 - Terminar sessão
4 - Sair

Opção: 4

Até breve!

Fases do trabalho

O trabalho divide-se em duas fases, correspondendo o final da primeira à entrega intermédia prevista nos métodos de avaliação da disciplina.  A segunda fase corresponde à entrega definitiva.

3.1  Entrega intermédia

Corresponde a:

A interface do programa desenvolvido de ser exactamente igual à fornecida pela resolução oficial, embora fornecendo ainda um subconjunto das suas funcionalidades.

3.2  Entrega definitiva

Corresponde ao programa completo.  Note-se que:

É obrigatória a utilização de uma interface com o programa exactamente igual à fornecida pela resolução oficial, disponível através do comando gestor_de_biblioteca_oficial disponível na máquina mercurio, no directório /usr/local/bin/.  No mesmo directório encontrarão dois ficheiros utilizadores.dat e publicacoes.dat que contêm exemplos de dados relativos aos utilizadores e publicações que o programa deverá ser capaz de ler.  O formato dos ficheiros encontra-se descrito na Secção 4.

Formato dos ficheiros

O formato dos ficheiros de utilizadores e publicações é simples.  Na descrição abaixo considere todo o texto após e incluindo o símbolo '%' como sendo comentários, que não deverão surgir num ficheiro real.

Ficheiro de utilizadores:

2 % número de utilizadores
admin % nome do utilizador
Administrador por omissão % nome completo do utilizador
administrador % tipo do utilizador
mz % nome do utilizador
Manel Zé % nome completo do utilizador
normal % tipo do utilizador

Ficheiro de publicações:

5 % número de publicações
livro % tipo da publicação
Data Structures and Other Objects Using C++ % título da publicação
1997 % ano da publicação
Addison-Wesley % editora do livro
0-8053-7470-1 % ISBN
2 % número de autores
Michael Main % primeiro autor
Walter Savitch % segundo autor
jornal % tipo da publicação
Expresso % título da publicação
2003 % ano da publicação
semanal % periodicidade da publicação periódica
1591 % número da publicação periódica
0-1234-5678-9 % ISSN
José António Saraiva % director do jornal
livro % tipo da publicação
Diário de Anne Frank % título da publicação
2000 % ano da publicação
Livros do Brasil % editora do livro
0-9876-5432-1 % ISBN
1 % número de autores
Anne Frank % primeiro autor
colecção % tipo da publicação
Dois mundos % título da publicação
2000 % ano da publicação
Amândio Nicolau % editor da colecção
1 % número de livros
0-9876-5432-1 % ISBN do primeiro livro
revista % tipo da publicação
Turbo % título da publicação
2003 % ano da publicação
mensal % periodicidade da publicação periódica
67 % número da publicação periódica
0-2345-9876-1 % ISSN
1 % número de artigos
Os bloqueadores nos dias de hoje % título do artigo
Chico Camionista % autor

Note-se que os livros de uma colecção são indicados logo após a colecção, mas fazem também parte da lista de publicações global da biblioteca.

Dicas

Esta secção irá crescendo com outras dicas.  Mantenha-se atento.

Requisitos de implementação

  1. A resolução deste problema deverá recorrer a classes C++, a modularização física, e a pacotes (espaços nominativos) sempre que apropriado. (1ª e 2ª fases)
  2. Deverão existir as classes Biblioteca, Utilizador e GestorDeBiblioteca.(1ª e 2ª fases)
  3. Deve existir uma hierarquia de classes para representar as publicações da biblioteca. (1ª fase: definição das classes e embrião da implementação; 2ª fase: implementação completa)
  4. A hierarquia deve fazer uso de polimorfismo. (2ª fase)
  5. Deve-se evitar ao máximo todas as situações em que seja necessário saber o tipo concreto do objecto apontado por um ponteiro cujo tipo seja de uma classe base numa hierarquia.  Ou seja, deve-se evitar ao máximo código que exija conhecimento acerca do tipo dinâmico de objectos polimórficos. (2ª fase)
  6. O gestor de biblioteca deverá ser resistente a todo o tipo de erros (comandos inexistentes, ficheiros de entrada inválidos ou inexistentes, etc.).  Em circunstância alguma deve o programa simplesmente abortar! (1ª e 2ª fases)
  7. Todas as rotinas, operações e métodos devem ser claramente documentados, nomeadamente quando a pré-condição (PC) e condição objectivo (CO).  As condições invariantes das classes (CIC) devem ser identificadas. (1ª e 2ª fases)
  8. Devem-se usar asserções para verificar estas condições (PC, CO e CIC) no código. (1ª e 2ª fases)
  9. Erros em recursos externos (e.g., ficheiros) devem ser assinalados através do lançamento de excepções.  Todas as excepções lançadas devem ser capturadas. (1ª e 2ª fases)
  10. Todas as classes que representem conceitos que se pretende preservar entre edições sucessivas devem possuir o trio de operações constituído por: (a) um construtor a partir de um canal de entrada, uma operação carregaDe() que carrega nova informação a partir de um canal de entrada, e uma operação guardaEm() que guarda num canal de saída toda a informação.  Ver Notas sobre leitura e escrita em ficheiros. (1ª fase: definição embrionária; 2ª fase: definição completa)
  11. Todas as ferramentas do programa relativas à representação da biblioteca e sua informação devem ser colocadas num pacote à parte, representado por um espaço nominativo próprio. (1ª e 2ª fases)
  12. O formato exacto dos ficheiros de texto onde os documentos são guardados é o indicado na secção apropriada acima. (1ª e 2ª fases)
  13. O código deve fornecer a máxima garantia de segurança face a excepções que for possível.

Condições de entrega e avaliação

7.1  Condições de entrega

  1. Resolvido em grupo, mantendo-se os mesmos grupos do Problema
  2. As resoluções (intermédia e definitiva) consideram-se entregues depois de:
    1. ser entregue pessoalmente a um dos docentes da disciplina uma disquete, devidamente identificada, contendo apenas os ficheiros fonte onde se encontra o código C++ (extensões .C, ._impl.H e .H) e o respectivo ficheiro de construção (Makefile);
    2. ser entregue pessoalmente a um dos docentes da disciplina um relatório em papel, usando o modelo publicado para os problemas (Word, ou RTF) e contendo obrigatoriamente a listagem de todos os ficheiros colocados na disquete bem como um pequeno texto de no máximo uma página A4 explicando as opções tomadas para a resolução e apresentando os diagramas UML apropriados; e
    3. serem enviados todos os ficheiros colocados na disquete via correio electrónico para Ricardo.Ribeiro@iscte.pt.
  3. Imprima o código em C++ sempre de uma forma bem legível: use sempre um tipo não proporcional (e.g., Courier) e, caso seja possível fazê-lo, imprima em papel reciclado, frente-e-verso.
  4. A mensagem de correio electrónico deve ser claramente identificada no seu corpo (número do grupo e constituição).
  5. A não observação destas regras poderá ser penalizada.

7.1.1  Entrega intermédia

  1. Resolução entregue pessoalmente a um dos docentes da disciplina até as 18:30h de sexta-feira, 23 de Maio de 2003.
  2. A mensagem de correio electrónico deve ter como assunto TFInn, em que nn é o número do grupo.
  3. Não se aceitam entregas de resoluções fora do prazo.
  4. Exija ao docente a entrega de um recibo comprovativo da entrega intermédia do Trabalho Final.  Este recibo é a única prova que tem da sua entrega.
  5. Recorda-se que o a avaliação da entrega intermédia resultará apenas nas categorias aprovado/reprovado, sendo os grupos reprovados penalizados em três (3) valores na nota do Trabalho Final.  Para obter aprovação os alunos deverão demonstrar ter-se esforçado minimamente na resolução do trabalho.

7.1.2  Entrega definitiva

  1. Resolução entregue pessoalmente a um dos docentes da disciplina até as 18:30h de quinta-feira, 12 de Junho de 2003 (até as 18:30h de quarta-feira, 18 de Junho de 2003, com penalizações).
  2. Entrega fora do prazo implica penalização de dois (2) valores por cada dia útil de atraso (i.e., 16 de Junho -2 valores, 17 de Junho -4 valores e 18 de Junho -6 valores) não se aceitando trabalhos após quarta-feira, 18 de Junho de 2003, até as 18:30h.
  3. A mensagem de correio electrónico deve ter como assunto TFDnn, em que nn é o número do grupo.
  4. Exija ao docente a entrega de um recibo comprovativo da entrega definitiva do Trabalho Final.  Este recibo é a única prova que tem da sua entrega.

As datas das discussões orais e respectivas inscrições serão anunciadas logo que possível.

7.2  Avaliação

A avaliação do Trabalho Final terá em conta não só a correcta execução do programa, mas também, e principalmente, a correcta estruturação das classes e métodos  e das rotinas que compõem o programa e ainda a sua legibilidade.  Valorizar-se-á mais a simplicidade que a eficiência.  Valorizar-se-á também código C++ correctamente comentado (mas não excessivamente, não vale a pena comentar o óbvio).  Valorizar-se-á ainda a utilização de instruções de asserção apropriadas para verificar os contratos das operações e os invariantes das classes, que deverão ser indicados claramente através de comentários de documentação.

A nota deste trabalho será dada apenas após uma discussão, individual, com cada um dos elementos do grupo. Nesta discussão qualquer elemento do grupo terá de demonstrar um total conhecimento do programa e ser capaz de operar as alterações que forem pedidas.  Nessa oral poderão também ser feitas perguntas sobre a matéria em geral.  A nota final poderá depender não só da qualidade do trabalho, mas também, e principalmente, da avaliação que os docentes façam da participação relativa dos alunos na feitura do trabalho.

Quaisquer funcionalidades extra que não tenham sido pedidas no enunciado, tais como menus mais sofisticados etc., não serão avaliadas.