11 Projeto Final
11.1 Desafio da turma
Você vai construir o TutorJavaBot.
A ideia é aplicar tudo que estudamos, com código limpo e comportamento correto. Pense neste projeto como uma pequena entrega profissional, com começo, meio e fim. Seu objetivo não é só fazer funcionar, mas também deixar o código fácil de ler e manter. Ao longo da implementação, revise nomes de variáveis, métodos e mensagens exibidas no console.
11.2 Requisitos mínimos
- Usar classes e métodos.
- Rodar em loop até
sair. - Exibir total de mensagens no encerramento.
- Tratar entradas inválidas.
Esses requisitos formam a base do projeto e devem estar presentes na primeira versão. Se algum item não estiver funcionando, volte uma etapa e corrija antes de adicionar novos recursos.
11.3 Requisitos extras
- Comando
dicapara explicar conceitos Java - Comando
quizcom pergunta simples - Salvar histórico em arquivo
Os extras são uma oportunidade de ir além e praticar autonomia no desenvolvimento. Implemente um extra por vez para facilitar testes e evitar erros difíceis de rastrear. Sempre que concluir um novo recurso, execute o programa e valide o comportamento esperado.
11.4 Roteiro de implementação
- Crie a classe
Chatbot. - Implemente respostas principais.
- Adicione histórico.
- Trate erros de entrada.
- Teste o fluxo completo.
Siga o roteiro na ordem para reduzir retrabalho. Se surgir uma dúvida, escreva um comentário curto no código e continue avançando. Depois, volte com calma e refatore os trechos que ficaram repetidos.
11.5 Checklist de avaliação
- Código compila sem erros
- Estrutura está organizada
- Bot responde comandos principais
- Usuário consegue encerrar com segurança
Use esta lista como verificação final antes de entregar. Uma boa prática é pedir para outra pessoa testar seu bot sem ajuda. Se o usuário se perder no fluxo, ajuste mensagens e instruções no console.
11.6 Próximos passos
Depois desse projeto, você pode evoluir para:
- Interface gráfica com JavaFX
- API REST com Spring Boot
- Integração com modelos de linguagem
Cada próximo passo aprofunda uma habilidade diferente do ecossistema Java. Escolha a trilha que mais combina com seus objetivos de estudo ou carreira. O mais importante é manter constância: projetos pequenos e frequentes aceleram seu aprendizado.
11.7 Arquitetura recomendada para o TutorJavaBot
Mesmo sendo um projeto de console, vale organizar a solucao em pequenas responsabilidades. Uma divisao simples pode ter uma classe para o fluxo principal, outra para processar comandos e outra para armazenar historico. Esse desenho reduz acoplamento e facilita manutencao, porque cada parte muda por um motivo especifico.
Uma estrutura inicial possivel seria:
Main: inicializa o bot e inicia o loop de leitura.Chatbot: coordena entrada, processamento e saida.CommandProcessor: interpreta texto digitado e decide a resposta.HistoryService: registra mensagens e, opcionalmente, salva em arquivo.
Quando as classes ficam pequenas e coesas, voce encontra erros com mais rapidez e evolui funcionalidades com menos retrabalho.
11.8 Contrato de comandos
Antes de codar, defina um contrato minimo para os comandos aceitos. Esse contrato funciona como uma mini especificacao do sistema e evita ambiguidades.
Sugestao de comandos obrigatorios e extras:
ajuda: lista os comandos disponiveis.dica: retorna uma dica tecnica de Java.quiz: mostra uma pergunta e valida a resposta.historico: imprime as ultimas interacoes.sair: encerra com resumo da sessao.
Definir esse contrato logo no inicio melhora a comunicacao entre quem desenvolve e quem testa. Tambem ajuda voce a escrever mensagens de erro mais objetivas quando o usuario digita algo inesperado.
11.9 Tratamento de entrada e validacao
Um erro comum em chatbot de console e assumir que toda entrada sera valida. Em ambiente real, voce precisa normalizar texto, remover espacos extras e tratar caixa alta e baixa.
Uma estrategia util e centralizar a normalizacao em um unico metodo:
private String normalizarEntrada(String texto) {
if (texto == null) {
return "";
}
return texto.trim().toLowerCase();
}Com isso, o restante do codigo trabalha sempre com um formato previsivel. Se o comando for desconhecido, responda com orientacao clara, por exemplo: “Comando invalido. Digite ajuda para ver opcoes.”
11.10 Historico de conversa em memoria
Para praticar colecoes, armazene as interacoes em uma List<String>. Cada registro pode incluir tipo da mensagem e conteudo, como USUARIO: ajuda e BOT: comandos disponiveis.... Esse historico permite criar metricas simples, como total de mensagens e quantidade de comandos invalidos.
private final List<String> historico = new ArrayList<>();
private void registrar(String origem, String mensagem) {
historico.add(origem + ": " + mensagem);
}Mesmo em um projeto introdutorio, esse cuidado mostra maturidade de engenharia de software.
11.11 Persistencia simples em arquivo
Como requisito extra, voce pode salvar o historico ao finalizar o programa. Uma abordagem direta usa BufferedWriter com tratamento de excecoes. Se ocorrer falha de escrita, o bot deve informar o problema sem encerrar de forma abrupta.
private void salvarHistoricoEmArquivo(String caminho) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(caminho))) {
for (String linha : historico) {
writer.write(linha);
writer.newLine();
}
} catch (IOException e) {
System.out.println("Nao foi possivel salvar o historico: " + e.getMessage());
}
}Esse recurso conecta conceitos de colecoes, laco de repeticao, tratamento de erros e manipulacao de arquivos em uma unica funcionalidade.
11.12 Estrategia de testes manuais
Como o projeto e de console, uma boa validacao pode ser feita por roteiro de cenarios. Teste pelo menos os fluxos abaixo:
- Fluxo feliz:
ajuda->dica->quiz->sair. - Comando invalido: entrada desconhecida e retorno com orientacao.
- Entrada vazia: pressionar Enter sem texto e validar resposta adequada.
- Persistencia: encerrar e verificar se arquivo de historico foi gerado.
Esses testes aumentam confiabilidade e reduzem regressao quando voce fizer melhorias futuras.
11.13 Critérios de qualidade para entrega
Na versao final, avalie seu projeto com criterios tecnicos objetivos:
- Legibilidade: nomes claros e metodos curtos.
- Coesao: cada classe com responsabilidade bem definida.
- Robustez: tratamento para entradas invalidas e excecoes de I/O.
- Experiencia de uso: mensagens amigaveis e instrucoes claras.
- Evolutividade: facilidade para adicionar novos comandos sem quebrar os existentes.
Quando voce entrega com base nesses criterios, o projeto deixa de ser apenas um exercicio e passa a ser evidencia concreta do seu desenvolvimento tecnico.
11.14 Evoluções sugeridas
Se quiser ir alem, uma evolucao interessante e criar um mapa de comandos com Map<String, Runnable>. Com isso, voce substitui blocos longos de if/else por uma estrategia mais escalavel. Outra opcao e separar perguntas de quiz em um arquivo externo para facilitar manutencao de conteudo.
A cada evolucao, mantenha o mesmo principio: implementar pouco, testar cedo e refatorar com frequencia. Esse habito constroi base solida para projetos maiores em Java, incluindo APIs, sistemas web e aplicacoes desktop.
Neste capitulo, o estudo de projeto final se torna realmente valioso quando voce deixa de enxergar o conteudo como uma lista de regras isoladas e passa a observar como cada decisao tecnica influencia a qualidade do programa, a facilidade de manutencao e a capacidade de adaptar a solucao sem quebrar o que ja estava funcionando, especialmente em atividades progressivas que simulam situacoes de projeto real.
Para consolidar o aprendizado com profundidade, vale estruturar sua pratica em uma sequencia objetiva na qual voce revisa o conceito principal, implementa um exemplo pequeno e legivel e, logo em seguida, analisa de maneira critica se houve melhoria concreta em integracao de conceitos, qualidade de entrega e planejamento de evolucao, porque esse ciclo consciente transforma estudo passivo em desenvolvimento de criterio tecnico.
Quando esse processo se repete ao longo das semanas, voce comeca a perceber que sua evolucao nao depende de decorar respostas prontas, mas sim de interpretar problemas com mais maturidade, justificar escolhas com argumentos claros e construir solucoes cada vez mais consistentes, o que representa exatamente a transicao de iniciante para praticante autonomo dentro da trilha de Java.