Você está na página 1de 48

Boas prticas de programao

CDSP - 18/07/2011

Boas prticas de programao


NDICE
I) Escrevendo o Cdigo Fonte
Estrutura do cdigo fonte
Legibilidade
Letras maisculas
Capitulao de palavras chave
Notao Hngara
Comentrios
II) Visibilidade e Nomenclatura
III) Proteo de Rotinas
IV) Desempenho
V) Dicas

Boas prticas de programao


Estrutura do Cdigo
Fonte
rea de cabealho

Nessa rea so declarados os arquivos de include,


variveis estticas e as constantes.

Boas prticas de programao


Estrutura do Cdigo
Fonte
rea de identificao

Nessa rea deve-se documentar o programa ou


funo. Contm comentrios explicando a sua
finalidade, data de criao, parmetros, retornos e
alteraes efetuados.

Boas prticas de programao


Estrutura do Cdigo
Fonte
rea de declarao de variveis e ajustes
iniciais

Nesta rea devem ser feitos os ajustes iniciais,


importantes para o correto funcionamento do
programa. Entre esses ajustes iniciais encontramse a declarao e inicializao de varveis,
abertura de arquivos, etc.
5

Boas prticas de programao


Estrutura do Cdigo
Fonte
Corpo do programa

o cdigo escrito para realizar a tarefa necessria


para atingir o seu objetivo.

Boas prticas de programao


Estrutura do Cdigo
Fonte
rea de encerramento

Nessa rea finalizamos a execuo da rotina


fechando reas de trabalho temporrias, limpando
filtros, restaurando reas salvas e retornamos o
resultado da rotina.
7

Boas prticas de programao


Legibilidade Identao
do cdigo
Identar o cdigo torna mais fcil identificar blocos de
comandos que faam parte de um loop ou estrutura
condicional.
Cdigo no identado

Cdigo identado
8

Boas prticas de programao


Legibilidade - Quebra de
linhas
Linhas muito longas podem dificultar a legibilidade,
nesses casos melhor quebrar a linha usando o ponto
e vrgula.
Sem quebra de linha

Com quebra de linha

Boas prticas de programao


Legibilidade - Espaos em
branco
Inserir espaos torna mais fcil identificar parmetros
de uma funo, distinguir as chaves em uma busca ou
visualizar os itens de um clculo.

10

Boas prticas de programao


Letras Maisculas
Existem alguns casos em que o cdigo deve ser escrito
em letras maisculas.
Cdigo SQL
Nome de campos

SELECT * FROM SN1990


SN1->N1_CBASE

Variveis de memria
Constantes

M->N3_CBASE

#Define PI 3.1415

11

Boas prticas de programao


Capitulao de palavras
chave
Uma conveno amplamente utilizada a de capitular
as palavras chaves, funes, variveis e campos
utilizando uma combinao de caracteres em
maisculo e minsculo, visando facilitar a leitura do
cdigo fonte.

12

Boas prticas de programao


Notao Hngara
Deve ser utilizada para identificar o tipo de contedo
de uma varivel.

13

Boas prticas de programao


Comentrios
Comentrios servem como documentao e explicao
de um cdigo fonte, mantendo um histrico e
facilitando
seu
entendimento
para
anlise
e
manuteno.
Comentar o fonte, facilita o entendimento por parte do
analista que precisar realizar manuteno e at
mesmo para quem o criou, mas lembre-se que
comentrio em excesso polui o cdigo e pode
atrapalhar, portanto use o bom senso.
No existe uma regra sobre o que se deve comentar ou
como, mas segue algumas dicas sobre o que comentar
e melhorar o entendimento do seu cdigo fonte.

14

Boas prticas de programao


Comentrios
Insira um cabealho e comente qual finalidade da rotina
ou funo, descrevendo quais parmetros devem ser
passados e qual deve ser o retorno esperado.
Comente a chave do ndice utilizado ao lado da funo
dbSetOrder()
Quando utilizar strings de um arquivo CH, insira um
comentrio ao lado com o texto da string.
Comente clculos, explicando qual sua lgica.
Comente trechos de cdigo, explicando de forma sucinta
sua finalidade.
15

