Um tutorial prático mostrando como transformar um fluxo de coleta de dados monolítico em um design modular, testável e extensível.
Digamos que você esteja construindo um CLI que entrevista o usuário, pedindo nome, data de nascimento e número de documento. A versão inicial funciona, mas logo se torna um bloco de código difícil de manter:
como você adiciona validações sem aumentar a complexidade? como você implementa lógica de confirmação e repetição para cada entrada? 1. Cenário Inicial package main import ( "fmt" "log" "strings" "time" "github.com/AlecAivazis/survey/v2" ) func main() { var name, dateStr, document string if err := survey.AskOne(&survey.Input{Message: "Nome:"}, &name); err != nil { log.Fatal(err) } if len(strings.TrimSpace(name)) < 2 { log.Fatal("O nome deve ter pelo menos 2 caracteres") } if err := survey.AskOne(&survey.Input{Message: "Data de nascimento (DD/MM/AAAA):"}, &dateStr); err != nil { log.Fatal(err) } birthDate, err := time.Parse("02/01/2006", dateStr) if err != nil || birthDate.After(time.Now()) { log.Fatal("Data de nascimento inválida") } if err := survey.AskOne(&survey.Input{Message: "Documento:"}, &document); err != nil { log.Fatal(err) } if len(document) == 0 { log.Fatal("O documento não pode estar vazio") } fmt.Printf("Coletados: %s | %s | %s\n", name, birthDate.Format("2006-01-02"), document) } Aqui vemos alguns problemas: Dificuldade em adicionar novas etapas: cada novo campo ou validação requer modificar todo o fluxo, aumentando o risco de bugs. Regras de validação misturadas com coleta de dados: é difícil isolar ou reutilizar validações. Fluxo rígido e inflexível: não é simples reordenar, pular ou repetir etapas sem reescrever código. Sem mecanismo de repetição organizado: qualquer erro termina o programa, sem controle refinado de repetição. Baixa clareza sobre o fluxo: à medida que o código cresce, torna-se mais difícil entender a ordem e lógica de cada etapa. 2. Raciocínio para Desacoplamento Queremos dividir o processo em etapas independentes, cada uma responsável por: • Perguntar; • Validar; • Decidir se repete ou avança.
...