Desbravando o goto!

Introdução

O assunto dos gotos é um dos tópicos mais discutidos nos fóruns de programação. Várias críticas são reiteradas para a sua não utilização, mas será o goto assim tão maléfico? Não terá realmente a sua utilidade? Com este artigo espero convencê-lo que o goto, como uma ferramenta de programação que é, tem lugar na sua caixa de ferramentas.

O que é então o goto?

Para os mais distraídos o goto esta presente em diversas linguagens de programação. Esta ferramenta permite fazer saltos unidirecionais para locais específicos, quer estes sejam especificados pela linha de código em que se encontra ou por uma label.

goto label:

Na programação estruturada não temos qualquer obrigação em utilizador o goto.

Opiniões Divididas em relação ao goto!

Em 1969, Dijkstra  escreveu um artigo intitulado por Go to Statements Considered Harmful, e defendia a abolição do goto em todas as linguagens de alto nível. Dijkstra apresenta dois argumentos, um deles é que o goto complica a prova que uma certa parcela de código esta correta e o seu segundo argumento foi que complica a descrição do que o programa fez até um dado momento.

Por sua vez Donald E. Knuth escreveu um artigo chamado Structured Programming with go to Statements em que exemplifica as vantagens de usar goto em linguagens procedurais, como é o caso de C.

Usos do Goto!

As linguagens de alto nível atualmente possuem um sistema de garbage collection que facilitem a vida ao programador que não tem que perder tempo a se preocupar em dealocar o espaço de memória que foi usado. O goto é muito útil neste casos pois simplifica muito o código na leitura e elimina a necessidade de criação de funções para esse efeito o que implicaria possíveis problemas com scope. É também utilizado o goto em casos de error checking. Em outras linguagens de alto nível a próprio linguagem disponibiliza mecanismos que permitem efetuar este tipo de ação como é try...exception(excepção), no caso do Python. A título de curiosidade a implementação do return, break e continue utiliza o goto. Se analisarmos o código gerado pelo compilador veríamos que não há diferenças entre o goto e um if, e sem prejuízos de memória.

Publicado na edição 44 (PDF) da Revista PROGRAMAR.