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 destring
para 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 umdouble
para umint
, umbool
para 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[] args
no 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-catch
para 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
Parse
eConvert
: 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#.