Recomendações Importantes
Eduardo é um aluno do CIn que anda meio tristonho por estar sozinho, devido ao último revés que recebeu. Mas Edu acha que o dinheiro e o álcool podem ajudá-lo a sair dessa sofrência. Para isso, ele pediu para que vocês alunos do CIn desenvolvessem um aplicativo que seja capaz de fazer casais numa mesa de bar. Quem sabe até ele mesmo use o aplicativo =P.
Uma pessoa possui nome, idade, limite alcoólico e opção sexual e range - distância procurada.
Opções sexuais: Hétero, Homossexual e Bissexual.
Pessoas (abstrata) são divididas em:
Homens: bebem Cerveja, Whisky e Pitu
Mulheres: bebem Cerveja, Vinho e Vodka
Ambas recebem 3 inteiros que correspondem ao número de doses de cada bebida em ordem. Pessoas devem ter um método que retorna o nível de álcool no sangue que é calculado da seguinte forma:
Cerveja Original*0,05
Vinho do Porto*0,20
Vodka Orloff*0,38
Whisky White Horse*0,40
Pitu Gold*0,39
#Propaganda
E um método que diz se o limite alcoólico foi atingido ou não.
Local
Possui String nome, int range e String info sobre o local.
Momentos
Possuem a informação do momento (Local, String evento e Calendar data). São dividos em:
Momentos Juntos: range máximo do local pode ser de 0 até o menor dos dois, ambas as pessoas devem ter opções sexuais que abranjam o outro.
Momentos com Amigos: não possui range máximo, possui um array de velas (amigos que estarão segurando vela, podendo aumentar o número de amigos).
Momentos Juntos possui um método que diz se a noite foi um fracasso (um dos dois deu PT ou seja, limite de um dos dois foi excedido).
Momentos com os amigos possui um método getAlambique, que retorna quem é capaz de beber mais numa noite, podendo ser o casal e/ou qualquer vela presente e a bebida ingerida que compõe maior parte do álcool no sangue do Alambique no Momento.
Para todas as entidades, você deve implementar um método toString() que retorna uma string descrevendo todas as características do objeto. Utilize da forma mais apropriada os conceitos de herança e classe abstrata.
Crie os repositórios para as três classes básicas com as funções de adicionar um objeto, remover, buscar e verificar se certo elemento existe. Implemente-os com uso de array.
O array deve iniciar com capacidade 2 e cada vez que for necessário ultrapassar a capacidade na hora de inserir, deve dobrar de tamanho.
Obs.: é obrigatório o uso de interface para definir os repositórios.
Faça classes de negócio que vão se comunicar com os repositórios. Nestas classes serão lançadas exceções.
Você deve lançar exceção para os seguintes casos especiais:
Adicionar um objeto que já existe.
Remover um objeto que não existe.
Buscar um objeto e não encontrá-lo.
Atualizar um objeto (sem modificar os nomes, caso modifique uma pessoa, seus novos dados devem ser atualizados nos momentos que ela estiver).
Ps:. Não é possível trocar uma pessoa de um evento (apenas atualizar com os valores modificados).
Não deve ser permitido:
- Uma data no formato inválido.
- Criar um Momento Junto que tenha range inválido.
- Valores inválidos para os atributos dos objetos (Nomes vazios, Doses negativas, etc...).
Faça uma classe de fachada pro seu sistema! A fachada se comunica com as classes de negócio, independe da interface com que o usuário vai interagir (console, GUI etc.). Mantenha a consistência dos dados considerando as relações entre as entidades:
- Para criar um Momento é necessário que ambas as pessoas estejam no repositório e elas devem ter opções sexuais compatíveis.
- Para criar um Momento, o local deve estar no repositório.
- Um momento não pode ser criado se o Range for inconsistente com o especificado.
Deve conter um método capaz de adicionar uma vela a um dado momento, verificar se a noite foi um fracasso ou não, caso seja um momento com amigos verifique o alambique da turma, atualizar um dado objeto (modificando outros caso necessário).
Por último e mais importante, faça uma classe de teste, para interagir com o usuário e se comunicar com a fachada, onde através do console seja possível realizar todas as seguintes operações:
Trate todas as exceções da fachada utilizando blocos try/catch de forma que o programa não encerre quando qualquer uma dessas exceções for lançada e que fique claro para os usuários qual erro ocorreu.
Faça um menu numérico que facilite os testes (monitor feliz, correção feliz =D).
Obs.: nesta questão é permitido o uso de Scanner.
Será concedido o token de desafio à quem conseguir nota maior ou igual a 8,5 nessa lista.