Você está na página 1de 33

Boas Prticas de Codificao VB6

1. Introduo 2. Propsito do Documento O propsito deste documento definir e detalhar caractersticas de boas prticas de Codificao do Visual Basic 6, relacionados diretamente com aspectos de qualidade. Seu foco est direcionado para o detalhamento das caractersticas, e se destina a detalhar eventos de performance, declarao, documentao. 3. Funcionalidades Neste Tpico sero detalhadas algumas boas praticas na elaborao da codificao no Visual Basic. Visando uma melhora de performance, declarao e documentao dos cdigos apresentados. 3.1. Procedimentos e Funes 3.1.1. Utilizar uma Sub quando o procedimento no retornar valor. Utilizar Function somente quando o procedimento necessitar retornar valores. Tambm observar padro de nomes para Function e Sub conforme especificao suplementar.

3.1.2. Avaliar o resultado de funes diretamente para os controles. Assim se houver uma funo VerificaSenha que retorna False/True, tem-se?

3.2. Declaraes 3.2.1. Definir variveis com nomes que identificam seu contedo.

3.2.2. Definir Tabelas(Type) com definies claras de cada campo

3.2.3. Definir nome dos Procedimentos Genricos com mesmo prefixo quando se trata do mesmo assunto Ex. FormulaINSS, FormulaIR onde formula neste caso identifica o assunto de modo genrico. Considerar a Especificao Suplementar para nomes de procedimentos. Notar que apesar de todos seguirem o mesmo prefixo, o mesmo no est de acordo com a Suplementar, onde para procedures locais, deve-se colocar o prefixo sub.

3.2.4. Definir nome das tabelas Iniciando com mesmo nome quando se trata do mesmo assunto Ex. Verba, VerbaTipoProcesso, VerbaIncidencia.

3.3. Configuraes 3.3.1. No VB6 desabilitar o uso da opo "Compile On Demand";

O interruptor de compilao de fundo s est disponvel se voc selecionar tambm Compile On Demand. Com esta opo ativada, o VB ir tentar compilar partes de sua aplicao. No garantindo que todos os erros sejam corrigidos. Ele no ir notific-lo de erros de compilao, aos quais no tenhan sido gerados por voc. 3.3.2. No VB6 selecionar as propriedades Auto Syntax Check e Require Variable Declaration

Quando a opo Auto Syntax Check est selecionado, faz exibir uma caixa de mensagem sempre que a sintaxe esta errada. Caso no esteja selecionado, o VB deixa a linha em vermelho e nunca permite executar um cdigo. Esta uma dica e pode ou no estar habilitada sob anlise de cada programador. Quando a opo Require Variable Declaration est selecionada, o VB ir verificar se todos os tipos de variveis foram declarados. Este um item mandatrio e deve estar selecionado. 3.4. Instrues SQL 3.4.1. Contemplar todas as informaes em um comando SELECT somente, quando for o caso, a fim de que o sistema torne-se lento em pesquisas em outras tabelas no momento da impresso, gerao de arquivos, clculos, atualizaes, etc.

3.4.2. Procurar utilizar o nome da tabela em comandos INSERT, UPDATE e DELETE sempre na mesma linha do comando. Facilita encontrar comandos de atualizao de tabelas quando houver alterao no banco de dados evitando esquecer de atualizar programas

3.4.3. Contemplar somente os campos necessrios no SELECT. Muitas vezes nos JOINs de tabelas que possuem muitos campos com muitos registros afetam na performance, tanto no SELECT quanto no MOVENEXT dos registros.

3.4.4. Procurar fazer sempre o JOIN com INNER e no no comando WHERE, quando for o caso.

3.4.5. Em leitura de tabelas onde necessite outros SQLs(looping dentro de looping) com tabelas de at 1000 registros utilizar o Filter

3.5. Legibilidade de Cdigo 3.5.1. Utilizar operadores Lgicos (And, Or, Not) quando for possvel

