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.
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.
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:
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.
Pelo menos estas classes e interfaces devem existir no programa:
Classes
Album
Colecao
Interfaces
ColecoesDAO
(DAO = Data access object)
ColecoesServico
ColecoesServico
vai usar internamente a implementação
de ColecoesDAO
;ColecoesService
para executar as suas funções. O código que implementa
a interface do usuário não deve conter nenhuma lógica que não esteja
relacionada com a interação com o usuário.Todos as funcionalidades devem ser testadas com testes automatizados.
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.
Escolha uma funcionalidade e implemente ela do início ao fim, incluindo a interface com o usuário. Depois implemente outra funcionalidade e assim por diante.
Escreva o código do teste antes de implementar a funcionalidade.
Escreva apenas o código necessário para passar no teste atual. Evite escrever código que possa ser usado no futuro mas que não é necessário agora.
O trabalho será avaliado de acordo com os critérios:
Completude: o programa deve estar completo, incluindo descrições e testes.
Corretude: o programa deve funcionar de acordo com a descrição e deve passar em todos os testes.
Organização: o programa deve estar bem organizado, com interfaces, classes e métodos adequados.
Entendimento: o aluno deve entender o programa que escreveu e ser capaz de fazer alterações no código.