Sistema de Votação

Boas-vindas ao repositório do exercício Sistema de Votação

Para realizar o exercício, atente-se a cada passo descrito a seguir e se tiver qualquer dúvida, nos envie no Slack da turma! #vqv 🚀

Aqui, você vai encontrar os detalhes de como estruturar o desenvolvimento do seu exercício a partir desse repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.

Termos e acordos

Ao iniciar este exercício, você concorda com as diretrizes do Código de Conduta e do Manual da Pessoa Estudante da Trybe.

Entregáveis

🤷🏽‍♀️ Como entregar

Para entregar o seu exercício, você deverá criar um Pull Request neste repositório.

Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub e nosso Blog - Git & GitHub sempre que precisar!

👨‍💻 O que deverá ser desenvolvido

Eba! Com suas habilidades excepcionais em Java, surgiu para você um desafio empolgante: desenvolver um sistema de votação eletrônico! É isso mesmo, você será o grande arquiteto digital da democracia!

Imagine só: esse sistema maravilhoso irá possibilitar o cadastro de todos os nossos candidatos e eleitores, além de coordenar o processo de votação. E tem mais, você será capaz de verificar os resultados a qualquer momento, sejam eles parciais ou o grande resultado final. Incrível, não é?

Mas para essa aventura ficar ainda mais emocionante, nós temos três etapas principais que precisamos seguir, formando uma sequência ordenada de desafios a serem superados:

  1. Cadastrar pessoas candidatas
  2. Cadastrar pessoas eleitoras
  3. Iniciar processo votação

O objetivo deste exercício é praticar a lógica de programação em um contexto de programação orientada a objetos e entender como esses conceitos permitem que escrevamos código mais claro, mais flexível e mais fácil de manter.

📝 Habilidades a serem trabalhadas

Neste exercício, verificamos se você é capaz de:

  1. Compreender os conceitos fundamentais da Programação Orientada a Objetos (POO) e como a linguagem Java aplica esses conceitos.
  2. Entender a importância de conceitos como classes, objetos, métodos, encapsulamento, herança, polimorfismo, interfaces e classes abstratas na POO.
  3. Aplicar os conceitos de POO na prática, através da codificação em Java.
  4. Analisar códigos Java escritos por outros, identificando o uso de conceitos de POO e entendendo como eles contribuem para a organização e clareza do código.
  5. Criar novos programas Java utilizando os conceitos de POO, organizando o código de maneira lógica e eficiente.
  6. Avaliar a eficácia de diferentes abordagens de programação em Java, considerando fatores como legibilidade, eficiência e facilidade de manutenção.

Desta forma, o exercício visa desenvolver as habilidades de programação orientada a objetos dos participantes, desde o nível de conhecimento até a capacidade de avaliar e criar seus próprios códigos em Java.

Orientações

‼ Antes de começar a desenvolver
  1. Clone o repositório
  • Use o comando: git clone <url do repositório>
  • Entre na pasta do repositório que você acabou de clonar:
    • cd <nome do repositório>
  1. Instale as dependências

    • mvn install
  2. Crie uma branch a partir da branch main

  • Verifique que você está na branch main
    • Exemplo: git branch
  • Se você não estiver, mude para a branch main
    • Exemplo: git checkout main
  • Agora, crie uma branch à qual você vai submeter os commits do seu exercício:
    • Você deve criar uma branch no seguinte formato: nome-sobrenome-nome-do-exercício;
    • Exemplo: git checkout -b maria-soares-lessons-learned
  1. Crie na raiz do exercício os arquivos que você precisará desenvolver:
  • Verifique que você está na raiz do exercício:
    • Exemplo: pwd -> o retorno vai ser algo tipo /Users/maria/code/sd-0x-project-lessons-learned
  • Crie os arquivos index.html e style.css:
    • Exemplo: touch index.html style.css
  1. Adicione as mudanças ao stage do Git e faça um commit
  • Verifique que as mudanças ainda não estão no stage:
    • Exemplo: git status (devem aparecer listados os novos arquivos em vermelho)
  • Adicione o novo arquivo ao stage do Git:
    • Exemplo:
      • git add . (adicionando todas as mudanças - que estavam em vermelho - ao stage do Git)
      • git status (devem aparecer listados os arquivos em verde)
  • Faça o commit inicial:
    • Exemplo:
      • git commit -m 'iniciando o exercício. VAMOS COM TUDO :rocket:' (fazendo o primeiro commit)
      • git status (deve aparecer uma mensagem tipo nothing to commit )
  1. Adicione a sua branch com o novo commit ao repositório remoto
  • Usando o exemplo anterior: git push -u origin maria-soares-lessons-learned
  1. Crie um novo Pull Request (PR)
  • Vá até a página de Pull Requests do repositório no GitHub

    • Clique no botão verde "New pull request"
    • Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
  • Coloque um título para o seu Pull Request

    • Exemplo: "Cria tela de busca"
  • Clique no botão verde "Create pull request"

  • Adicione uma descrição para o Pull Request, um título nítido que o identifique, e clique no botão verde "Create pull request"