3.5.2. Tomar o cuidado ao utilizar os recursos do sistema de modo que este no complique a lgica ao invs de simplific-la.

3.5.3. Sempre que possvel utilizar mtodos com passagem de parmetros para tornar a manuteno posterior do cdigo simplificada.

3.5.4. Evitar a passagem de parmetros entre formulrios com o uso de variveis globais, nestes casos, utilizar propriedades especficas pra isso (uso dos comandos Get e Let)

3.5.5. Definir pesquisas em um nico local .BAS, Cada necessidade de alterao da consulta altera-se num mesmo local e todas as consultas do sistema sero alteradas

3.5.6. Evitar criar um procedimento muito extenso para incorporar todas as funcionalidades

3.5.7. Evitar utilizar menus indexados para chamada de programas. Utilizar a chamada sempre no ltimo nvel do menu

3.6. Repeties de Cdigo 3.6.1. Quando for possvel, utilizar uma varivel para indicar um mesmo status e posterior apresentao nica de uma mesma mensagem.

3.6.2. Reutilizar Funes (Function) ou rotinas Genricas do Sistema.

3.7. Tabelas 3.7.1. Definir campos em tabelas do banco de dados sempre com o mesmo nome nas diversas tabelas, quando se referenciar ao mesmo campo.

3.8. Tratamento de Erros 3.8.1. Em formulrios que possuem dois campos chave, na sada do primeiro campo, proteger o primeiro campo chave (enabled = false) e executar o comando supVoltaCampo para o prximo campo chave.

3.8.2. Tratar erros dentro das procedures;

3.8.3. Tratar erros em comandos SQL

3.9. Demais Boas Prticas a Considerar 3.9.1. Evitar a utilizao de comandos padres de bancos de dados especficos, uma vez que torna-se invivel no futuro a migrao para outro banco de dados 3.9.2. Evitar o agrupamento de rotinas que posteriormente retornaro sadas para diferentes lugares, como forma de reaproveitamento de cdigo, para depois ser necessrio tratamento com Ifs. 3.9.3. Comentar o cdigo fonte para auxiliar na manuteno. 3.9.4. Na abertura do formulrio forar a limpeza/inicializao dos campos;

3.9.5. Alinhar e endentar comandos IF,ELSE,ENDIF,FOR,NEXT,WHILE,WEND,DO,SELECT CASE,CASE.

3.9.6. Utilizar constantes sempre que possvel

3.9.7. Utilizar todas as variveis que forem declaradas 3.9.8. Destruir os formulrios e colees atribuindo a eles a declarao Nothing. 3.9.9. Passar variveis por valor ( ByVal ) ao invs de por referncia ( ByRef) . 3.9.10. Utilizar Select Case ao invs de If ElseIf , sempre que possvel. 3.9.11. Usar o controle Frame ao invs do controle Picture como container para outros controles, quando possvel. 3.9.12. Para tratar imagens preferir usar, quando possvel o controle Image ao invs do controle Picture, a menos que haja necessidade de caractersticas especiais que o ltimo prov. 3.9.13. Definir nos formulrios, quando possvel, a propriedade AutoRedraw para False e a popriedade ClipControls para False. 3.9.14. Se o processamento a realizar requer um tempo maior utilizar o componente do suporte para progresso do processamento concatenado uma mensagem dinmica para dar ao usurio uma idia de quanto j foi feito e quanto ainda falta... 3.9.15. Agrupar os procedimentos que tenham relacionamento entre si em um mesmo mdulo; 3.9.16. Procurar usar arrays dinmicos do que fixos. 3.9.17. Eliminar Debug.Print 3.9.18. Evitar converses Implcitas de Variveis

O compilador armazena o nmero como sendo do tipo mais simples possvel, nesse caso, integer. Desta forma, para fazer a soma entre o double e o integer haver uma converso implcita no valor 1. 3.9.19. Receber um nmero indeterminado de parmetros Os parmetros recebidos so inseridos em um Array. Isso permite que a Sub receba quantos parmetros forem necessrio, sem um nmero fixo.

