Padrões de Codificação Visual Basic

Propósito da Padronização

            O principal motivo pelo qual se faz necessária uma padronização nos procedimentos de programação é que todos possamos “falar a mesma língua” e em procedimentos de manutenção a perda de tempo com entendimento seja a menor possível.

            Uma boa padronização de codificação resulta em códigos mais inteligíveis, precisos e comuns a todos os membros de uma equipe de desenvolvimento de projetos.

            O propósito de uma padronização não é “engessar” o programador de modo que sua criatividade se mantenha escondida, mas sim, manter um conjunto básico de requisitos que o programa deve ter para que qualquer outro desenvolvedor possa encontrar os pontos primordiais para um entendimento do fluxo de processamento.


Padrões de nomenclatura para objetos

Objetos devem ser nomeados com um prefixo consistente que permita uma rápida identificação do tipo do objeto e das propriedades e métodos relativos ao mesmo.

O padrão de nomenclatura para objetos no Visual Basic é descrito á seguir:

Objeto
Prefixo
Exemplo
Grupo de Projetos
grp
grpSalesController
Projeto
prj
prjSalesController
Form
frm
frmSales
Classe (Business Services)
cls
clsSales_bs
Classe (Data Services)
cls
clsSales_ds
Módulo
mod
modSales
User Controls
uct
uctTextBox
3D Panel
pnl
pnlGroup
ADO Data
ado
adoBiblio
Animated button
ani
aniMailBox
Check box
chk
chkReadOnly
Combo box, drop-down list box
cbo
cboEnglish
Command button
cmd
cmdExit
Common dialog
dlg
dlgFileOpen
Communications
com
comFax
Control (usado em procedures quando o tipo do objeto é desconhecido)
ctr
ctrCurrent
Data
dat
datBiblio
Data-bound combo box
dbcbo
dbcboLanguage
Data-bound grid
dbgrd
dbgrdQueryResult
Data-bound list box
dblst
dblstJobType
Data combo
dbc
dbcAuthor
Data grid
dgd
dgdTitles
Data list
dbl
dblPublisher
Data repeater
drp
drpLocation
Date picker
dtp
dtpPublished
Directory list box
dir
dirSource
Drive list box
drv
drvTarget
File list box
fil
filSource
Flat scroll bar
fsb
fsbMove
Form
frm
frmEntry
Frame
fra
fraLanguage
Gauge
gau
gauStatus
Graph
gra
graRevenue
Grid
grd
grdPrices
Hierarchical flexgrid
flex
flexOrders
Horizontal scroll bar
hsb
hsbVolume
Image
img
imgIcon
Image combo
imgcbo
imgcboProduct
ImageList
ils
ilsAllIcons
Label
lbl
lblHelpMessage
Lightweight check box
lwchk
lwchkArchive
Lightweight combo box
lwcbo
lwcboGerman
Lightweight command button
lwcmd
lwcmdRemove
Lightweight frame
lwfra
lwfraSaveOptions
Lightweight horizontal scroll bar
lwhsb
lwhsbVolume
Lightweight list box
lwlst
lwlstCostCenters
Lightweight option button
lwopt
lwoptIncomeLevel
Lightweight text box
lwtxt
lwoptStreet
Lightweight vertical scroll bar
lwvsb
lwvsbYear
Line
lin
linVertical
List box
lst
lstPolicyCodes
ListView
lvw
lvwHeadings
MAPI message
mpm
mpmSentMessage
MAPI session
mps
mpsSession
MCI
mci
mciVideo
Menu
mnu
mnuFileOpen
Month view
mvw
mvwPeriod
MS Chart
ch
chSalesbyRegion
MS Flex grid
msg
msgClients
MS Tab
mst
mstFirst
OLE container
ole
oleWorksheet
Option button
opt
optGender
Picture box
pic
picVGA
Picture clip
clp
clpToolbar
ProgressBar
prg
prgLoadFile
Remote Data
rd
rdTitles
RichTextBox
rtf
rtfReport
Shape
shp
shpCircle
Slider
sld
sldScale
Spin
spn
spnPages
StatusBar
sta
staDateTime
SysInfo
sys
sysMonitor
TabStrip
tab
tabOptions
Text box
txt
txtLastName
Timer
tmr
tmrAlarm
Toolbar
tlb
tlbActions
TreeView
tre
treOrganization
UpDown
upd
updDirection
Vertical scroll bar
vsb
vsbRate


Padrões de nomenclatura para objetos DAO/ADO

O padrão de nomenclatura para objetos DAO/ADO no Visual Basic é descrito á seguir:

