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

  1. Usar classes e métodos.
  2. Rodar em loop até sair.
  3. Exibir total de mensagens no encerramento.
  4. 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 dica para explicar conceitos Java
  • Comando quiz com 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

  1. Crie a classe Chatbot.
  2. Implemente respostas principais.
  3. Adicione histórico.
  4. Trate erros de entrada.
  5. 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:

  1. Fluxo feliz: ajuda -> dica -> quiz -> sair.
  2. Comando invalido: entrada desconhecida e retorno com orientacao.
  3. Entrada vazia: pressionar Enter sem texto e validar resposta adequada.
  4. 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.

NotaExpansão didática complementar

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.