Desta forma a Sub pode receber quantas informaes forem necessrias e manipular o array posteriormente. 3.9.20. Replicar cadeia de caracteres A funo String$ do Vb permite que seja replicado 1 caractere, o nmero de vezes que desejar. Por exemplo, msgbox string$(5,"x") exibir a string "xxxxx".

A funo space$ me retorna 5 espaos neste exemplo. Usando a funo Replace pode-se substituir cada um dos 5 espaos pela string "xy". 3.9.21. Usar as funes com $ As funes sem $ devolvem um resultado Variant. Informaes variant levam mais tempo para ser processadas, consumindo performance. 3.9.22. Utilizar o operador Like no Visual Basic O VB possui um operador Like muito semelhante ao existente no SQL Server. O uso do operador Like do Visual Basic alm de simplificar o cdigo, pode otimiz-lo, evitando chamadas a funes.

3.9.23. Otimizar a utilizao do DoEvents Recomenda-se a utilizao do DoEvents quando possvel em meio a longos processamentos para que o usurio possa interagir com nossa interface grfica, eventualmente at cancelando o processamento Pode-se utilizar a funo da API chamada GetInputState para verificar se existe algo a ser processado pela aplicao. Eis a declarao da API :

Desta forma o Doevents s ser chamado quando realmente necessario, otimizando o processamento 3.9.24. Concatenaes de mensagens simplificadas com Replace Quando desejamos concatenar mensagens para um MSGBOX pode-se utilizar a funo Replace.

Colocar um smbolo qualquer no lugar em que deveriam ser feitas as divises de linhas e o replace se encarregou de substituir o smbolo pelo vbcrlf. 3.9.25. Forma rpida de identificar um option button selecionado Pode-se descobrir qual option button encontra-se marcado sem a necessidade de fazer diversos IF's ou utilizar select case. O valor true refere-se neste caso no VB como -1, enquanto que false como 0. Assim sendo, a multiplicao o value do option que est marcado pelo seu peso gera o valor do option marcado, s que negativo. Todos os outros calculos vo gerar 0. Supondo que o option marcado no seja o primeiro ento a conta final ficar algo como 0 - (-3) (exemplo). A subtrao de um valor negativo inverte a operao (0+3) e obtem-se o valor do option selecionado. Caso seja o 1o, a operao ser 0-0, que ir gerar 0, o ndice do 1o que encontra-se marcado.

O sinal (-) mantido no inicio do calculo para garantir que o resultado seja invertido de sinal. 3.9.26. Utilizar InStr para reduzir chamadas a funes Pode-se reduzir consideravelmente as chamadas a funes utilizando simplesmente a funo InStr.

Com isso economizou-se processamento no IF e diversas chamadas funo Ucase. Em palavras distintas:

Novamente substituem-se vrias chamadas de funo por uma nica chamada a Instr. Neste cdigo vrias sutilezas devem ser observadas: O ponto e virgula separando as estaes faz com que caso a varivel contenha "ingsum" ela no seja erroneamente reconhecida como uma estao. A concatenao de ; na varivel faz com que caso a varivel contenha "ing;sum" ela no seja erroneamente reconhecida como uma estao. A concatenao de ; na varivel exige que a string das estaes possua um ponto e vrgula no incio e outro no final, para permitir o reconhecimento correto. Mas no para por ai : Pode-se substituir select cases inteiros pelo uso da Instr.

Este exemplo calcula o valor do resultado com base na posio gerada pelo InStr. Para isso necessrio que todas as palavras tenham o mesmo comprimento, 6 caracteres no caso (o maior nmero +;). 3.9.27. Utilizar o For...Each

3.9.28. Comparao de Valores do Tipo Double O resultado da execuo do cdigo abaixo So diferentes!. Mesmo que, tecnicamente, locDouble seja igual a CDbl(1), o Visual Basic no consegue reconhecer a igualdade. Logo se depreende que no se deve, jamais, fazer comparaes diretas entre valores com ponto flutuante.