Teste de Mesa em um Programa
No inÃcio, programar computadores era difÃcil, caro e haviam poucas ferramentas para ajudar no processo. Era necessário pensar bem antes de submeter o programa para executar no computador. Com o tempo as ferramentas de desenvolvimento evoluiram tornando possÃvel a programação interativa, ou seja, o programador agora vai criando o programa, rodando pedaços e observando o resultado.
Embora essa evolução tenha sido de grande importância para os desenvolvedores profissionais, isto teve um efeito ruim sobre o ensino da programação. Como no passado era mais difÃcil ter acesso ao computador o trabalho se iniciava no papel executando um esforço em raciocinar sobre o que estava acontecendo naquele programa, ou seja, gastavasse mais tempo pensando e menos tempo “chutando.” Isso tinha um efeito fantástico na mente dos jovens programadores, porque eles conseguiam descobrir erros apenas olhando o código, com o advento da programação interativa, esses programadores tiveram um grande aumento em sua produtividade, porém os novos programadores tiveram menos oportunidade de “pensar.”
O fato é que não podemos negar a importância desse tipo de exercÃcio para o desenvolvimento do raciocÃnio, sim, porque para desenvolver nossa habilidade precisamos de exercÃcio! Atualmente não é mais necessário do ponto de vista de custo e acessibilidade, realizar esse tipo de tarefa no papel como era no passado, mas esse tipo de exercÃcio ganhou um novo ponto de destaque, se não por necessidade, por permitir que o estudante desenvolva uma capacidade fundamental para o desenvolvimento de aplicações profissionais.
O teste de mesa é feito utilizando algum recurso para escrever (pode ser papel ou até mesmo no computador) e a pessoa atua como se fosse o processador da máquina interpretando o programa. Para pequenos programas isso é rápido de fazer, mas se você tiver que controlar 5 variáveis dentro de um loop a coisa já começa a ficar mais complicada.
“Ah, mas para que eu quero saber isso?” bom de cara posso falar que esse tipo de atividade é cobrada em provas de certificação onde, por serem executadas em ambiente controlado, não é possÃvel usar um compilador para nos ajudar. Além disso, ajuda tremendamende a desenvolver o raciocÃnio. Mas até aqui não falamos em como fazer isso.
Não existe uma fórmula fixa, mas vou apresentar um conjunto de dicas de como se sair melhor:
- Identifique claramente as variáveis que serão controladas – as vezes uma variável do programa não faz parte do contexto que será analizado, exceto no caso de variáveis globais.
- Identifique condições de parada – as vezes um loop é infinito em sua declaração, mas pode ser terminado com uma instrução de desvio como break, goto ou return.
- Identifique operações sem efeito - multiplicações por 1, adições com 0
- Identifique operações sem efeito “falsas” – multiplicações por 0, adições com 1
- Identifique casos em que a variável de controle do loop é modificada – não é muito comum usarmos isso atualmente, com as regras e normas da bom artesanato de software, mas eventualmente o programador pode ter inserido uma condição na qual vai modificar a variável de controle causando retorno ou adiantamento do loop.
- Crie uma tabela com todas as variáveis que estão sendo controladas – é difÃcil guardar muitos valores de cabeça, vale a pena escrever uma tabela com uma coluna para cada variável e uma linha para cada iteração de um loop por exemplo, assim conforme o programa vai avançando temos uma visão clara das mudanças nos valores.
- Chamada de função ou de método dentro de um loop – temos que ficar atentos para passagens de parâmetros que podem ser por valor ou por referência, o que pode mudar o valor das variáveis que estão sendo controladas de uma forma não muito óbvia, além disso temos que considerar o valor de retorno da chamada que pode influenciar as variáveis. Por fim temos que ficar atentos que uma chamada pode manipular variáveis globais e muitas vezes isso passa completamente desapercebido.
- Chamadas de função ou de métodos aninhadas – é importante ir acompanhando a pilha de chamadas para sabermos que variável foi passada para qual função, as vezes uma chamada se transforma em várias outras distribuindo os valores das variáveis. Imagine que uma variável passada por referência foi passada para uma nova chamada também por referência, seu valor pode ter sido alterado.
- Chamadas recursivas – recursão é o mecanismo que permite que uma função ou método chame a si próprio, o computador empilha a chamada esperando a resolução de valores que retornará permitindo a resolução de toda a pilha. Um caso clássico é o de fatorial, onde vão sendo feitas chamadas diminuindo o valor do parâmetro em 1, até que a última chamada passa como parâmetro “fatorial(1)” o que retorna “1,” isso então, permite retornar todos os valores e calcular o valor solicitado inicialmente. É necessário ficar atento porque muitas vezes em uma chamada recursiva as modificações de valor são pontuais e geralmente só estamos interessados no valor final, mas é necessário ter muita atenção!
Posteriormente vou disponibilizar alguns exemplos de teste de mesa de pequenos programas tentando exemplificar cada um desses casos.

Leave a Reply