Um método ou função pode ter parâmetros opcionais. Por vezes a função é chamada com dois parâmetros, e outras vezes com três parâmetros. Todos sonhamos em aceder aos parâmetros sem contar os parâmetros, verificar se o parâmetro foi passado, ou simplesmente não ter de verificar se a variável associada ao parâmetro foi inicializada. Isto poderia tornar o código muito mais simples, e muito mais legível, sem todas as linhas “Se” ou “Contar parâmetros”.
Bem, não sonhe mais, e mude para 4D v19 R3! O método de gestão e parâmetros de função nunca foi tão fácil.
Aceder aos parâmetros
Agora, para parâmetros que declarou no protótipo de uma função ou método, se o parâmetro não for passado durante a chamada, a variável é instanciada para o valor vazio. Mesmo no modo compilado, já não se tem um erro de tempo de execução para isso. Nesta página de documentação, tem uma tabela com a correspondência para cada tipo de variável.
No exemplo seguinte, a função utiliza os parâmetros $param1 e $param2 sem verificação. Se, ao chamar a função, os parâmetros $param1 e/ou $param2 não forem passados, 4D instancia a variável de texto para uma cadeia vazia:
// "concate" function class
Function concate ($param1 : Text ; $param2 : Text)
Alert($param1+" "+$param2)
// "method1" method
$class.concate("Hello";" world") // Display: "Hello world"
$class.concate("Hello") // Display: "Hello "
$class.concate() // Display: " "
Tenham cuidado. Para que a 4D possa instanciar a sua variável, precisa de conhecer o tipo dessa variável. Se utilizar a notação ${i} e não tiver passado e declarado o parâmetro, obterá sempre um erro de execução no modo compilado.
Inicializar os parâmetros
Acabámos de ver que se um parâmetro não for passado, a sua variável associada é instanciada para o valor vazio. Por isso, agora pode utilizar a função Choose para definir directamente um valor se o parâmetro não for passado.
Aqui está um exemplo com um método e o comando #DECLARE instrução:
// "myAlert" method
#DECLARE($param1 : Text ; $param2 : Text)
$param1:=Choose(Count parameters>=1 ; $param1 ; "Hello")
$param2:=Choose(Count parameters>=2 ; $param2 ; "world")
Alert($param1+" "+$param2)
// "method1" method
myAlert() // Display: "Hello world"
E quanto aos componentes?
Para beneficiar desta simplificação, o método chamado e o método de chamada devem ser recompilados. Assim, no caso de um método partilhado entre a base anfitriã e um componente, ambos os projectos precisam de ser recompilados.
Mas, e quanto aos componentes compilados, cujas fontes não tenho? Não se preocupe, ainda pode utilizá-los como antes. Não há necessidade de alterar o seu código.
O que se segue?
Esta nova funcionalidade dá-lhe muitas ideias para os seus métodos e funções. Esteja à vontade para partilhar as suas dicas no fórum.