Objeto
Prefixo
Exemplo
Connection
con
conSales
Recordset
rec
recEmployees
Command
com
comSuppliers
Container
con
conReports
Database
db
dbAccounts
DBEngine
dbe
dbeJet
Document
doc
docSalesReport
Field
fld
fldAddress
Group
grp
grpFinance
Index
ix
idxAge
Parameter
prm
prmJobCode
QueryDef
qry
qrySalesByRegion
Recordset
rec
recForecast
Relation
rel
relEmployeeDept
TableDef
tbd
tbdCustomers
User
usr
usrNew
Workspace
wsp
wspMine

Padrões de nomenclatura para Menus

Algumas aplicações usam menus e se faz necessária uma padronização para este tipo de objeto. Objetos Menu devem conter um prefixo “mnu” e seguido por um descritivo de cada subnível determinado. A seguinte tabela lista alguns exemplos:

Sequencia de Menu
Exemplo
File Open
mnuFileOpen
File Send Email
mnuFileSendEmail
File Send Fax
mnuFileSendFax
Format Character
mnuFormatCharacter
Help Contents
mnuHelpContents

Padrões de nomenclatura para controles não descritos

            Para controles não listados acima deve ser observado o prefixo “obj” para que os mesmos possam ser identificados como controles não intrínsecos da padronização Visual Basic.

Padrões de nomenclatura para variáveis e constantes

        Da mesma forma que objetos, constantes e variáveis necessitam de uma padronização bem formada. Este tópico lista alguns padrões recomendados para constantes e variáveis existentes no Visual Basic. Também são definidos alguns padrões de tipos de dados e identificação de escopo.

            Variaveis devem ser definidas com o menor nível de escopo possivel. Variáveis definidas com escopo público podem criar aplicações extremamente difíceis de entender. Variáveis definidas com escopo global fazem a sua reutilização e manutenção muito mais difíceis.

As variáveis em Visual Basic podem possuir o seguinte escopo: 

Escopo
Declaração
Visível em
Procedure
'Dim' em procedures, ou  functions.
O procedimento para o qual ela foi declarada.
Módulo
'Private' na seção declarations de um form ou módulo (.frm, .bas) .
Todos os procedimentos no módulo ou form.
Global
'Public' na seção declarations de um módulo (.bas)
Todos os lugares da aplicação


Em aplicações Visual Basic, variáveis globais somente devem ser usadas quando não existe outro meio de compartilhar dados entre formulários.  Quando se fizer necessária a declaração variáveis globais é uma boa prática manter todas dentro de um módulo específico (.bas).

É uma boa prática escrever o seu código o mais modular possível. Por exemplo, se sua aplicação mostra um dialog box, coloque todos os controles e código requeridos para executar esta tarefa em um form. Isto ajuda você a manter o código da aplicação organizado e reduzir o tempo com manutenção.

Exceto para variáveis globais, procedures e functions devem trabalhar somente nos objetos no qual eles estão definidos. Variáveis globais que são usadas em procedures devem ser identificadas na seção declarations, no início do procedimento.

Importante: Para argumentos de funções ou procedimentos que não sofrerem alterações no fluxo da rotina, deverá ser utilizada a cláusula ByVal que não referncia um ponteiro de memória para o valor informado com parâmetro. Para variáveis que necessitarem deste procedimento deverá ser usada a cláusula ByRef.

Prefixos de escopo de variáveis

            Os prefixos de escopo de variáveis a serem usados seguem descritos:

Escopo
Prefixo
Exemplo
Global
g
gstrUserName
Módulo
m
mblnCalcInProgress
Procedimento

dblVelocity

Variáveis com escopo Global devem ser declaradas como “Public” na seção Declarations do módulo.
Variáveis com escopo Módulo devem ser declaradas como “Private” na seção Declarations do módulo.
Variáveis com escopo Procedimento devem ser declaradas no início do procedimento.

Constantes

         Nomes de constantes devem ser mixados entre caracteres em caixa alta e caixa baixa. Isto serve para identificar exatamente o propósito dentro do sistema. Os prefixos para definição de escopo também devem ser usados para constantes. Por exemplo:

mintMaxUsrLista           ‘Número máximo de usuários numa lista (inteiro, local em módulo)
gstrNovaLinha              ‘Caracter para nova linha (string, global na aplicação)
        
Variáveis

            A declaração de variáveis é obrigatória em todos os módulos e ajuda a reduzir o número de bugs causados por ambiguidades. O item Require Variable Declaration do menu Option, tab Editor, deve estar checado.

Tipos de dados para variáveis

            Use os seguintes prefixos para identificar o tipo de dados de variáveis:

Tipo de Dados
Prefixo
Exemplo
Boolean
bln
blnFound
Byte
byt
bytRasterData
Collection object
col
colWidgets
Currency
cur
curRevenue
Date (Time)
dtm
dtmStart
Double
dbl
dblTolerance
Error
err
errOrderNum
Integer
int
intQuantity
Long
lng
lngDistance
Object
obj
objCurrent
Single
sng
sngAverage
String
str
strFName
Tipo definido pelo usuário
udt
udtEmployee
Variant
vnt
vntCheckSum
Enumerações
enm
enmWeekDays

