Escolar Documentos
Profissional Documentos
Cultura Documentos
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versões Anteriores
Podemos criar Classes próprias em Advpl ; bastando para tal nos utilizarmos dos
comandos de declaração de Classes , Métodos e Propriedades do Protheus. Veja abaixo
um modelo simples que exemplifica a utilização e declaração de uma Classe de
Exemplo utilizando Advpl:
#INCLUDE "PROTHEUS.CH"
Return
// -------------------------------------------------------------------
-------------
// Declaracao da Classe Exemplo
// -------------------------------------------------------------------
-------------
CLASS Exemplo
ENDCLASS
Podemos utilizar os outros tipos de variáveis Advpl nas Classes , como variáveis Locais
, Private , Static , etc... Para acessarmos uma propriedade da classe atual , devemos
prefixá-la com :: ( dois sinais de 2 pontos )
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versões Anteriores
Notas:
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versões Anteriores
Comando SAY/PSAY
Funções
Conteudo Funcionalidade
C Exibe CR depois de números positivos
E Exibe numéricos com o ponto e a vírgula invertidos (formato Europeu)
R Insere caracteres diferentes dos caracteres de template
X Exibe DB depois de números negativos
Z Exibe zeros como brancos
( Envolve números negativos entre parênteses
! Converte todos os carecteres alfabáticos para maiúsculo
Templates
Conteudo Funcionalidade
X Exibe dígitos para qualquer tipo de dado
9 Exibe dígitos para qualquer tipo de dado
# Exibe dígitos para qualquer tipo de dado
! Converte caracteres alfabéticos para maiúsculo
* Exibe asterisco no lugar de espaços em branco inicias em números
. Exibe a posição do ponto decimal
, Exibe a posição do milhar
Comando GET
Funções
Conteudo Funcionalidade
A Permite apenas caracteres alfabéticos
C Exibe CR depois de números positivos
E Exibe numéricos com o ponto e vírgula invertidos (formato Europeu)
Insere caracteres diferentes dos caracteres de template na exibição mas não
R
insere-os na variável do GET
Permite rolamento horizontal do texto dentro do GET, <n> é um número
S<n>
inteiro que identifica o tamanho da região
X Exibe DB depois de números negativos
Z Exibe zeros como brancos
( Exibe números negativos entre parênteses com os espaços em branco iniciais
) Exibe números negativos entre parênteses sem os espaços em branco iniciais
! Converte caracteres alfabéticos para maiúsculo
Templates
Conteudo Funcionalidade
X Permite qualquer caractere
Permite apenas dígitos para qualquer tipo de dado, incluindo o sinal para
9
numéricos
# Permite dígitos, sinais e espaços em branco para qualquer tipo de dado
! Converte caracteres alfabéticos para maiúsculo
* Exibe um asterisco no lugar dos espaços em branco iniciais em números
. Exibe o ponto decimal
, Exibe a posição do milhar
Tecnicas de Programacäo Eficiente em AdvPl
Revisão: 17/07/2002
Abrangência
de correto funcionamento
eficiente
legível
reutilizável
extensível
portável
Ou melhor:
Codificação Auto-Documentável
O tamanho da variável cVar não é evidente por si só e não é facilmente verificado. Estes
mesmos 10 espaços estariam mais óbvios e ainda assim garantidos se a instrução fosse
escrita como:
cVar := Space(11)
O mesmo princípio pode ser aplicado para qualquer string longa de caracteres repetidos.
A função Replicate pode ser utilizada como a seguir:
Este tipo de programação deixa o código fácil de digitar, fácil de ler e mais flexível.
Utilização de Soluções Simples
Se o valor da variável nVar for igual a zero (0) no momento da execução desta linha de
código, ambas as comparações separadas pelo operador lógico .Or. serão efetuadas:
Após ser avaliada, a primeria comparação irá falhar. A segunda comparação será então
avaliada e falhará também. Como resultado, o código existente dentro da estrutura de
fluxo If não será executado. Tal código somente será executado quando o valor desta
variável for maior OU menor do que zero. Ou seja, sempre que for DIFERENTE de
zero, o que torna a linha a seguir mais eficiente:
If nVar != 0
Este tipo de alteração torna o código mais legível e o processamento mais rápido,
evitando a avaliação de instruções desnecessariamente.
If cVar $ "ABCD"
nVar := nVar + 1
nVar := nVar -1
++nVar
--nVar
Deve-se apenas tomar cuidado com a precedência destes operadores, pois o "++" ou o "-
-" podem aparecer antes ou depois de uma variável, e em alguns casos quando a
variável for utilizada dentro de uma expressão, a prefixação ou sufixação destes
operadores afetará o resultado. Para maiores detalhes, consulte a documentação de
operadores da linguagem AdvPl.
Existe uma diferença entre um bom hábito e perda de tempo. Algumas vezes estes
conceitos podem estar muito próximos, mas um modo de diferenciá-los é balancear os
benefícios de realizar alguma ação contra o problema que resultaria se não fosse
executada. Observe o exemplo:
Local nCnt := 0
For nCnt := 1 To 10
<código>
Next nCnt
Neste exemplo não há nenhum ponto negativo e nada errado ocorrerá se a variável não
for inicializada, portanto é aconselhável evitar este tipo de inicialização, pois não torna
o código mais seguro e também não expressa a intenção do código mais claramente.
Local nCnt
While ( nCnt++ < 10 )
<código>
EndDo
Em AdvPl, variáveis não inicializadas sempre tem seu valor contendo nulo (nil) a
princípio, o que fará com que uma exceção em tempo de execução aconteça quando a
instrução de repetição while for executada.
Utilização de Alternativas
Quando se está trabalhando em uma simples rotina, deve-se tomar algum tempo para
explorar duas ou três diferentes abordagens. Quando se está trabalhando em algo mais
complexo, deve-se planejar prototipar algumas a mais. Considere o seguinte código:
If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif
Um código de uma única letra, (A até E), foi informado para indicar a
cor de cabelo. Este código foi então convertido e armazenado como uma
string. Pode-se notar que a cor "Preto" será atribuída se nenhuma
outra opção for verdadeira.
Do Case
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
cColor := "Preto"
EndCase
Constantes em Maiúsculo
Isto é uma convenção que faz sentido. Em AdvPl, como em C por exemplo,
a regra é utilizar todos os caracteres de uma constante em maiúsculo,
a fim de que possam ser claramente reconhecidos como constantes no
código, e que não seja necessários lembrar onde foram declarados.
Utilização de Identação
Este é um hábito que todo programador deve desenvolver. Não consome
muito esforço para manter o código alinhado durante o trabalho, porém
quando necessário pode-se utilizar AP6 IDE para a reidentação de
código.
Considere o exemplo:
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
Utilização de Espaços em Branco
Espaços em branco extras tornam o código mais fácil para a leitura.
Não é necessário imensas áreas em branco, mas agrupar pedaços de
código através da utilização de espaços em branco funciona muito bem.
Costuma-se separar parâmetros com espaços em branco.
Capitulação de Palavras-Chave
Uma convenção amplamente utilizada é a de capitular as palavras
chaves, funções, variáveis e campos utilizando uma combinação de
caracteres em maiúsculo e minúsculo, visando facilitar a leitura do
código fonte. O código a seguir:
local ncnt
while ( ncnt++ < 10 )
ntotal += ncnt * 2
enddo
Local nCnt
While ( nCnt++ < 10 )
nTotal += nCnt * 2
EndDo
Utilização de Comentários
Comentários são muito úteis na documentação de programas criados e
para facilitar a identificação de processos importantes no futuro.
Devem sempre ser utilizados.
Sempre que possível, funções criadas devem ter uma breve descrição do
seu objetivo, parâmetros e retorno. Além de servir como documentação,
os comentários embelezam o código ao separar as funções umas das
outras.
#EX
If nLastKey == 27 // Se o nLastKey for igual a 27
#EX
#EX
"Aguarde. Reindexando (B1_FILIAL+B1_COD+B1_LOCAL) do arquivo:
\DADOSADV\SB1990.DBF"
#/EX
#EX
"Deletar este registro?"
#/EX
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
A impressão que se tem após uma leitura deste código é de que valores
estão sendo atribuidos às variáveis ou que constantes estão sendo
utilizadas. Se o objetivo é flexibilidade, o código anterior deve ser
substituído por:
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK 5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
Por exemplo, se existe uma mensagem comum como "Imprimindo, por favor
aguarde..." em muitas partes do código, corre-se o risco de não seguir
um padrão para uma das mensagens em algum lugar do código. E mantê-las
em um único lugar, como um arquivo de cabeçalho, torna fácil a
produção de documentação e a internacionalização em outros idiomas.