Clipper On Line • Ver Tópico - Valor padrão para parâmetros em funções
Mudar para estilo Clássico
Projeto MiniGui - Biblioteca visual para Harbour/xHarbour
Postar uma resposta

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

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.

Código:
METHOD ValidateVendedor(window, name, lblname, acceptZero = .T.)
...
RETURN .T.


Mas ao tentar compilar, recebo erro:
Código:
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:
        IF acceptZero
            RETURN .T.
        ENDIF


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

Obrigado!

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

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:
Código:
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.

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

18 Jun 2020 22:08

alxsts,

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

Código:
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.

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

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.

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

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...

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

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.

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

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.

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

19 Jun 2020 10:03

Sobre valores default, 3 possibilidades que me lembro:

Código:

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 )

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

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.

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

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.

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

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.

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

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.
Postar uma resposta