Padrões para Estruturação de Código

Juntamente com a padronização de nomeação de variáveis e objetos uma boa padronização na estrutura de código (identação, comentários, etc) ajuda em muito a um melhor entendimento do fluxo de processamento.

Padrões para comentários em códigos

         Todas as funções e procedimentos devem conter um breve comentário descrevendo suas principais características funcionais e um breve descritivo do retorno (se houver).

Ao lado de cada declaração de Variáveis deverá ser colocado um breve descritivo informando sobre o uso / finalidade do dado.

            Os itens a serem contemplados em um cabeçalho de função/procedimento seguem descritos:

Seção
Descrição do Comentário
Autor
Nome do autor do procedimento
Data da Criação
Data da criação do procedimento
Objetivo
O que o procedimento faz. (Não como), qual o objetivo.
Parâmetros entrada
Descrição dos parâmetros de entrada
Parâmetros de saída
Descrição dos parâmetros de saída ou tipo de retorno
Histórico
Histórico com data, autor e descrição dos procedimentos atualizados.

Sempre antes de um procedimento de decisão, looping ou chamada de um novo processo deve colocar um comentário informando sobre o que o procedimento que é executado.

Formatação de Código

         A formatação do código deve seguir os seguintes requisitos:

Ø  Instrução “On Error” sempre como primeiro item do procedimento
Ø  Utilizar o tab de 3 espaços;
Ø  Declarar os tipos de dados de variáveis tabulados;

Exemplo de formatação de código

'*************************************************************************
'  Autor      : Jose Roberto
'  Criação    : 01/01/1971
'  Objetivo   : Buscar a primeira ocorrência de um usuário especificado em
'               uma lista de usuários
'  Parâmetros Entrada : strUserList() - Lista de usuários a ser procurada
'                       strTargetUser() - Nome do usuário a ser encontrado
'  Parâmetros Saída   : O índice da primeira ocorrência do usuário encontrada
'  Histórico  : 21/05/2001 – Anderson   - Criação do parâmetro blnEncontrado
'
'*************************************************************************
Private Function intProcuraUsuario(ByRef strListaUsuarios() As String, ByVal strUsuario As String) As Integer

   On Error GoTo Trata_Erro

   Dim intContador     As Integer  'Contador do Loop
   Dim blnEncontrado   As Boolean  'Indicativo de usuário encontrado
       
   intProcuraUsuario = -1
   ingContador = 0
   
   For intContador = 0 To UBound(strListaUsuarios(), 1)
      If strListaUsuarios(intContador) = strUsuario Then
         blnEncontrado = True
         intProcuraUsuario = intContador
         Exit For
      End If
   Next intContador
       
Trata_Erro:
   If Err Then
      MsgBox Err.Number & vbNewLine & Err.Description, vbCritical
   End If

End Function

Padrões para obtenção de melhor performance

            Seguem abaixo os itens básicos necessários para um melhor ganho de performance em aplicações Visual Basic:

Para concatenação de string utilize sempre a quebra de linha “&  _” . Evite usar a concatenação por várias linhas de comando, pois esta processa linha a linha a concatenação de itens enquanto a primeira efetua apenas o processamento de uma linha de código;

Exemplo:

strSQL = ‘SELECT * ‘ & _
         ‘FROM TB_USUARIOS  ‘ & _
         ‘WHERE CODIGO = 1 ‘

Ø  Sempre que estiver tratando de objetos e necessitar fazer referência a mais de uma propriedade utiliza

Exemplo:

With frmTeste
   .Caption = ‘Form de Teste’
   .BackColor = vbRed
   .Top = 0
End With

Ø  Use constantes Visual Basic. O Visual Basic possui estas constantes compiladas e não necessita identificar tipos de dados quando estas constantes são referenciadas.

Exemplo:

Msgbox ‘Tem certeza que deseja sair do Aplicativo?“, vbQuestion + vbYesNo
     
Ø  Use tipo de dados Long ao invés do tipo integer quando estiver tratando de valores inteiros.  O tipo de dados Long é um tipo de dados nativo dos processadores Pentium e proporciona melhor performance em procedimentos de laço e matemáticos.

Exemplo:

Dim lngContador as Long   ‘Usa o tipo long para o contador

For lngContador = 0 to 1000
   Print lngContador
Next lngContador

Ø  Quando estiver utilizando procedimentos de divisão em que não necessite da parte frácionária do resultado ou tenha certeza que não haverá utilize a barra de divisão invertida (\) ao invés da comum (/). Com isto o processador não desvia para o co-processador matemático para calcular a parte fracionária da função, e não desviando para esta rotina existe um sensível ganho de performance em procedimentos com vários cálculos e laços.

Artigo retirado do site Empregos.com.br. Acesso em 13/06/2012

Nenhum comentário:

Postar um comentário