Kata - Conversor de Tipos via Linha de Comando
Neste kata, vamos explorar um caso de uso um pouco mais avançado: a criação de uma ferramenta de linha de comando (CLI) em C#. Esta aplicação irá converter um valor de um tipo de dado para outro, com base nos argumentos fornecidos pelo usuário ao executar o programa.
Vamos abordar conceitos como manipulação de argumentos de linha de comando, dicionários para armazenar parâmetros, tratamento de erros robusto com try-catch e a diferença crucial entre Parse e Convert.
O Código Completo
Este é o código do nosso Program.cs. Ele é projetado para ser executado via dotnet run com parâmetros específicos.
Análise do Código
Main: O Ponto de Entrada e Orquestrador
O método Main agora tem mais responsabilidades:
Verificar Argumentos:
if (args.Length == 0)checa se o programa foi executado sem nenhum argumento. Se for o caso, exibe uma mensagem de ajuda (ShowHelp()) e encerra.Analisar Argumentos:
ParseArguments(args)é chamado para processar os argumentos da linha de comando.Validar Parâmetros:
ValidateParameters(parameters)garante que todos os parâmetros necessários (valor,tipoEntrada,tipoSaida) foram fornecidos.Executar a Conversão: O bloco
try-catché o núcleo da lógica. Ele tenta analisar o valor de entrada, convertê-lo para o tipo de saída e imprimir o resultado. Se qualquer etapa falhar, uma exceção é capturada e uma mensagem de erro é exibida.
ParseArguments: Processando a Entrada do Usuário
Esta função transforma um array de strings como ["valor=123", "tipoEntrada=int"] em um Dictionary<string, string>. Um dicionário é uma coleção de pares chave-valor.
arg.Split('=', 2): Divide cada argumento no caractere=, no máximo em 2 partes. Isso garante que, se o valor contiver um=, ele não será dividido novamente (ex:valor=chave=valor).parameters[parts[0].ToLower()] = parts[1]: Adiciona a chave (em minúsculas) e o valor ao dicionário.
ParseInputValue vs. ConvertValue
O programa usa duas funções distintas para a conversão, e a diferença é fundamental:
ParseInputValue: Usa métodos comoint.Parse(string). O objetivo doParseé converter uma representação em string de um valor para o seu tipo de dado correspondente. Ele só funciona destringpara outro tipo.ConvertValue: Usa a classeConvert, com métodos comoConvert.ToInt32(object). A classeConverté mais flexível. Ela pode converter um valor de qualquer tipo base para outro tipo, desde que uma conversão válida exista. Por exemplo, pode converter umdoublepara umint, umboolpara umastring, etc.
Em nosso fluxo, primeiro usamos Parse para tirar o valor da string inicial e, em seguida, usamos Convert para realizar a conversão entre os tipos de dados reais (ex: de double para int).
Ambas as funções usam uma expressão switch (uma forma mais concisa do switch tradicional) para selecionar a operação correta com base no tipo de entrada/saída.
Tratamento de Erros (try-catch)
Este programa é muito mais robusto que a calculadora porque ele antecipa falhas.
try { ... }: O código que pode gerar um erro é colocado dentro do blocotry.catch (ArgumentException ex): Captura erros relacionados a argumentos inválidos, como um tipo de entrada/saída desconhecido.catch (InvalidCastException ex): Captura erros que ocorrem quando a conversão entre dois tipos não é possível (por exemplo, converter a string"abc"paraint).catch (Exception ex): Uma cláusula genérica que captura qualquer outro erro inesperado, evitando que o programa "quebre" abruptamente.
Conceitos-Chave Aplicados
Argumentos de Linha de Comando: Leitura e processamento de
string[] argsno métodoMain.Dicionários (
Dictionary<TKey, TValue>): Uma estrutura de dados poderosa para armazenar e acessar dados por meio de uma chave única.Tratamento de Exceções: Uso de
try-catchpara criar um programa resiliente que lida com entradas inválidas e erros de conversão.Expressões
switch: Uma sintaxe moderna e concisa para controle de fluxo.Diferença entre
ParseeConvert: Compreensão de duas maneiras fundamentais de realizar conversões de tipo em C#.
Como Executar
Para testar este programa, você o executaria a partir do seu terminal, na pasta do projeto, da seguinte forma:
Este kata demonstra como construir aplicações de console interativas e robustas, um pilar fundamental da programação em muitas linguagens, incluindo C#.