Clipper On Line • Ver Tópico - Valor padrão para parâmetros em funções

Valor padrão para parâmetros em funções

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Valor padrão para parâmetros em funções

Mensagempor Heero » 18 Jun 2020 20:16

Olá pessoal.

Peço desculpas se já existir algo relacionado no fórum, mas não achei mesmo. Se houver peço por favor que deletem este tópico.

No meu caso uso Minigui e Harbour 3.2. Tem como definir um valor padrão para um parâmetro de uma função ?

No exemplo abaixo, caso o acceptZero não for passado na chamada, irá assumir true.

METHOD ValidateVendedor(window, name, lblname, acceptZero = .T.)
...
RETURN .T.


Mas ao tentar compilar, recebo erro:
d:\loja-windows\config\..\app\modules\class\JsysValidateFilterForm.prg(69) Error E0030  Syntax error "syntax error at '='"


Então estou contornando isso deste jeito:
        IF acceptZero
            RETURN .T.
        ENDIF


Mas para evitar repetição de código gostaria de fazer da primeira maneira, é possível?

Obrigado!
Ricardo Rodrigues
Harbour 3.2 + BCC + Minigui
Cursando Análise e Desenvolvimento de Sistemas
Heero
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 51
Data de registro: 13 Jul 2015 22:10
Cidade/Estado: Guarulhos/SP
Curtiu: 13 vezes
Mens.Curtidas: 5 vezes

Valor padrão para parâmetros em funções

Mensagempor alxsts » 18 Jun 2020 20:43

Olá!

Da forma como você codificou vai dar erro mesmo. Tanto para funções quanto para procedures e métodos, os parâmetros são recebidos na assinatura destes elementos. Caso precise verificar se o parâmetro foi passado (o que é uma das boas práticas em programação), existem algumas formas.

Utilizando o teu código como exemplo:
METHOD ValidateVendedor(window, name, lblname, acceptZero) // ==> Aqui falta o nome da classe à qual o método pertence <==
// por exemplo: METHOD ValidateVendedor(window, name, lblname, acceptZero) CLASS NomeDaTuaClasse
...
   If acceptZero == NIL
      acceptZero := .T.
   Endif

// ou

   If Hb_IsNil( acceptZero )
      acceptZero := .T.
   Endif

// ou
   
   If Empty( acceptZero )
      acceptZero := .T.
   Endif
   
// ou

   acceptZero := If( Hb_IsNil( acceptZero ), .T., acceptZero )
   acceptZero := If( acceptZero == NIL, .T., acceptZero )
   acceptZero := If( Empty( acceptZero ), .T., acceptZero )
   
RETURN .T.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Valor padrão para parâmetros em funções

Mensagempor Heero » 18 Jun 2020 22:08

alxsts,

Obrigado pela resposta. Sobre a classe, é pq não copiei do código mesmo kkkkkkkkkkkkkkk. Mas está assim:

METHOD ValidateVendedor(window, name, lblname, acceptZero) CLASS JsysValidateFilterForm


De qualquer forma, obrigado por deixar claro de como lidar com essa questão dos parâmetros.
Ricardo Rodrigues
Harbour 3.2 + BCC + Minigui
Cursando Análise e Desenvolvimento de Sistemas
Heero
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 51
Data de registro: 13 Jul 2015 22:10
Cidade/Estado: Guarulhos/SP
Curtiu: 13 vezes
Mens.Curtidas: 5 vezes

Valor padrão para parâmetros em funções

Mensagempor Vlademiro » 18 Jun 2020 22:32

A função hb_default resolve esse problema.

Funciona assim

Hb_default( @cvar , "" )

Use ela no início do código, logo após receber o parâmetro.

Uma vantagem é que se o tipo de dado passado for diferente do tipo de dado do valor default, então o valor default é usado. Aí resolve ao problema do NIL.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Valor padrão para parâmetros em funções

Mensagempor alxsts » 19 Jun 2020 01:30

Olá!
Vlademiro escreveu:A função hb_default resolve esse problema.

Sim, não tenho dúvidas quanto a isto.

Propositalmente deixei esta função fora dos exemplos que postei acima, mais por uma questão de gosto pessoal. Acho esta função pouco clara, tanto que gerou dúvidas em outro tópico aqui do fórum, que contou com importante participação do colega Vlademiro. Outro ponto que não gosto é usar passagem de parâmetros por referência. Penso que este é outro ponto que dificulta a legibilidade do código...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Valor padrão para parâmetros em funções

Mensagempor Vlademiro » 19 Jun 2020 08:21

Era eu lá kkkk
Como passa rápido o tempo.

Infelizmente o Harbour é mal documentado, a gente descobre muita coisa nos grupos. Por isso aqui é importante.

Tb não gosto de passagem por referência, mas acabei me rendendo dada a praticidade.

Mas tb tem hb_defaultValue que faz a mesma coisa e não usa referência. Ela retorna o valor.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Valor padrão para parâmetros em funções

Mensagempor JoséQuintas » 19 Jun 2020 09:56

alxsts escreveu:Outro ponto que não gosto é usar passagem de parâmetros por referência. Penso que este é outro ponto que dificulta a legibilidade do código...


Isso é a melhor coisa que existe, é justamente isso que deixa os fontes independentes
Mas é lógico... como tudo na programação, não é pra exagerar e colocar em todo e qualquer fonte.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Valor padrão para parâmetros em funções

Mensagempor JoséQuintas » 19 Jun 2020 10:03

Sobre valores default, 3 possibilidades que me lembro:


FUNCTION x( a, b, c )

IF PCount() < 3
   c := 0
   IF PCount() < 2
      b := 0
      IF PCount() < 1
         a := 0
      ENDIF
   ENDIF
ENDIF

FUNCTION x( a, b, c )

a := iif( a == NIL, 0, a )
b := iif( b == NIL, 0, b )
c := iif( c == NIL, 0, c )

FUNCTION x( a, b, c )

hb_Default( @a, 0 )
hb_Default( @b, 0 )
hb_Default( @c, 0 )

José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Valor padrão para parâmetros em funções

Mensagempor JoséQuintas » 19 Jun 2020 10:18

Convém lembrar também do seguinte:

Existe a forma correta de programar, e a forma errada.

TALVEZ seja problema usar hb_Default() se programar igual os tempos de quando não existia variável LOCAL.

Aquele negócio de:

FUNCTION x
PARAMETERS a, b, c

hb_Default( @a, 0 )
hb_Default( @b, 0 )
hb_Default( @c, 0 )

Nem faço idéia, talvez nesse caso tenham resultados imprevisíveis, porque as variáveis nem vão existir.

É apenas um comentário, porque nunca se sabe o que cada um vai usar no fonte.
Geralmente a gente se baseia no que é comum, e acontece de usarem tudo de forma errada.
Às vezes pego fontes com essas exceções, talvez 1 vez a cada ano, mas acontece.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Valor padrão para parâmetros em funções

Mensagempor Itamar M. Lins Jr. » 19 Jun 2020 11:53

Ola!
Antigamente, convencionou-se como padrão usar:
Para comparar "if x = 0" então numa passagem de parâmetros o uso xFunc(a,b,x=0) mas neste caso x vai como se fosse "if x=0"
Então para melhorar a leitura do código, "de uns tempos para cá" usamos para atribuir os dois pontos ":".
xFunc(a,b,x:=0) logo na leitura já estamos percebendo que está atribuindo e não comparando.
X=A pode ser entendido como; Se X for igual a A, mas com os dois pontos não tem esse "talvez".
X := A, mesmo se colocar "IF" está atribuindo e sempre vai retornar .T.
Dai veio a necessidade de usar "==" para comparação.
IF A = "A " retorna TRUE
IF A == "A " retorna FALSE
Então a boa pratica diz o seguinte:
Sempre que atribuir usar ":=" e sempre que comparar usar "=="
Se deseja ver se contém usamos "$"

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Valor padrão para parâmetros em funções

Mensagempor JoséQuintas » 19 Jun 2020 14:15

Me perdi um pouco, mas entendi.

De qualquer jeito, NÃO é aceito colocar na definição de função.

O Itamar apenas indicou sobre o uso de sinal de igual.

x = 10
x = iif( x = 10, x = 11, x = 10 )
? x

Isso confunde principalmente o compilador.

Qual vai ser o valor de X?

10 ? 11 ?

Não, o valor de x vai ser .F.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Valor padrão para parâmetros em funções

Mensagempor Itamar M. Lins Jr. » 19 Jun 2020 14:34

Ola!
Existe variantes quando comparamos, se vai ou não contar com os espaços em branco, ou toda a string veja:
cA := "A"+space(20)
If cA = "A" //return true
If cA == "A" //return false.
Dai ainda tem isso:
SET EXACT ON
If cA = "A" //return false
SET EXACT OFF
? "12345" = "123" // Result: .T.

Por isso não é mais aconselhavel usar "set exact on", se usar ter cuidado!
E usar sempre os sinais :=, ==

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro