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.
Ao iniciar este exercício, você concorda com as diretrizes do Código de Conduta e do Manual da Pessoa Estudante da Trybe.
🤷🏽♀️ 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:
- Cadastrar pessoas candidatas
- Cadastrar pessoas eleitoras
- 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:
- Compreender os conceitos fundamentais da Programação Orientada a Objetos (POO) e como a linguagem Java aplica esses conceitos.
- Entender a importância de conceitos como classes, objetos, métodos, encapsulamento, herança, polimorfismo, interfaces e classes abstratas na POO.
- Aplicar os conceitos de POO na prática, através da codificação em Java.
- 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.
- Criar novos programas Java utilizando os conceitos de POO, organizando o código de maneira lógica e eficiente.
- 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.
‼ Antes de começar a desenvolver
- 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>
-
Instale as dependências
mvn install
-
Crie uma branch a partir da branch
main
- Verifique que você está na branch
main
- Exemplo:
git branch
- Exemplo:
- Se você não estiver, mude para a branch
main
- Exemplo:
git checkout main
- Exemplo:
- 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
- Você deve criar uma branch no seguinte formato:
- 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
- Exemplo:
- Crie os arquivos index.html e style.css:
- Exemplo:
touch index.html style.css
- Exemplo:
- 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)
- Exemplo:
- 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)
- Exemplo:
- 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 )
- Exemplo:
- Adicione a sua branch com o novo
commit
ao repositório remoto
- Usando o exemplo anterior:
git push -u origin maria-soares-lessons-learned
- 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"
- Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
⌨️ 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 opush
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.
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"
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:
- 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.
- Ela possui o atributo protegido
nome
do tipo String. - Ela possui os getters e setters correspondentes ao atributo.
- Note que estes métodos não são abstratos, mesmo que a classe seja.
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:
- Atributos:
nome
: herdado da classePessoa
;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.
- Métodos:
- getters e setters referentes aos atributos.
receberVoto
: método responsável por adicionar 1 ao atributovotos
para representar a quantidade de votos recebidos pela pessoa candidata. O método não retorna nada.
- Construtor: seu construtor recebe dois parâmetros, o
nome
e onumero
, e os armazena nos respectivos atributos. O método construtor também inicializa o atributovotos
com o valor zero.
Note que todos os métodos da classe em questão são públicos.
Implemente a classe abstrata PessoaEleitora
A classe PessoaEleitora
herda da classe Pessoa
, ficando responsável por representar a pessoa eleitora. Garanta que:
- 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. - A classe deve possuir os getters e setters correspondentes aos atributos.
Note que todos os métodos dessa classe são públicos.
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 classePessoaCandidata
;pessoasEleitoras
: responsável por manter uma lista das pessoas eleitoras cadastradas, ou seja, de objetos instanciados da classePessoaEleitora
;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.
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: onome
(String) e onumero
(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 mensagemNú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 classeArrayList
).
- Verificar se o número da pessoa candidata já está cadastrado na lista
- Método
cadastrarPessoaEleitora
: esse método público deve receber dois parâmetros: onome
(String) e ocpf
(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 mensagemPessoa 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
.
- Verificar se o CPF da pessoa já está cadastrado na lista
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: ocpfPessoaEleitora
e onumeroPessoaCandidata
. Nesse método você deve:- Verificar se o CPF da pessoa eleitora já está inserido na lista
cpfsComputados
e, caso esteja, deve imprimir a mensagemPessoa 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âmetronumeroPessoaCandidata
. Quando encontrar o objeto que representa a pessoa candidata, deverá chamar o métodoreceberVoto
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
- Verificar se o CPF da pessoa eleitora já está inserido na lista
- 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:
- Verificar se já existe algum voto computado e, caso não, mostrar a mensagem
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.
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.
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.
Scanner
do Java, cadastra-se apenas o primeiro nome da pessoa candidata — ou seja, Maria, e não Maria Silva ou Maria Clara. 🔴
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.
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!