Padrão /w3
Enviado: 18 Nov 2012 19:45
É muito bom acostumar com esse padrão de programação.
Mas é importante que não fique limitado aos erros de compilação.
Exemplo:
Essa rotina não passa no padrão /w3.
Primeiro porque as variáveis não estão definidas em cada rotina.
Segundo porque a função ConteudoOk() usa uma variável que não conhece.
Mas se acrescentar MEMVAR para a variável mvar, já passa na compilação com /w3.
A intenção do /w3 não é apenas essa.
O certo é que cada rotina conheça as variáveis que usa.
Então, o mais correto seria alterar dois pontos:
Valid ConteudoOk(mVar)
Function ConteudoOk(mVar)
Obs. Poderia ser indicado direto no valid, mas este é só um exemplo do que seria o padrão /w3
Mas mesmo assim... qual vantagem?
Antes de alterar, a rotina ConteudoOk() é totalmente dependente da variável existir na rotina que a chama. Não se pode nem mexer no nome da variável, e se for usada por outra rotina, é obrigatório usar o mesmo nome de variável.
Após alterar, ConteudoOk() se tornou uma função independente, e pode tranquilamente ser modificada, ou usada em qualquer rotina, seja qual for a variável.
É isso que se deve tomar cuidado: não confundir padrão /w3 com apenas evitar erros ao compilar com /w3.
Acontece de vez em quando de digitar errado o nome de uma variável, e só vamos descobrir quando está rodando no cliente.
Usando o padrão /w3 isso já não acontece, porque o compilador vai reclamar das variáveis usadas que não foram declaradas.
Por isso aconselho: se puder usar, use o padrão /w3.
Se tem um sistema grande, vai ser um grande trabalho fazer o ajuste, podendo causar até erros aonde já funcionava.
Mas pode já adotar o padrão pra novas rotinas.
Aqu fiz o contrário do que indicaram:
Coloquei no fonte velho #pragma /w0
E fixei o compilador com /w3 /es2
Com isso, tudo que é novo já é feito desse modo. E os programas antigos, vou alterando um por vez.
Mas é importante que não fique limitado aos erros de compilação.
Exemplo:
Código: Selecionar todos
procedure main
mvar := space(10)
@ 2, 20 get mvar valid ConteudoOk()
read
function ConteudoOk()
return .not. empty(mvar)Primeiro porque as variáveis não estão definidas em cada rotina.
Segundo porque a função ConteudoOk() usa uma variável que não conhece.
Mas se acrescentar MEMVAR para a variável mvar, já passa na compilação com /w3.
A intenção do /w3 não é apenas essa.
O certo é que cada rotina conheça as variáveis que usa.
Então, o mais correto seria alterar dois pontos:
Valid ConteudoOk(mVar)
Function ConteudoOk(mVar)
Obs. Poderia ser indicado direto no valid, mas este é só um exemplo do que seria o padrão /w3
Mas mesmo assim... qual vantagem?
Antes de alterar, a rotina ConteudoOk() é totalmente dependente da variável existir na rotina que a chama. Não se pode nem mexer no nome da variável, e se for usada por outra rotina, é obrigatório usar o mesmo nome de variável.
Após alterar, ConteudoOk() se tornou uma função independente, e pode tranquilamente ser modificada, ou usada em qualquer rotina, seja qual for a variável.
É isso que se deve tomar cuidado: não confundir padrão /w3 com apenas evitar erros ao compilar com /w3.
Acontece de vez em quando de digitar errado o nome de uma variável, e só vamos descobrir quando está rodando no cliente.
Usando o padrão /w3 isso já não acontece, porque o compilador vai reclamar das variáveis usadas que não foram declaradas.
Por isso aconselho: se puder usar, use o padrão /w3.
Se tem um sistema grande, vai ser um grande trabalho fazer o ajuste, podendo causar até erros aonde já funcionava.
Mas pode já adotar o padrão pra novas rotinas.
Aqu fiz o contrário do que indicaram:
Coloquei no fonte velho #pragma /w0
E fixei o compilador com /w3 /es2
Com isso, tudo que é novo já é feito desse modo. E os programas antigos, vou alterando um por vez.