Boas prticas de programao


NDICE
I) Escrevendo o Cdigo Fonte
II) Visibilidade e Nomenclatura
Padro de Nomenclatura
Visibilidade
III) Proteo de Rotinas
IV) Desempenho
V) Dicas

16

Boas prticas de programao


Padro de Nomenclatura
Cdigo Fonte
O nome do cdigo-fonte deve ser montado da seguinte
forma:
Famlias de Programas + Tipo de Operao +
Identificador Numrico.prw
Tipo de Operao

Utilizar

Entrada de
dados/processamento

Consulta de Dados

Relatrios

Funes genricas do
mdulo

O Tipo de operao indicado na tabela abaixo:

17

Boas prticas de programao


Padro de Nomenclatura
Exemplo de nome de Cdigo Fonte
Incluso de dados do mdulo Gesto de Pessoas ->
GPEA010.PRW
Trecho

Descrio

GPE

Famlia de programas do mdulo Gesto de Pessoas.

Entrada de dados.

010

Numerao de fonte disponvel.

.PRW

Extenso indicadora de que o arquivo um cdigofonte

18

Boas prticas de programao


Padro de Nomenclatura
Funes
As funes pertencentes a um cdigo-fonte podem ser
nomeadas de acordo com a sua aplicabilidade.

1
1 letra
letra do
do nome
nome do
do cdigo
cdigo fonte
fonte

Tipo
Tipo de
de Operao
Operao indicado
indicado no
no cdigo
cdigo
fonte
fonte

Identificador
Identificador do
do cdigo-fonte
cdigo-fonte

Abreviao
Abreviao descritiva
descritiva do
do que
que aa funo
funo
faz
faz

19

Boas prticas de programao


Padro de Nomenclatura
Exemplo de nome de Funo
Funo de incluso de dados no FINA050 -> FA050Inclu

Descrio
F

1. Letra do nome do cdigo fonte.

Tipo de operao (manipulao de dados)

050

Identificador do cdigo fonte.

Inclu

Abreviao do que a funo faz -> Incluso de


dados

20

Boas prticas de programao


Padro de Nomenclatura

Para funes genricas utilizadas em um determinado


mdulo, nomeia-se a funo diretamente de acordo com a
sua aplicabilidade.
Exemplos:
ValidaCpo() -> Valida contedo de campo
CalcJuros() -> Clculo de juros

21

Boas prticas de programao


Padro de Nomenclatura

Para variveis no existe um padro, porm deve-se utilizar


um nome de acordo com a sua finalidade, facilitando o
entendimento.
Exemplos:
cCodigo Varivel caractere para armazenar um
cdigo
cNF Varivel caractere com o nmero da Nota Fiscal
nCount Varivel numrica usada como contador
cMoeda Varivel caractere com o cdigo da moeda

22

Boas prticas de programao


Padro de Nomenclatura

No existe tamanho mximo para nomes de variveis e funes,


entretanto o compilador reconhece apenas 10 caracteres, ignorando o
restante.
As variveis nValorTituloPagar e nValorTituloReceber, so vistas pelo
compilador como nValorTitu

23

Boas prticas de programao


Visibilidade

Funes
Funes sem declarao (quando usadas a partir do menu
da aplicao), declaradas como Main ou User so visveis
em todo o sistema, carregando a pilha de memria,
portanto se forem usadas apenas no prprio cdigo fonte
devem ser declaradas como STATIC.

24

Boas prticas de programao


Visibilidade

Variveis
Apenas os tipos PRIVATE e LOCAL so utilizados, variveis
PUBLIC no devem ser utilizadas.
Normalmente apenas o tipo LOCAL utilizado o tipo PRIVATE
de ser usado apenas em casos extremamente necessrios e
devem ser avaliados.

25

Boas prticas de programao


NDICE
I) Escrevendo o Cdigo Fonte
II) Visibilidade e Nomenclatura
III) Proteo de Rotinas
Campos, Funes e Tabelas
Inicializao de variveis
Alias ativo
Tratamento de retorno de
funes
Especificar o alias do campo
Controle de Transao
Localizao
Banco de Dados
IV)Desempenho
V) Dicas

