Trabalho / Figurinhas

O objetivo deste trabalho é a criação de um software utilizando o paradigma de programação orientado a objetos na linguagem Java.

O trabalho é em equipe de até duas pessoas. O compartilhamento de informações entre as equipes é permitido (e aconselhado), mas o compartilhamento de código não é permitido. Trabalhos que tenham porções significativas de código iguais, ou copiados da internet, serão anulados.

Descrição

Criar um programa de gerenciamento de álbuns de figurinhas. Dois conceitos são fundamentais neste programa: álbum de figurinhas e coleção. Um álbum de figurinhas representa um álbum publicado por uma editora, como por exemplo, o álbum da Copa de 2018. Já uma coleção representa o conjunto de figurinhas que o usuário tem de um determinado álbum. Muitos colecionadores gostam de fazer mais do que uma coleção do mesmo álbum, ou seja, eles compram e preenchem mais de uma cópia do mesmo álbum. O programa deve suportar este uso. Além disso, é importante manter informações sobre as figurinhas repetidas e estatísticas sobre as coleções.

O programa deve ter uma interface com o usuário baseada em comandos, isto é, o programa inicia, exibe o prompt > e fica aguardando comandos do usuário (sair finaliza o programa). A seguir descrevemos alguns exemplos de usos que o programa deve suportar. Cada exemplo assume que o programa continua a execução após o exemplo anterior.

Exemplos de uso

Criação de álbuns: Cadastro de álbuns que podem ser colecionados. Cada álbum deve ter um identificador único gerado automaticamente. Dois álbuns distintos não podem ter o mesmo título. No exemplo a seguir as aspas servem para agrupar as palavras de um título com mais do que uma palavra. Após criar o álbum o programa exibe uma mensagem informando o identificador do álbum criado.

> novo album "Fundo do mar" 10
Álbum 1 criado.
> novo album Pokémon 999
Álbum 2 criado.
> novo album Pokémon 999
O álbum "Pokémon" já existe.

Listagem de álbuns: Exibe informações sobre os álbuns. O comando albuns exibe todos os álbuns cadastrados e o comando mostrar exibe detalhes de um álbum específico.

> albums
1 - Fundo do mar
2 - Pokémon
> mostrar 1
Título: Fundo do mar
Quantidade figurinhas: 10

Criação de nova coleção: Cadastro de uma coleção de um álbum. Duas coleções do mesmo álbum não podem ter nomes iguais. No exemplo uma nova coleção chamada Principal do álbum 1 é criada e em seguida uma coleção chamada Outra do álbum 1 é criada. Note que as coleções associadas com cada álbum (e a porcentagem completada da coleção) é mostrada na exibição do álbum.

> nova colecao 1 Principal
Coleção 1/Principal criada.
> nova colecao 1 Outra
Coleção 1/Outra criada.
> albuns
1 - Fundo do mar
    Principal (0%)
    Outra (0%)
2 - Pokémon

Adição de figurinhas a coleção: Adiciona figurinhas a uma coleção. Se alguma figurinha já está na coleção ela é adicionada a lista de repetidas. No exemplo as figurinhas 1 2 5 são adicionadas a coleção Principal do álbum 1. Em seguida as figurinhas 2 6 7 são adicionadas. Note que no último caso as figurinhas 2 e 7 são repetidas.

> adicionar 1 Principal 1 2 5 7
Novas: 1 2 5 7
Repetidas:
> adicionar 1 Principal 2 6 7
Novas: 6
Repetidas: 2 7

Exibição de coleções: Exibe informações sobre as coleções.

> mostrar 1 Principal
Album: Fundo do mar
Título: Principal
Presentes (50%): 1 2 5 6 7
Faltantes (50%): 3 4 8 9 10
Repetidas: 2 7

Troca: Auxilia na troca de figurinhas com outro colecionador. Os argumentos após o nome da coleção são as figurinhas repetidas e as figurinhas faltantes de outro colecionador (aspas são usadas para agrupar as figurinhas). O programa deve sugerir as trocas de figurinhas, isto é, as figurinhas que devem ser dadas e recebidas de outro colecionador, considerando que a troca é uma repetida por uma que ainda não está na coleção (para cada colecionador). Note que o outro colecionador tem as figurinhas 3 9 10 que são faltantes na coleção Principal, mas ele precisa apenas das figurinhas 2 e 4 que são repetidas na coleção Principal, desta forma apenas 2 figurinhas são trocadas.

> trocar 1 Principal "1 3 9 10" "2 4 7"
Entregar: 2 4
Receber: 3 9
> mostrar 1 Principal
Album: Fundo do mar
Título: Principal
Presentes (70%): 1 2 3 5 6 7 9
Faltantes (30%): 4 8 10
Repetidas:

Implementação

A implementação deve contemplar todos os exemplos anteriores e mais duas funcionalidades novas criadas pela equipe (algumas sugestões: remoção de figurinhas, exibir coleções completas, gasto com cada coleção, melhor conjunto de trocas para mais do que dois colecionadores, etc). Os exemplos podem não ser suficientes para a implementação (falta de detalhes). Neste caso a equipe deve decidir como implementar estes detalhes. A equipe também deve decidir como fazer o tratamento de erros.

Classes e interfaces

Pelo menos estas classes e interfaces devem existir no programa:

Classes

Interfaces

Todos as funcionalidades devem ser testadas com testes automatizados.

Como proceder com a implementação

Faça o download do projeto (do Netbeans) inicial do programa.

Para cada funcionalidade escreva o código (em Main.executa) para ler o comando e executar o método apropriado de servico. O método que será executado de servico ainda não existe, esta é a hora de pensar: se o método existisse, como eu gostaria que ele funcionasse? Quais os parâmetros e o retorno do método? Observe que o uso do método está guiando o seu projeto. Você deve então declarar o método em ColecoesServico e definir uma implementação vazia em LocalColecoesServico. Depois escrever o código de teste em LocalColecoesServicoTest e por fim implementar o método em LocalColecoesServico. Quando o teste estiver passado, você concluiu a funcionalidade e está pronto para começar a implementação de outra funcionalidade.

Note que a implementação do método em LocalColecoesServico pode requerer a definição e implementação de um novo método de ColecoesDao (ou em outra classe/interface). Você deve então suspender a implementação do método em LocalColecoesServico e proceder da mesma maneira que anteriormente para definir o novo método: se o método existisse, como eu gostaria que ele funcionasse? … Não se esqueça de escrever o teste antes de implementar o método! Depois que o novo método estiver implementado, você deve voltar e concluir a implementação do método em LocalColecoesServico. Nesse meio tempo o teste para o método em LocalColecoesServico ficará falhando, não se preocupe, se concentre em fazer o teste do novo método passar.

Esta é uma abordagem top-down, você começa com o método de mais alto nível e vai descobrindo novos métodos que precisam ser implementados. Desta forma, o projeto de cada método (classe e interface) é guiado pela necessidade.

Lembre-se

Avaliação

O trabalho será avaliado de acordo com os critérios: