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

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Heero
Usuário Nível 2
Usuário Nível 2
Mensagens: 51
Registrado em: 13 Jul 2015 22:10
Localização: Guarulhos/SP

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

Mensagem por Heero »

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.

Código: Selecionar todos

METHOD ValidateVendedor(window, name, lblname, acceptZero = .T.)
...
RETURN .T.
Mas ao tentar compilar, recebo erro:

Código: Selecionar todos

d:\loja-windows\config\..\app\modules\class\JsysValidateFilterForm.prg(69) Error E0030  Syntax error "syntax error at '='"
Então estou contornando isso deste jeito:

Código: Selecionar todos

        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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem por alxsts »

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:

Código: Selecionar todos

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)
Heero
Usuário Nível 2
Usuário Nível 2
Mensagens: 51
Registrado em: 13 Jul 2015 22:10
Localização: Guarulhos/SP

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

Mensagem por Heero »

alxsts,

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

Código: Selecionar todos

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
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

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

Mensagem por Vlademiro »

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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem por alxsts »

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)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

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

Mensagem por Vlademiro »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

Sobre valores default, 3 possibilidades que me lembro:

Código: Selecionar todos


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 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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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 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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Responder