Criar função
Enviado: 16 Set 2015 21:29
Por incrível que pareça, tem programador que ainda não usa isso direito.
Pra uma função ser boa, ela tem que conhecer TUDO que usa, e não depender do fonte que a chama.
Isso é herança de quem programou em Clipper Summer, onde não precisava declarar variável, e o comum era PRIVATE.
E com certeza isso é ABUSAR da variável PRIVATE.
Qual o problema de uma função assim?
Obriga que todo fonte que a use contenha nNumero e nResultado.
Se for trabalhar com um arquivo, usando DO WHILE .NOT. Eof(), a cada registro vai ter que fazer isso.
Viu? Isso é um exemplo bem pequeno, apenas duas variáveis, mas já complica o fonte.
Se fosse no Clipper Summer, como seria melhor? (No Clipper Summer não tem LOCAL).
Mas como seria em Clipper 5.x/Harbou:
Acho que esse é um bom exemplo prático.
No caso do Clipper Summer, PARAMETERS assume que a variável é PRIVATE, é uma nova variável, não importa se existe o nome em outro fonte anterior à função. Da função pra baixo (o que a função chamar), vai existir. Isso impede que um nome de variável repetido tenha seu conteúdo alterado.
No caso do Clipper 5.x/Harbour: o parâmetro da função é LOCAL, uma variável que só existe dentro da função.
Não importa o que aconteça, ou que fonte seja executado antes/durante/depois, essa variável é apenas da função e de nenhum outro lugar.
Garante que se outro fonte usar o mesmo nome de variável, não vai ter nada a ver com esse.
É como se o nome dessa variável fosse FuncaoDobro_nQualquerNome, então é único. (usei o nome apenas pra efeito de exemplo).
Só olhar o fonte acima, no DO WHILE de arquivo, e ver a vantagem.
Agora só imaginar:
Uma função de apenas duas linhas.
Uma pequena mudança reduziu a complicação do fonte que usa a função.
Apesar de não dar pra perceber, a função passou a declarar a variável interna como LOCAL.
Agora só imaginar um fonte que abusa de PRIVATE, o quanto ele pode estar complicando tudo.
Mesmo que esteja tudo funcionando, do jeito errado vai precisar cada vez mais nomes diferentes de variáveis, e muitas vezes mais código fonte pra contornar problemas. É complicação atrás de complicação, cada vez complicando mais.
Às vezes, pra outro fonte, criam uma outra função igual só por causa de alterar o nome da variável usada.
Nota:
Tenho postado o que sei, com o objetivo de ajudar.
Não conheço nem 10% do Harbour, muita coisa nem sei pra que serve, arrisco a dizer que a grande maioria se encaixa neste perfil.
Conhecer muitas funções ajuda, mas saber criar funções é algo ilimitado, pode-se criar tudo que precisar.
Quem considerar este post como novidade:
Pratique bastante. Como é a base pra tudo, vai facilitar tudo.
Se é novidade depois de 20 anos... não queira mudar todos os fontes em 1 dia.
Um passo de cada vez e vai ter um resultado muuuito melhor, sem pressa.
O aprendizado não é progressão aritmética: em 10 dias não vai aprender 10 vezes mais.
É progressão geométrica, vai ser multiplicando.
Não multiplique complicação.
Tenha certeza de que está entendendo o que está fazendo, não tenha pressa.
Conforme isso for sendo multiplicado, é só alegria.
Vai fazer coisas que nem imaginaria conseguir há 20 anos atrás.
Pra uma função ser boa, ela tem que conhecer TUDO que usa, e não depender do fonte que a chama.
Código: Selecionar todos
nNumero := 5
nResultado := 0
Dobro()
? nResultado
PROCEDURE Dobro
nResultado = nNumero * 2
RETURN
E com certeza isso é ABUSAR da variável PRIVATE.
Qual o problema de uma função assim?
Obriga que todo fonte que a use contenha nNumero e nResultado.
Se for trabalhar com um arquivo, usando DO WHILE .NOT. Eof(), a cada registro vai ter que fazer isso.
Código: Selecionar todos
DO WHILE .NOT. Eof()
nNumero = arquivo->Numero
nResultado = 0
Dobro()
? nResultado
SKIP
ENDDO
Se fosse no Clipper Summer, como seria melhor? (No Clipper Summer não tem LOCAL).
Código: Selecionar todos
DO WHILE .NOT. Eof()
? Dobro( arquivo->Numero )
SKIP
ENDDO
FUNCTION Dobro
PARAMETERS nQualquerNome
RETURN nQualquerNome * 2
Código: Selecionar todos
DO WHILE .NOT. Eof()
? Dobro( arquivo->Numero )
SKIP
ENDDO
FUNCTION Dobro( nQualquerNome )
RETURN nQualquerNome * 2
Acho que esse é um bom exemplo prático.
No caso do Clipper Summer, PARAMETERS assume que a variável é PRIVATE, é uma nova variável, não importa se existe o nome em outro fonte anterior à função. Da função pra baixo (o que a função chamar), vai existir. Isso impede que um nome de variável repetido tenha seu conteúdo alterado.
No caso do Clipper 5.x/Harbour: o parâmetro da função é LOCAL, uma variável que só existe dentro da função.
Não importa o que aconteça, ou que fonte seja executado antes/durante/depois, essa variável é apenas da função e de nenhum outro lugar.
Garante que se outro fonte usar o mesmo nome de variável, não vai ter nada a ver com esse.
É como se o nome dessa variável fosse FuncaoDobro_nQualquerNome, então é único. (usei o nome apenas pra efeito de exemplo).
Só olhar o fonte acima, no DO WHILE de arquivo, e ver a vantagem.
Agora só imaginar:
Uma função de apenas duas linhas.
Uma pequena mudança reduziu a complicação do fonte que usa a função.
Apesar de não dar pra perceber, a função passou a declarar a variável interna como LOCAL.
Agora só imaginar um fonte que abusa de PRIVATE, o quanto ele pode estar complicando tudo.
Mesmo que esteja tudo funcionando, do jeito errado vai precisar cada vez mais nomes diferentes de variáveis, e muitas vezes mais código fonte pra contornar problemas. É complicação atrás de complicação, cada vez complicando mais.
Às vezes, pra outro fonte, criam uma outra função igual só por causa de alterar o nome da variável usada.
Nota:
Tenho postado o que sei, com o objetivo de ajudar.
Não conheço nem 10% do Harbour, muita coisa nem sei pra que serve, arrisco a dizer que a grande maioria se encaixa neste perfil.
Conhecer muitas funções ajuda, mas saber criar funções é algo ilimitado, pode-se criar tudo que precisar.
Quem considerar este post como novidade:
Pratique bastante. Como é a base pra tudo, vai facilitar tudo.
Se é novidade depois de 20 anos... não queira mudar todos os fontes em 1 dia.
Um passo de cada vez e vai ter um resultado muuuito melhor, sem pressa.
O aprendizado não é progressão aritmética: em 10 dias não vai aprender 10 vezes mais.
É progressão geométrica, vai ser multiplicando.
Não multiplique complicação.
Tenha certeza de que está entendendo o que está fazendo, não tenha pressa.
Conforme isso for sendo multiplicado, é só alegria.
Vai fazer coisas que nem imaginaria conseguir há 20 anos atrás.
