Tag Archives: pseudo codigo

C++: Parametrizar programa pela linha de comando, arquivo de configurações e/ou variáveis de ambiente

O problema

Olá amiguinhos! Recentemente, tive curiosidade de como fazer uma coisa um pouco mais complexa do que eu já vinha usando.

Todo mundo usa parâmetros para configurar o seu programa e não precisar recompilar ele toda vez para uma alteração nos dados e não na logica. Além de poder tonar o programa mais customizável, temos a vantagem de que desenvolver programas assim também é mais fácil e rápido(por motivos óbvios, use e confirme).

Até ai, eu estava fazendo e vivendo muito bem com isso usando a espetacular biblioteca de opções de programa, isso mesmo, a boost.program_options! Com ela, de forma fácil eu consigo fazer essa trabalho de parametrização do programa.

Só que, para quem já usou programas bem feitos, sabe que essa parametrização é pode ser feita de mais jeitos, e tradicionalmente, as 4 formas mais usadas: Por parâmetros de linha de comando, arquivo de configurações, variáveis de ambiente e/ou combinações dos 3 primeiros.

Eu queria fazer melhor, usar a forma mais completa, que é justamente a 4 forma. Eu ainda não sabia direito como fazer, mas sabia que a boost.program_options dava suporte a todas essas formas e talvez a mais algumas… Recentemente sentei, agrupei tudo o que eu já sabia, pesquisei algumas coisas, fiz uns testes e finalmente consegui chegar a um resultado razoável, que é o que eu lhes apresento agora ;).

A solução

Considere um programa chamado “sort“.

O programa precisa receber um arquivo de entrada e um de saída, sendo que valores padrões(a entrada padrão e a saída padrão) podem ser assumidos para esses dois caso eles não sejam fornecidos, e eles só devem ser configurados pela linha de comando.

O programa deve receber um numero de pivô, esse numero deve assumir um valor padrão caso não se diga o contrario por algum parâmetro.

O programa também deve exibir uma mensagem de ajuda, mas somente se for requisitado via linha de comando. Essa mensagem de ajuda serve para saber como entrar com todos os parâmetros, via variáveis de ambiente, linha de comando e/ou arquivo de configuração.

Algumas opções devem ser alteradas por variáveis de ambiente começando com “SORT_“. Essas variáveis são as que não são as dadas pela linha de comando exclusivamente.

Finalmente, o código que resolve todos esses requisitos é:

Além do que eu falei, o código tem algumas coisinhas a mais, mas o principal é que cumpre os requisitos.

Fácil de entender, fácil de fazer. Na verdade, eu tive mais dificuldades e demorei mais em escrever os requisitos do que em escrever o código :p.

Advertisements

%d bloggers like this: