Criar função

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criar função

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Criar função

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Duda 'Sgluber'
Usuário Nível 3
Usuário Nível 3
Mensagens: 148
Registrado em: 11 Mar 2013 21:57
Localização: Interior de São Paulo

Criar função

Mensagem 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
Comecei pra valer nos tempos do MSX e nunca mais parei... grande caminhada! :-)
Responder