Trace Condicional

por Fabio A. Mazzarino

Trabalhei com uma equipe que tinha o costume de fazer traces da seguinte forma:

char *logtrace = ::getenv("LOGTRACE");
// ...
if (logtrace) std::cout << "*** Starting CUtil::promoteSale ***" << std::endl
if (logtrace) std::cout << "* Arg saleID: " << saleID << std::endl;
if (logtrace) std::cout << "* Arg owner: " << owner << std::endl; 

E às vezes até mesmo assim:

if (::getenv("LOGTRACE") std::cout << "*** Starting CUtil::calculateTax ***" << std::endl
if (::getenv("LOGTRACE") std::cout << "* Arg saleID: " << saleID << std::endl;

E funciona bem. Não dá warning, não tem vazamento de memória, não tem desperdício, nada disso. Mas não é semanticamente apropriado. Por que?

Semântica

Semântica não está relacionado com a funcionalidade ou com a sintaxe, está relacionado com a forma de comunicar. Um código semanticamente correto além de compilar sem erros nem warnings, além de funcionar sem bugs, também comunica de maneira clara o que o código faz.

Em algumas equipes a semântica fica em segundo plano, o mais importante é a funcionalidade sem falhas, mas em outras é muito importante que o código seja claro e comentado.

Corrigindo

Vamos melhorar a semântica do trecho de código?

#define LOGTRACE if (::getenv("LOGTRACE") std::cout
// ...
LOGTRACE << "*** Starting CUtil::calculateTax ***" << std::endl;
LOGTRACE << "* Arg SaleID: " << saleID << std::endl;

Percebeu como fica muito mais claro? Não é simplesmente uma economia de caracteres, é uma construção mais clara e que comunica imediatamente pra que a linha serve.

Para treinar fica a sugestão de desenvolver não simplesmente um trace, mas um log que exiba data e hora, utilizando pouco mais que defines. Nas próximas semanas traremos a solução.