Exemplo de pull request
⌨️ Durante o desenvolvimento

Faça commits das alterações que você fizer no código regularmente, pois assim você garante visibilidade para o time da Trybe e treina essa prática para o mercado de trabalho :) ;

  • Lembre-se de sempre após um (ou alguns) commits atualizar o repositório remoto;
  • Os comandos que você utilizará com mais frequência são:
    • git status (para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage);
    • git add (para adicionar arquivos ao stage do Git);
    • git commit (para criar um commit com os arquivos que estão no stage do Git);
    • git push -u origin nome-da-branch (para enviar o commit para o repositório remoto na primeira vez que fizer o push de uma nova branch);
    • git push (para enviar o commit para o repositório remoto após o passo anterior).
🎛 Checkstyle

Para garantir a qualidade do código, vamos utilizar neste exercício o Checkstyle. Assim o código estará alinhado com as boas práticas de desenvolvimento, sendo mais legível e de fácil manutenção! Para poder rodar o Checkstyle certifique-se de ter executado o comando mvn install dentro do repositório.

Para rodá-los localmente no repositório, execute os comandos abaixo:

mvn checkstyle:check

Se a análise do Checkstyle encontrar problemas no seu código, tais problemas serão mostrados no seu terminal. Se não houver problema no seu código, nada será impresso no seu terminal.

Você pode também instalar o plugin do Checkstyle na sua IDE. Para isso, volte na primeira seção do conteúdo.

⚠️ PULL REQUESTS COM ISSUES NO Checkstyle NÃO SERÃO AVALIADAS. ATENTE-SE PARA RESOLVÊ-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO! ⚠️

🛠 Testes

Para executar todos os testes basta rodar o comando:

mvn test

Para executar apenas uma classe de testes:

mvn test -Dtest="TestClassName"

Requisitos

1 - Implemente a classe abstrata Pessoa

Implemente a classe abstrata Pessoa, criando os atributos, getters e setters

No projeto já existe um arquivo com a classe com.betrybe.sistemadevotacao.Pessoa. Nessa classe, você deve garantir que:

  1. Ela é uma classe abstrata, de forma que ela será utilizada como base para implementação de outras classes, mas não será instanciada por si.
  2. Ela possui o atributo protegido nome do tipo String.
  3. Ela possui os getters e setters correspondentes ao atributo.
  • Note que estes métodos não são abstratos, mesmo que a classe seja.

2 - Implemente a classe PessoaCandidata

Implemente a classe abstrata PessoaCandidata, incluindo atributos, métodos e herança

A classe PessoaCandidata herda da classe Pessoa, ficando responsável por representar a pessoa candidata. Essa classe é formada por:

  1. Atributos:
    • nome: herdado da classe Pessoa;
    • numero: atributo do tipo primitivo inteiro que armazena o número identificador para voto;
    • votos: atributo do tipo primitivo inteiro que armazena o número de votos recebidos pela pessoa candidata.
  2. Métodos:
    • getters e setters referentes aos atributos.
    • receberVoto: método responsável por adicionar 1 ao atributo votos para representar a quantidade de votos recebidos pela pessoa candidata. O método não retorna nada.
  3. Construtor: seu construtor recebe dois parâmetros, o nome e o numero, e os armazena nos respectivos atributos. O método construtor também inicializa o atributo votos com o valor zero.

Note que todos os métodos da classe em questão são públicos.

3 - Implemente a classe PessoaEleitora

Implemente a classe abstrata PessoaEleitora

A classe PessoaEleitora herda da classe Pessoa, ficando responsável por representar a pessoa eleitora. Garanta que:

  1. Além do(s) atributo(s) herdado(s), ela deve possuir um atributo privado adicional cpf do tipo String, que armazena o CPF da pessoa eleitora.
  2. A classe deve possuir os getters e setters correspondentes aos atributos.

Note que todos os métodos dessa classe são públicos.

4 - Implementar a classe GerenciamentoVotacao com atributos

Implemente a classe que fará o gerenciamento do processo de votação e seus atributos

Neste requisito, você deve iniciar a implementação da classe GerenciamentoVotacao é responsável por gerenciar a votação e o cadastro de pessoas candidatas e pessoas eleitoras. A classe deve implementar a interface GerenciamentoVotacaoInterface, já disponibilizada com o projeto.

Por enquanto você não precisa completar os métodos da interface, apenas deverá criar três atributos privados:

  • pessoasCandidatas: responsável por manter uma lista das pessoas candidatas cadastradas, ou seja, de objetos instanciados da classe PessoaCandidata;
  • pessoasEleitoras: responsável por manter uma lista das pessoas eleitoras cadastradas, ou seja, de objetos instanciados da classe PessoaEleitora;
  • cpfsComputados: responsável por manter uma lista com os CPFs das pessoas eleitoras que já votaram, ou seja, de Strings.

Para criar os três atributos acima, você deve utilizar a classe ArrayList. Nós aprenderemos mais sobre essa classe posteriormente, mas utilizaremos essa classe aqui porque ela pode receber novos objetos de uma forma mais simples e eficiente do que com os arrays nativos do Java. Um exemplo de uso:

ArrayList<String> fruits = new ArrayList<String>();
fruits.add("maça");
fruits.add("uva");
System.out.println(cars.get(1)); // Imprime "uva"

Para mais informações, você pode consultar o site da W3Schools, ou a documentação oficial.

5 - Implementar os métodos de cadastro da classe GerenciamentoVotacao

Implemente os métodos de cadastro da classe GerenciamentoVotacao

Neste requisito, você deve implementar os métodos da classe GerenciamentoVotacao referentes a cadastro, conforme abaixo:

  • Método cadastrarPessoaCandidata: esse método público deve receber dois parâmetros: o nome (String) e o numero (inteiro) da pessoa candidata. Neste método você deve:
    • Verificar se o número da pessoa candidata já está cadastrado na lista pessoasCandidatas e, caso esteja, imprimir a mensagem Número da pessoa candidata já utilizado! no console;
    • Caso contrário, instanciar um objeto da classe PessoaCandidata utilizando os valores recebidos;
    • Por fim, adicionar o novo objeto na lista pessoasCandidatas (Dica: utilize o método .add da classe ArrayList).
  • Método cadastrarPessoaEleitora: esse método público deve receber dois parâmetros: o nome (String) e o cpf (String) da pessoa candidata. Neste método você deve:
    • Verificar se o CPF da pessoa já está cadastrado na lista pessoasEleitoras e, caso esteja, imprimir a mensagem Pessoa eleitora já cadastrada! no console;
    • Caso contrário, instanciar um objeto da classe PessoaEleitora utilizando os valores recebidos
    • Por fim, adicionar o novo objeto na lista; pessoasCandidatas .

6 - Implementar os métodos de votação da classe GerenciamentoVotacao

Implemente os métodos de votação da classe GerenciamentoVotacao

Neste requisito, você deve implementar os métodos da classe GerenciamentoVotacao referentes à votação, conforme abaixo:

  • Método votar: esse método público deve receber dois parâmetros: o cpfPessoaEleitora e o numeroPessoaCandidata. Nesse método você deve:
    • Verificar se o CPF da pessoa eleitora já está inserido na lista cpfsComputados e, caso esteja, deve imprimir a mensagem Pessoa eleitora já votou! no console;
    • Caso contrário, deve percorrer o array pessoasCandidatas para encontrar o objeto da pessoa candidata que tenha o número passado pelo parâmetro numeroPessoaCandidata. Quando encontrar o objeto que representa a pessoa candidata, deverá chamar o método receberVoto desse objeto.
    • Por fim, deve inserir o CPF da pessoa eleitora na lista cpfsComputados, de forma que essa pessoa eleitora não possa votar novamente
  • Método mostrarResultado: esse método público é responsável por imprimir no console o resultado da eleição, seja o resultado parcial ou o final. Ele não recebe nenhum parâmetro. No método, você deve:
    • Verificar se já existe algum voto computado e, caso não, mostrar a mensagem É preciso ter pelo menos um voto para mostrar o resultado.. Você pode utilizar a lista de CPFs para verificar o total de votos.
    • Caso já tenha votos computados, imprimir no console o nome de cada pessoas candidata com a quantidade de votos que ela recebeu e o percentual de votos recebidos. Além disso, mostrar o total de votos computados. Exemplo de saída:
Nome: Maria - 2 votos ( 67% )
Nome: José - 1 votos ( 33% )
Total de votos: 3

Nota: no cálculo da porcentagem, arredonde o valor para inteiro utilizando o método estático round da classe Math do Java.

7 - Implementar a classe Principal

Implementar a classe Principal, responsável por interagir com a pessoa usuária

Neste requisito você irá implementar a classe Principal, que fará a execução de todo o processo de cadastro e votação.

Será preciso criar um menu com três etapas:

  • Cadastro de pessoas candidata;
  • Cadastro de pessoas eleitoras;
  • Votação.

Para implementar o sistema, a classe Principal deve conter o método main, que utilizará a classe GerenciamentoVotacao para realizar as diferentes etapas.

Você poderá utilizar laços de repetição para processar cada etapa.

Cadastro de pessoas candidatas

O menu de cadastro de pessoas candidatas deverá ter o seguinte formado:

Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:

Se a pessoa usuária entrar com o valor 1 (que indica que ela quer cadastrar uma pessoa candidata), a mensagem Entre com o nome da pessoa candidata: deverá ser impressa no console.

Em seguida, após inserir o nome da pessoa candidata e pressionar enter, aparecerá a mensagem Entre com o número da pessoa candidata: no console. Depois que a pessoa usuária inserir o número da pessoa candidata, o sistema deverá retornar ao estado inicial do menu.

Supondo que o nome da primeira pessoa candidata seja "Maria" e o seu número para votar seja "1", então um exemplo do conteúdo do console depois de cadastrar a primeira pessoa candidata será:

Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa candidata:
Maria
Entre com o número da pessoa candidata:
1
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:

Esse ciclo se repete até não haver mais pessoas candidatas para serem cadastradas. Quando isso acontecer, a pessoa usuária entrará com a opção 2 do menu, o que vai parar o primeiro laço. O segundo laço, que representa a etapa de cadastro de pessoas eleitoras, deve ser iniciado logo na sequência.

⚠️🔴IMPORTANTE: para facilitar o uso da classe Scanner do Java, cadastra-se apenas o primeiro nome da pessoa candidata — ou seja, Maria, e não Maria Silva ou Maria Clara. 🔴⚠️

Cadastro de pessoas candidatas

Após finalizar o cadastro de pessoas candidatas, passamos para o cadastro de pessoas eleitoras. O menu deverá ter o seguinte formato:

Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:

Se a pessoa usuária entrar com o valor 1 (que indica que ela quer cadastrar uma pessoa eleitora), então a mensagem Entre com o nome da pessoa eleitora: será impressa no console. Em seguida, depois de inserir o nome da pessoa eleitora e pressionar enter, aparecerá no console a mensagem Entre com o CPF da pessoa eleitora:.

Depois que a pessoa usuária inserir o CPF da pessoa eleitora, o sistema deve retornar ao estado inicial do menu. Supondo que o nome da primeira pessoa eleitora seja "João", portador do CPF "123.456.789-00", um exemplo do conteúdo do console após cadastrá-la será:

Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa eleitora:
João
Entre com o cpf da pessoa eleitora:
123.456.789-00
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:

Esse ciclo se repete até o esgotamento das pessoas eleitoras a serem cadastradas. Ao final desse cadastro, a pessoa usuária entrará com a opção 2 do menu, o que vai parar o segundo laço e iniciar o terceiro, marcando o início da votação.

Votação

Após finalizar o cadastro de pessoas eleitoras, entramos na etapa de votação. O menu deve ter o seguinte formato:

 Entre com o número correspondente à opção desejada:
 1 - Votar
 2 - Resultado Parcial
 3 - Finalizar Votação

Se a pessoa usuária entrar com o valor 1 (que indica que ela quer computar um voto), a mensagem Entre com o cpf da pessoa eleitora: deverá ser impressa no console. Em seguida, após inserir o CPF da pessoa eleitora e pressionar enter, deverá aparecer a mensagem Entre com o número da pessoa candidata: no console. Feito isso, o voto deve ser computado, e o sistema retorna ao estado inicial do menu. Supondo que o CPF da primeira pessoa eleitora seja "123.456.789-00", e o número da pessoa candidata seja 1, então um exemplo do conteúdo do console após realizar um voto será:

 Entre com o número correspondente à opção desejada:
 1 - Votar
 2 - Resultado Parcial
 3 - Finalizar Votação
 1
 Entre com o cpf da pessoa eleitora:
123.456.789-00
 Entre com o número da pessoa candidata:
 1
 Entre com o número correspondente à opção desejada:
 1 - Votar
 2 - Resultado Parcial
 3 - Finalizar Votação

Se a pessoa escolher a opção 2 ("Resultado parcial"), o resultado parcial deverá ser mostrado, mas a votação continua. Já se a pessoa escolher a opção 3, deverá ser mostrado o resultado final, e a execução termina.

🗣 Nos dê feedbacks sobre o exercício!

Ao finalizar e submeter o exercício, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!