26

Boas prticas de programao


Proteo Campos, Tabelas e
Funes
Nos fontes do padro muito importante verificar a
existncia de campos, tabelas e funes. Essa precauo
evita erros nas rotinas quando so utilizadas em sistemas
desatualizados.
FieldPos Verifica a existncia de um campo, evitando que a
rotina tente manipular campos inexistentes. Retorna posio
numrica do campo.
AliasInDic Verifica se a tabela existe no dicionrio.
Retorna .T. ou .F.
FindFunction Verifica se uma funo est compilada no
repositrio. Retorna .T. ou .F.

27

Boas prticas de programao


Proteo Campos, Tabelas e
Funes
Exemplos:

28

Boas prticas de programao


Proteo Inicializao de
Variveis
Ao criar uma varivel inicializa-a com um valor padro.

Parmetros devem ser protegidos atribuindo um valor


padro, logo aps a declarao das variveis da funo,
caso a rotina chamadora no passe um valor.

29

Boas prticas de programao


Proteo Alias Ativo
Uma proteo muito importante em todas as funes
salvar o contexto do alias ativo e tambm daqueles
manipulados dentro da sua funo.
Essa proteo garante que sua funo no interferir na
execuo da funo chamadora. A funo GetArea() salva

em um array o nome do
alias, o ndice e o registro
atual.
J
a
funo
RestArea() restaura o alias
salvo.
Sempre salve o alias
ativo.
30

Boas prticas de programao


Proteo Tratamento de retorno
de funes
Quando chamar funes com algum retorno, utilize uma
estrutura condicional para verificar seu retorno.

31

Boas prticas de programao


Proteo Especificar o Alias
Ao manipular tabelas recomendvel sempre especificar na
frente do nome do campo e de funes o alias a ser usado.

Se no for especificado o alias e outro


analista alterar a rotina para manipular
outra
tabela,
incluindo
um
dbSelectArea() antes do While, a rotina
deixaria de funcionar.

32

Boas prticas de programao


Proteo Controle de Transao
Ao manipular dados garanta que os mesmos foram
gravados, utilizando o conceito de atomicidade, ou seja, a
transao deve gravar tudo ou nada.
Para isso utilize os comandos de controle de transao
Begin Transaction, End Transaction e DisarmTransaction.

Nunca coloque o EndTransaction dentro de um bloco


condicional ou a transao poder ficar presa.
Nunca inclua qualquer funo que dependa
interao com o usurio durante a transao

de

33

Boas prticas de programao


Proteo Controle de Transao

Exemplo
:

Se
alguma
rotina
de
gravao no for executada
corretamente, as anteriores
sero desfeitas

34

Boas prticas de programao


Proteo Localizao

Quando a execuo de parte do cdigo estiver condicionada


a uma determinada localizao deve-se testar o contedo
da varivel global cPaisLoc.

35

Boas prticas de programao


Sigla

Pas

ANG

Angola

ARG

Argentina

BOL

Bolvia

BRA

Brasil

CHI

Chile

COL

Colmbia

COS

Costa Rica

DOM

Repblica Dominicana

EQU

Equador

EUA

Estados Unidos da
Amrica

HAI

Haiti

MEX

Mxico

PAN

Panam

PAR

Paraguai

PER

Peru

POR

Porto Rico

PTG

Portugal

SAL

El Salvador

URU

Uruguai

VEN

Venezuela

Siglas dos pases disponveis


no Protheus para uso com o
cPaisLoc.

36

Boas prticas de programao


Proteo Banco de Dados

No AdvPL podemos trabalhar usando Queries no formato


SQL ANSI, criando datasets temporrios.
Se a rotina for para bases Top Connect e DBF, precisamos
validar para executar de acordo com a base em que o
sistema est rodando ou proteger para que no seja
executada se a base for DBF.
Para isso utilizamos as instrues #IFDEF TOP, #ELSE e
#ENDIF

37

