Página 1 de 1

Criar função

Enviado: 16 Set 2015 21:29
por JoséQuintas
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.

Código: Selecionar todos

nNumero   := 5
nResultado := 0
Dobro()
? nResultado

PROCEDURE Dobro
   nResultado = nNumero * 2
   RETURN
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.

Código: Selecionar todos

DO WHILE .NOT. Eof()
   nNumero = arquivo->Numero
   nResultado = 0
   Dobro()
   ? nResultado
   SKIP
ENDDO
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).

Código: Selecionar todos

DO WHILE .NOT. Eof()
   ? Dobro( arquivo->Numero )
   SKIP
ENDDO

FUNCTION Dobro
PARAMETERS nQualquerNome
   RETURN nQualquerNome * 2
Mas como seria em Clipper 5.x/Harbou:

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.

Criar função

Enviado: 17 Set 2015 09:45
por asimoes
Eu poderia fazer assim também:

Código: Selecionar todos

DO WHILE .NOT. Eof()
   nNumero = arquivo->Numero
   Dobro(@nNumero)
   ? nNumero
   SKIP
ENDDO

FUNCTION Dobro( nQualquerNome )
   nQualquerNome * 2
RETURN Nil

Criar função

Enviado: 17 Set 2015 10:45
por Duda 'Sgluber'
Quintas,

já li muitos tópicos seus ensinando o básico e/ou dando dicas valiosas. A iniciativa é nobre e você merece o meu elogio: PARABÉNS! Imagem

É aquela velha história: quem ensina, aprende novamente. E o que é rotineiro pra mim, pode ser uma novidade reluzente pra muita gente. Por outro lado, nós podemos aprender muito com quem começou há menos tempo e está dando os primeiros passos. Com humildade, aprendemos todos os dias e de muitas maneiras. Muitas vezes, quando relemos alguma coisa que já sabíamos, descrita de uma forma diferente de como aprendemos, vemos a mesma coisa por outro ângulo e surgem novas ideias. Isso é muito bom, extremamente saudável e faz a gente ser cada vez melhor.

Vou dizer mais: se houvesse mais literatura básica e didática sobre o Harbour, aposto que atrairia o interesse e a atenção de muita gente. Um dos motivos para uma linguagem cair em desuso e ficar nas mãos de um número cada vez menor de programadores é justamente a falta de literatura apropriada para quem quer começar.

Compartilhar: passar o conhecimento adiante. Acho que nada é tão simples ou básico que não possa ou não deva ser oferecido.

Aproveitando o assunto deste tópico, gostaria de acrescentar 2 coisas:

1 - Declarem adequadamente suas variáveis. TODAS e SEMPRE!

2 - Encapsulamento: este "palavrão" da OOP (que afugenta tanta gente), pode ser esclarecido de forma simplificada para quem está começando a estudar o assunto (como eu) com base nas declarações LOCAL que usamos nas funções. Ou seja: o que cada função utiliza é mantido dentro dela, como dentro de uma cápsula, sem interferir negativamente no restante do programa.
JoséQuintas escreveu:...
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.
...
Falou e disse... e falou comigo! Imagem