Você sabia que o operador = pode ser muito perigoso em suas customizações

No artigo de hoje vou abordar sobre o operador =, e o motivo dele ser perigoso em customizações se você não conhecer o conceito por trás dele (e que ele na verdade serve para atribuição de valores).

Há um tempo atrás, eu fiz um artigo explicando que o = e o == são diferentes (e podem trazer resultados diferentes), e que devemos sempre tentar optar pelo == nas boas práticas (caso queira se aprofundar, clique aqui para ver o artigo).

Mas o que poucos sabem, é que o operador com apenas 1 sinal de igual, também serve para atribuição! Isso mesmo, atribuir valores.

Eu estava conversando com meu grande amigo Daniel Buceli, e ele havia me perguntado sobre o atribuidor = ser de atribuição, e eu confesso que desconhecia que ele tinha esse propósito, ai fui no TDN e constatei que a explicação dizia que o operador = é um operador de atribuição simples (TDN – Operadores de Atribuição).

Então fui realizar um teste, montei um fonte onde eu fazia uma atribuição de valor com := e em seguida eu usava =, e sim jovens, ele alterou o valor da variável. Abaixo um print do teste:

Notem na linha 23 e 24 que as variáveis foram alteradas, conforme a esquerda no Debug

Então, o que podemos concluir é que, para não se confundir, e adotar como boas práticas em nossos códigos, é abolir o uso do operador =, para que não haja confusão se é uma atribuição simples ou um teste simples numérico.

Resumidamente, o que eu indico aos meus alunos como boas práticas, devemos optar por:

  • Quando for atribuição, usar o operador :=
  • Quando for testes de comparação igual, usar o operador ==

Caso você queira simular o teste que fizemos, abaixo segue o código fonte:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zOperad
Exemplo utilizando o operador = para atribuição
@type  Function
@author Atilio
@since 09/07/2021
/*/

User Function zOperad()
    Local aArea  := GetArea()
    Local nTotal := 0
    Local cNome  := ""
    Local cTexto := ""

    //Atribuição normal com :=
    nTotal := 10
    cNome  := "Daniel"
    cTexto += "[1] nTotal = " + cValToChar(nTotal) + ", cNome = " + cNome + CRLF

    //Atribuição com apenas =
    nTotal = 200
    cNome  = "Atilio"
    cTexto += "[2] nTotal = " + cValToChar(nTotal) + ", cNome = " + cNome + CRLF

    //Mostrando o resultado
    MsgInfo(cTexto, "Atenção")

    RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta