Árvore de páginas

Tipagem de Dados


Abrangência:


Versão 12




1. Introdução


Este documento mostra a utilização da tipagem de dados na linguagem ADVPL, ou seja, para fontes com extensão ".prw".
Para quem está desenvolvendo em TLPP (extensão ".tlpp"), há muitos avanços em tipagem de dados. Confira a documentação de Tipagem em TLPP.
2. Requisitos


Para a utilização dos recursos de tipagem de dados são necessários os requisitos:
  • TOTVS Appserver 2.0, binário a partir de dezembro/2014;
  • Pré-processador, dezembro 2014, atualizado no TDS;

3. Tipos de Dados


Os tipos de dados disponíveis são: numeric, character, date, codeblock, logical, array e object.
Uma letra é utilizada para indicar cada tipo de dado, essa letra será mostrada nas mensagens de erro.

Tipo

Descrição

Indicador

numeric

Utilizado para valores numéricos inteiros ou decimais, positivos ou negativos.

N

char / character

Utilizado para valores do tipo caracter

C

date

Utilizado para armazenar datas

D

block / codeblock

Armazena um bloco de código para macro execução

B

logical

Armazena valores lógicos, verdadeiro (.T.) ou falso (.F.)

L

array

Utilizado para armazenar uma matriz de valores

A

object

Armazena objetos de interface ou classes

O

variadic

Utilizado para passagem de parâmetros de quantidades variáveis em funções

H


4. Funções


A criação de funções com o uso de tipagem de dados deve seguir a seguinte sintaxe:

Function <Nome da Funcao>([<parametro1> as <Tipo1>, <paramentroN as <TipoN>]) [as <Tipo>]

...

Return


O <Nome da Funcao> deve seguir os mesmo critérios usados em uma função sem tipagem de dados.
Cada parâmetro deve ser especificado com o tipo de dado desejado.O retorno da função também pode ter um tipo de dado indicado.
5. Classe


A uso de tipo de dados em classes deve usar a seguinte sintaxe:

Class <Nome da Classe>


      // Declaração de propriedades

      Data <nPropriedad1> [as <tipo>]

      Data <nPropriedad2> [as <tipo>]

     

      // Declaração de métodos

  Method New()       // Construtor, retorna Self

  Method <Nome do Método>([<Param1>, <Param2>,...,<ParamN>]) [as <tipo>]


EndClass


// Construtor da Classe

Method New() Class <Nome da Classe>


Return Self


// Definição de métodos

Method <Nome do Método>(nParam1) Class <Nome da Classe> [as <tipo>]

Local n1 as numeric


Parameter <Param1> [as <tipo>]


ConOut("Classe:MethodA")


Return n1


Em classes, podemos utilizar a tipagem de dados em propriedades e métodos.
Na construção de métodos os parâmetros e seus respectivos tipos devem ser especificados após a declaração das variáveis locais.
6. Compilação


No processo de compilação de código fonte, que utilize os recursos de tipagem de dados, serão avaliados conforme as definições, as variáveis, parâmetros e retorno de dados.
Caso alguma inconsistência na definição dos tipos seja encontrada será emitida uma mensagem de warning mostrando em qual linha está à divergência na declaração dos dados.

Por exemplo, na compilação do código fonte abaixo:

#include  "protheus.ch"


Function xTipagem()

Local c1 as character

Local n1 as numeric


n1 := "ABCDE"

c1 := 10


Return


Temos o seguinte resultado na compilação:

TIPAGEM.PRW(7) warning W0015 Incompatible Types : cannot convert from 'C' to 'N'

TIPAGEM.PRW(8) warning W0015 Incompatible Types : cannot convert from 'N' to 'C'


7. Execução


Durante a execução de uma função e/ou classe que utilize o recurso de tipagem de dados existe uma verificação do tipo da variável que é utilizada na passagem de parâmetro com o que foi definido no protótipo da função.
Caso os tipos de dados sejam diferentes será exibido uma mensagem no console do TOTVS AppServer e o valor NIL será atribuído a variável que foi passada como parâmetro, causando um comportamento diferente do esperado ou erro de tipo de dado.
Para exemplificar este comportamento temos o seguinte exemplo:

User Function xTMain()

Local c1 as character

Local l1 as logical


c1 := "ABCDE"

l1 := .T.


ConOut("Chamada 1 - xTLog")

ConOut(U_xTLog(l1))


ConOut("Chamada 2 - xTLog")

ConOut(U_xTLog(c1)) //Invalid parameter

Return


User Function xTLog(l1 as logical)

 If l1 = .T.

ConOut("Logical .T.")

Else

ConOut("Logical .F.")

EndIf


Return l1


Neste exemplo temos duas funções sendo que a primeira (xTMain) faz duas chamadas da função xTLog, sendo que a primeira chamada utiliza um parâmetro lógico, como esperado no protótipo da função e a segunda utiliza um parâmetro do tipo character, incorreto para a função.
Após a execução temos os seguintes resultados:
Chamada 1 – xTLog
Logical .T.
.T.

Chamada 2 - xTLog
*** Warning - Mismatched parameters type calling U_XTLOG at parameter 1 - expected L -> C
Logical .F.
NIL


Na chamada 1 a execução ocorre conforme o esperado pois o parâmetro utilizado é do mesmo tipo indicado no protótipo da função.
Na chamada 2 é passado um parâmetro do tipo character, diferente do logical indicado no protótipo da função, sendo assim quando a função xTLog é executada o valor da variável l1 é NIL, diferente de true (.T.) atribuído a ela antes da chamada da função, sendo assim o resultado é diferente da primeira chamada.