8 de setembro de 2014

O "Using" é somente "Using"???

Fala pessoas!

Hoje vou falar de uma coisa simples e besta mas que é, no mínimo, interessante.
Antes de iniciarmos, vamos rever algumas coisas que já sabemos:

  1. Todos nós já sabemos que podemos realizar a passagem de parâmetros para um FORM usando as opções USING e CHANGING. 
  2. Também sabemos que temos a opção de passar variáveis por REFERÊNCIA ou por VALOR, assim como em inúmeras outras linguagens de programação. 
  3. Finalmente, sabemos que o "USING" é destinado aos parâmetros de ENTRADA e, por "pseudo-lógica", não tem seu valor alterado, já o CHANGING é destinado aos parâmetros de SAÍDA e tem seu valor alterado. 

Tudo certo quanto ao nosso conhecimento? Nem tanto...
Seja esse código abaixo:

DATA: lv_num1 TYPE i.

  lv_num1 = 10.
  WRITE: lv_num1, ' = variável início'.
  NEW-LINE.

  lv_num1 = 10.
  PERFORM z_using USING lv_num1.
  WRITE: lv_num1, ' = variável using'.
  NEW-LINE.

  lv_num1 = 10.
  PERFORM z_using_value USING lv_num1.
  WRITE: lv_num1, ' = variável using value'.
  NEW-LINE.

  lv_num1 = 10.
  PERFORM z_changing CHANGING lv_num1.
  WRITE: lv_num1, ' = variável changing'.
  NEW-LINE.

  lv_num1 = 10.
  PERFORM z_changing_value CHANGING lv_num1.
  WRITE: lv_num1, ' = variável changing value'.
  NEW-LINE.

FORM z_using USING pe_num TYPE i.
  pe_num = pe_num * 2.
ENDFORM.

FORM z_using_value USING VALUE(pe_num) TYPE i.
  pe_num = pe_num * 2.
ENDFORM.

FORM z_changing CHANGING pc_num TYPE i.
  pc_num = pc_num * 2.
ENDFORM.

FORM z_changing_value CHANGING VALUE(pc_num) TYPE i.
  pc_num = pc_num * 2.
ENDFORM.


Esse exemplo (mais besta do que simples) testa as possibilidades de parâmetros com a utilização do USING e CHANGING, mesclando as passagens por REFERÊNCIA e VALOR.
Apenas lendo o código, podemos definir o resultado como:

10 = variável início
10 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value

Certo??? Não!!!!
O retorno do programa é:

10 = variável início
20 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value

Reparem que a utilização do USING por REFERÊNCIA realiza a alteração do valor.

Aí você me pergunta: mas como assim a passagem utilizando USING, ou seja, passando um valor de ENTRADA, tem seu valor alterado?
Então eu respondo: Simples, porque sim (eu sei que a resposta é cretina, mas é a pura realidade, dessa vez o "Porque sim Zequinha" é válido).

Por definição, para que o valor não seja alterado quando utilizado via USING, o mesmo deve ser passado por VALOR (explicitando o VALUE) e não por REFERÊNCIA (implícito).
Resumindo, tanto os parâmetros de USING ou CHANGING podem ter o seu valor alterado.

Com isso, você começa a se questionar:
Então meu código funcionará corretamente, caso eu simplesmente arrancar todos os CHANGINGs do código?
Se você quiser alterara a variável de origem, sim.

E eu posso fazer isso?
Sim e não. Sim, irá funcionar. Não, pois isso envolve a metodologia de programação, sendo um modo para passagem de entrada e outro para passagem de saída. É quase igual a você entrar no seu carro pela porta do passageiro. Você pode fazer isso e funciona do mesmo modo, mas você tem um porta ao seu lado que serve para isso.

E o que isso vai mudar minha vida?
Em absolutamente nada!

Mas se isso não vai mudar nada, então por que é interessante eu saber disso?
Somente para você saiba que quando um determinado valor estiver sendo alterado inexplicavelmente, vale a pena verificar se você usou a variável desse valor como passagem de entrada (USING) em um FORM e realizou algo com ela.

Até mais e obrigado pelos peixes.