Função ou Método com parâmetros dinâmicos

Pessoal, não sei se no advpl ou tlpp teria esse recurso, seria possível eu ter uma função ou um método de classe onde os parâmetros passados para ele fossem de alguma forma dinâmicos. Algo como o fonte abaixo:


Function TestePar(cPar1,nPar2,lPar3)
//Processamento
Return

U_TestePar(cPar1 := 'texto',lPar3:=.T.)

U_TestaPar(nPar2:=99)

Seria interessante para funções com muitos parâmetros e que são usados conforme a necessidade.

1 curtida

Não entendi ao certo a NEcessidade. Existe como vocÊ definir o valor inical dos parametros, caso o usuairo não passe. na função basta vc decalrar o parametro como Default EX:

User Function PortMont(dDate,lRes,lRes2) Local nMes Local cMes, cAno Default lRes := .F. Default lRes2 := .F. return

Neste caso, o segundo e terceiro parametro ja tem um valor definido eu passando ou não

U_PortMont(Date()) // - pegaria o valor padrão dos outros parametros

U_PortMont(Date(),.T.) // - pegaria o valor padrão do seugndo parametro, e para o terceiro seria .T.

vc pode fazer uma validação dentro da função por exemplo para tornar mais "dinamico"

U_PortMont(Date(),iif(2>1,.T.,.F.)) // neste caso o segundo parametro sera .T. se a condição for verdade

1 curtida

Não seria valores default não, seria passar os parâmetros apenas que eu necessitasse, sem ficar colocando várias vírgulas na chamada da função. Como a gente geralmente faz Funcao(,‘texto’,3,{1,2,3}), ficaria apenas algo como Funcao(cTxt:=‘texto’,nOpc:=3,aTmp:={1,2,3}). OU algo semelhante a isso.

1 curtida

Porque inevitavelmente quando temos funções com tantos argumentos opcionais, é muito fácil se perder no meio de tantas vírgulas.

1 curtida

O Default não é nativo do ADVPL, ele está presente no protheus.ch, ele gera uma condição ternaria com IIF.

2 curtidas

Entendi, neste caso o ideal seria fazer igual o Daniel comentou via JSON, mas sinceramente eu acho que complica bem mais o entendimento da função.
E teria que adaptar as funções pra isso.
para não se perder nas virgulas da pra usar o ProtheusDoc no VS Code, ele funciona legalzinho ate

1 curtida

Cirilo,

Algumas linguagens implementam uma passagem de parâmetros que chamamos de argumentos nomeados, as vezes ouço falar também como parâmetros nomeados. Isso permite você identificar o parâmetro pelo nome e enviar por exemplo o trigésimo parâmetro como primeiro.

Umas das linguagens que implementa essa feature, é o Python. Veja um exemplo:


def divisao(primeiroValor, SegundoValor):
    return primeiroValor / SegundoValor

divisao1 = divisao(9, 3)
divisao2 = divisao(SegundoValor=3, primeiroValor=9)

print(divisao1)
print(divisao2)

Se o que você deseja em ADVPL, é isso? Infelizmente, isso não existe.


O ADVPL hoje suporte o parâmetro do tipo JSON, o que lhe permite declarar apenas um parâmetro, e dentro desse valor recebido, sendo um JSON, você pode possuir inúmeros valores, facilitando a implementação de novos valores e também o envio de dados:


function u_JsonParameter(jParameter as json)
//Processamento
return

u_JsonParameter({"valor1": 1, "valor2": 3})
u_JsonParameter({"valor3": 5, "valor7": 9})

Além do JSON, o ADVPL também permite a utilização do parâmetro do tipo Variadic, ele permite receber inúmeros parâmetros, agrupando os mesmo em uma lista, é semelhante a um array, mas a diferença está na chamada da função:


function u_VariadicParameter(vValues as variadic)
local nRead as numeric

if ValType(vValues) != "U"
    for nRead := 1 to vValues:vCount
        Conout(vValues:vArgs[nRead])
    next
endif

return

u_VariadicParameter(1, 2, 3, 4, 5, 6)
u_VariadicParameter(9 , 8, 7)
u_VariadicParameter(0)

Agora quanto as funções já existentes... O jeito é contar vírgula, eu costumo colocar um comentário com o nome do parâmetro para ficar mais fácil saber o que eu poderia estar enviando ali, leva mais tempo, fica mais extenso, mas evita erros e ajuda bastante durante a manutenção.


Documentações:

https://tdn.totvs.com/display/tec/Json

https://tdn.totvs.com/display/tec/Variadic

2 curtidas

Mais uma vez uma resposta excelente Daniel, muito obrigado pela ajuda, era exatamente essa minha dúvida e foi muito bem respondida.

1 curtida

Depois um tempo acho que acabaram implementando esse recurso:

https://tdn.totvs.com/pages/viewpage.action?pageId=776520543

2 curtidas