17  Projeto final: TutorJavaBot

Uma entrega integrada, testável e evolutiva

17.1 Objetivo

Construir um chatbot de console que aplique os fundamentos e as decisões de design estudadas. A entrega deve funcionar, comunicar erros de forma clara e permitir a adição de comandos sem alterar o núcleo do processador.

O console envia comandos ao processador, que usa um mapa de comandos e um histórico; o histórico é salvo em arquivo.

Arquitetura de referência do TutorJavaBot.

17.2 Requisitos obrigatórios

O programa deve:

  1. executar em Java 21 ou superior;
  2. permanecer ativo até o comando sair;
  3. reconhecer oi, ajuda, dica, quiz, historico e sair;
  4. normalizar espaços e diferenças entre maiúsculas e minúsculas;
  5. rejeitar entrada vazia sem registrá-la;
  6. guardar interações em memória;
  7. salvar o histórico em UTF-8 ao encerrar;
  8. tratar falha de entrada e saída sem encerrar abruptamente;
  9. impedir comandos duplicados;
  10. passar pelos testes e pelo roteiro manual do capítulo anterior.

17.3 Arquitetura recomendada

AplicacaoConsole
 └── TutorJavaBot
      ├── RegistroComandos
      │    └── Map<String, Comando>
      └── Historico
           └── List<String>

Responsabilidades:

  • AplicacaoConsole: entrada, saída e ciclo de vida;
  • TutorJavaBot: coordena processamento e histórico;
  • RegistroComandos: registra e localiza comandos;
  • Comando: contrato polimórfico;
  • Historico: registra, consulta e salva interações.

Não crie classes apenas para aumentar a quantidade de arquivos. Cada separação deve reduzir uma responsabilidade real.

17.4 Contrato dos comandos

Comando Resposta ou efeito
oi apresentação do bot
ajuda lista obtida do próprio registro
dica dica de Java
quiz pergunta e validação de resposta
historico últimas interações, sem registrar a consulta
sair encerra e tenta salvar o histórico
desconhecido orienta a usar ajuda

Defina “interação” como um par formado pela entrada processada e pela resposta. Essa definição deve ser usada no contador, no histórico e nos testes.

17.5 Roteiro de implementação

17.5.1 Etapa 1 — domínio mínimo

Implemente Historico e seus testes:

  • rejeitar entrada vazia;
  • registrar duas linhas por interação;
  • devolver cópia somente para leitura;
  • calcular total corretamente.

17.5.2 Etapa 2 — comandos

Implemente a interface:

interface Comando {
    String nome();
    String executar();
}

Crie uma classe por comando quando houver regra própria. Registre as implementações em Map<String, Comando>.

17.5.3 Etapa 3 — coordenação

TutorJavaBot normaliza a entrada, consulta o registro e grava o resultado. Console e arquivos não devem aparecer dentro das implementações de comandos simples.

17.5.4 Etapa 4 — persistência

Use Files.write ou Files.writeString e propague IOException até a fronteira da aplicação. O console decide qual mensagem mostrar.

17.5.5 Etapa 5 — validação

Execute:

./scripts/validate-examples.ps1
quarto render --to html

Depois, percorra os casos manuais abaixo.

17.6 Roteiro de aceitação

  1. Inicie o programa e digite AJUDA.
  2. Execute oi, dica e um comando desconhecido.
  3. Pressione Enter sem texto.
  4. Consulte historico.
  5. Execute quiz com resposta correta e incorreta.
  6. Digite SAIR.
  7. Abra o arquivo gerado e compare-o com as interações mostradas.

A entrada vazia, a consulta ao histórico e o comando de saída não devem aumentar o total de interações.

17.7 Critérios de avaliação

Critério Peso
comportamento e contrato dos comandos 30%
organização e encapsulamento 20%
tratamento de erros e persistência 15%
testes automatizados 15%
legibilidade e nomes 10%
experiência no console 10%

17.8 Exemplo de referência

Uma implementação completa, sem bibliotecas externas, está em examples/src/Capitulo16Projeto.java. Leia-a depois de concluir sua primeira versão e compare decisões, não apenas linhas.

17.9 Evoluções opcionais

  • carregar perguntas de quiz de um arquivo;
  • persistir data e hora de cada interação;
  • migrar os testes para JUnit;
  • criar interface gráfica com JavaFX;
  • expor o processador por uma API;
  • integrar um modelo de linguagem atrás de uma nova implementação de Comando.

Cada evolução deve começar com um contrato e um teste. Recursos externos não devem comprometer o funcionamento básico do chatbot.

NotaDefinição de pronto

A entrega está pronta quando compila do zero, passa pelos testes, completa o roteiro de aceitação e pode receber um novo comando sem editar o processador central.