Boas prticas de programao


Proteo Banco de Dados

38

Boas prticas de programao


NDICE
I) Escrevendo o Cdigo Fonte
II) Visibilidade e Nomenclatura
III) Proteo de Rotinas
IV)Desempenho
Comparativo entre funes
V) Dicas

39

Boas prticas de programao


Desempenho Comparativo entre
Funes
Comparativo entre algumas funes que podem ser
substitudas por outras similares que melhoram o
desempenho da rotina.

40

Boas prticas de programao


Desempenho Comparativo entre
Funes
MsSeek() Versus dbSeek()
MsSeek() possui as mesmas funcionalidades bsicas da
funo DbSeek(), com a vantagem de no necessitar
acessar novamente a base de dados para localizar uma
informao j utilizada pela thread (conexo) ativa.
Desta forma, a thread mantm em memria os dados
necessrios para reposicionar os registros j localizados
atravs do comando DbSeek (no caso o Recno()) de forma
que
a
aplicao
pode
simplesmente
efetuar
o
posicionamento sem executar novamente a busca.
A diferena entre o DbSeek() e o MsSeek() notada em
aplicaes com grande volume de posicionamentos, como
relatrios, que necessitam referenciar diversas vezes o
mesmo registro durante uma execuo.

41

Boas prticas de programao


Desempenho Comparativo entre
Funes
GetMV() Versus GetNewPar() Versus SuperGetMV()
GetMV() retorna o contedo de um parmetro e se ele no
existir o seu retorno depender dos parmetros lHelp e
xDefault. Se xDefault for informado o retorno, caso no
exista, ser xDefault e se no informado retorna .F. e exibe
Help para lHelp falso.
SuperGetMV() diferencia-se por armazenar em um array os
parmetros consultados, mas caso seja a primeira consulta
ao parmetro, aciona a funo GetMV().
GetNewPar() simplesmente aciona a rotina SuperGetMV().

42

Boas prticas de programao


Desempenho Comparativo entre
Funes
Posicione() Versus GetADVFVal()
A funo POSICIONE() permite o retorno do contedo de um
campo de um registro de uma tabela especificado atravs
de uma chave de busca enquanto que o GetAdvFVal()
retorna vrios campos.

Ambas as funes devem ser protegidas com GetArea() e RestArea()

43

Boas prticas de programao


NDICE
I) Escrevendo o Cdigo Fonte
II) Visibilidade e Nomenclatura
III) Proteo de Rotinas
IV)Desempenho
V) Dicas
Dicas teis

44

Boas prticas de programao


Dicas Algumas dicas teis

Operador == no o mesmo que =. Embora o


compilador no acuse erro, o resultado da comparao no
ser o mesmo. Espaos em branco fazem diferena na
comparao, utilize AllTrim para remov-los
Ao efetuar um Seek na tabela, cuidado com espaos em
branco, no utilize AllTrim para resolver, pois isso pode
mascarar um erro maior, como a diferena entre o
tamanho dos campos no banco de dados.
Cuidado com o conceito de Filial no sistema, ao utilizar um
Seek com a funo xFilial, utilize o alias correto como
parmetro.
45

Boas prticas de programao


Dicas Algumas dicas teis

Em Loops condicionados ao fim de uma tabela no


esquea de fazer um Skip, preferencialmente usando o
alias ( Ex. SNL->(dbSkip()) ). Se houver uma condio
dentro do While, verifique se o Skip ser executado.
Sempre que possvel utilize a passagem de parmetros por
referncia no lugar de variveis tipo Private.

46

Boas prticas de programao


Fonte de Consulta
Apostila Boas Prticas de Programao AdvPL Arnaldo Raymundo Junior
Apostila AdvPL Avanado - Arnaldo Raymundo
Junior
Colaborao
lvaro Camillo Neto
Arnaldo Raymundo Junior
Denis Ricardo Polastri
Ernani Forastieri
Marcello dos Santos Gabriel
Renan Guedes Alexandre
47

Boas prticas de programao

QUESTES
Danilo Dias
danilo.dias@totvs.com.br

48