Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Section

Qual a forma básica de declarar uma função tipadadar tipos aos parâmetros?

Function name (parâmetros) as Typeparm1 as type1, parm2 as type2, ..., parmN as typeN)


Visite os Tipos Nativos.No atual estágio, Static Function, Main Function e Function podem ser tipadas, sem restrições.
A tipagem para User Function (e possivelmente outras formas) ainda está em processo de validação e homologação.


Bloco de código
languagejava
titleExemplo - Declaração básica de propriedades tipadasparâmetros tipados
Function typedFunc(parm1 as Numeric, parm2 as Character) as NumericVariant

O compilador checa se o retorno da função é compatível com o seu tipo declarado?
Sim, o compilador verifica e está bem atento a isso, para que a qualidade dos produtos Protheus seja cada vez melhor.
Os exemplos seguintes retratam, respectivamente, uma função sem erros de compilação e outra com erro de retorno. 



Quais são as checagens feitas em relação aos parâmetros?
Existem dois momentos em que a consistência dos parâmetros é checada:

  1. Em tempo de compilação
    1.  verifica se a quantidade de argumentos passados é coerente;
    2. verifica se os tipos dos argumentos passados são compatíveis com os tipos declarados.

  2. Em tempo de execução
    1. realiza os mesmos tratamentos de tempo de compilação;
    2. tem o potencial de olhar também funções ou métodos que foram definidos em outros fontes.


Bloco de código
languagejava
titleExemplo - Função com retorno compatívelChecagem de Parâmetros em Tempo de Compilação
Function typedFunc(nVar as Numeric, cVar as Character) as NumericLogical
Local nVar := 10 as Numeric
Return nVar
Bloco de código
languagejava
titleExemplo - Função com retorno incompatível
Function typedFunc() as Numeric
Local cVar := "I Love TLPP"
Return cVar  // ERRO DE COMPILAÇÃO (Função Numeric tentando retornar um Character)

E o compilador também vai olhar as chamadas de funções?
Sim, o compilador também vai ficar atento a isso. No atual estágio, se a função chamada estiver no mesmo fonte, poderemos checar eventuais inconsistências de tipos.

 lVar as Logical
lVar := IIF(cVar == "TLPP", .T., .F.)
lVar := lVar .AND. (nVar == 1)
Return lVar

Function Test()Local lVar as Logical
lVar := typedFunc(2, "TLPP")  // Compilação OK
lVar := typedFunc("TLPP", 2)  // Erro de Compilação
lVar := typedFunc(1)          // Erro de Compilação
Return .T.


Agora, considere uma função f2 declarada em um fonte diferente de Function Test.
Admita ainda que a Function f2 tenha a seguinte linha declarativa:

Function f2(nVar as Date)

Bloco de código
languagejava
titleExemplo - Função com retorno incompatívelChecagem de Parâmetros em Tempo de Execução
Function typedFuncTest() as Numeric
Local nVardVar := 10 as Numeric
Return nVar
Function typedTestdate() as LogicalDate
Local cVar := "I Love TLPP" dtos(dVar) as Character
Localf2(dVar) cResult as Character
cResult := cVar + typedFunc() // ERRO DE COMPILAÇÃO (typedFunc é Numeric e, portanto, não pode ser somada a cVar, que é Character.
Return .T// Ok, sem problemas
f2(cVar)  // Valendo-se da tipagem, dará erro em tempo de execução.
Return .T.


No exemplo anterior, o runtime faz-se valer da tipagem dos parâmetros para acusar erro na segunda chamada a f2.
É importante frisar que esse erro acontece no ato da chamada da função, podendo antecipar problemas que só viriam à tona em um nível mais profundo da stack de execução.