Se amas o próximo, evita o CLEAR
Demasiadas regressões acontecem porque alguém se esquece de fazer CLEAR ou de não fazer CLEAR a uma variável.
Estes são os cenários em que já vi o CLEAR ser usado:
-
Antes de atribuir o valor a uma variável;
-
Antes, durante ou depois de um ciclo (LOOP, DO ou outro), para fazer reset a uma variável auxiliar;
-
No início de uma rotina para iniciar os seus parâmetros;
-
Quando uma tabela interna grande já não é precisa, para libertar memória;
-
Porque é PRECISO fazer CLEAR a uma variável.
Vamos analisar cada um dos cenários:
1. Antes de atribuir o valor a uma variável
Custa a acreditar mas já vi isto várias vezes:
DATA sum TYPE i.
CLEAR sum.
sum = a + b.
É redundante. É inútil. É pateta.
Ou isto:
LOOP AT itbl INTO wa.
calc = wa-a + wa-b.
(...)
CLEAR calc.
ENDLOOP.
Não parece tão pateta como o primeiro exemplo, mas é.
Conclusão: é sempre inútil. Pára de fazer isto.
2. Antes, durante ou depois de um ciclo
Isto é inútil, claro:
LOOP AT itbl INTO wa.
(...)
CLEAR wa.
ENDLOOP.
Livra-te desse CLEAR.
Isto já não é inútil:
METHOD report_itbl_a.
DATA sum TYPE i.
LOOP AT itbl_a INTO wa.
CLEAR sum.
LOOP AT itbl_b INTO wb WHERE a = wa-a.
sum = sum + wb-value.
ENDLOOP.
WRITE: / wa-a, sum.
ENDLOOP.
ENDMETHOD.
No entanto, este CLEAR também pode ser evitado se encapsularmos o conteúdo do LOOP exterior:
METHOD report_itbl_a.
LOOP AT itbl_a INTO wa.
sum = sum_itbl_b( wa-a ).
WRITE: / wa-a, sum.
ENDLOOP:
ENDMETHOD.
METHOD sum_itbl_b.
result = REDUCE #(
INIT sum = 0
FOR wa in itbl_b WHERE ( a = a )
NEXT sum = sum + wa-value ).
ENDMETHOD.
Assim o CLEAR já não é necessário porque a variável auxiliar é local ao método SUM_ITBL_B.
A maior parte dos CLEARs podem ser evitados se o scope das variáveis auxiliares for o menor possível.
3. Para inicializar os parâmetros de uma rotina
Reumindo:
-
IMPORTING: Não podes nem deves fazer-lhes CLEAR;
-
CHANGING: Se a lógica de negócio o exigir, pode fazer sentido usar o CLEAR;
-
RETURNING: Isto é sempre passado por valor por isso começa já limpo, não há por que o limpar mais ainda;
-
EXPORTING: Como estes são passados por referência, foi sempre boa práctica usar CLEAR para limpar estes parâmetros logo no início da rotina. Mas o Clean ABAP sugere uma alternativa melhor: passá-los valor.
Conclusão: O único cenário em que o CLEAR pode ser usado é para limpar um parâmetro CHANGING.
4. Quando uma tabela interna grande já não é necessária
Se a RAM for escassa, é boa ideia tentar libertar memória pro-activamente o mais cedo possível. Mas nesse caso o CLEAR não é a melhor opção porque não liberta a memória imediatamente. Em vez disso, deverias usar o FREE.
5. Porque é PRECISO fazer CLEAR a uma variável
Pronto. Este é o único cenário em que usar CLEAR faz todo o sentido: a lógica de negócio precisar de limpar uma variável.
A conclusão é: evita ao máximo usar CLEARs. São das maiores causas de regressões. Principalmente naquele tipo de código horrível com rotinas de milhares de linhas seguidas e dúzias de variáveis globais. Curiosamente, usei um CLEAR há uns dias por esta razão já depois de ter escrito este artigo. E reparei nisso exactamente porque uso o CLEAR mesmo muito raramente (até há uns dias também o usava para limpar parâmetros EXPORTING mas vou deixar de o fazer agora que sei que podem ser passados por valor.
O Abapinho saúda-vos.