Olá amigos
Estou trabalhando tendo que manter código dos outros... E o código está cheio de "magic strings" espalhadas por todos os .prgs
Agora, queria colocar um pouco de ordem nessa loucura. Faz muito tempo, que não uso Clipper, e nem lembro se quando mexia tinha essa preocupação de "magic strings"... Desde o lançamento do .NET que só mexo com C#.
Então queria saber qual é o procedimento correto (ou "best-pratice") pra se fazer no Clipper.
Pesquisando, descobri:
- que variaveis STATIC servem para o .prg atual em que estão inseridas.
- que variaveis PUBLIC parece que servem para o que eu preciso. Mas estou desconfortavel porque são... variáveis. Eu queria que fossem constantes
- #DEFINE parece ser o jeito certo, parecido com o C++. Não sei muito as vantagens e desvantagens, parece macro-substituição... A documentação do clipper chama isso de "manifest constants", e diz: "Use a manifest constant instead of a constant for several reasons"... como se eu soubesse como definir uma constante comum no clipper... Só se for uma variavel que eu nunca mude o valor e daí chame de constante...
Agradeço antecipadamente
Constantes Globais
Moderador: Moderadores
Constantes Globais
Fábio Alves
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Constantes Globais
Olá ClickOk,
Indicar a melhor prática acho que não dá, pois o que pode ser a melhor prática para um pode não ser para outro. O que adotar será em função da melhor forma e em função do estilo de programação de cada um.
Já quanto as CONSTANTES MANIFESTAS, você pode definir em qualquer parte do .PRG, porém, ela terá efeito somente a partir de onde foi definida, assim, se você colocar no inicio do .PRG, poderá usá-la em qualquer parte dele.
Você pode também colocá-la em Arquivo.CH e inserir esse .CH no início de cada .Prg com o comando #include "Arquivo.CH". CONSTANTES MANIFESTAS são tão boas quanto complexos são seu uso. Vou passar 2 exemplos para tentar explicar sua funcionalidade, espero que seja um start:
Exemplo 1:
Exemplo 2:
Indicar a melhor prática acho que não dá, pois o que pode ser a melhor prática para um pode não ser para outro. O que adotar será em função da melhor forma e em função do estilo de programação de cada um.
Variável será sempre variável. Mesmo que você use um valor constante numa variável em toda instância do programa, esse elemento tem esse nome porque pode receber outro conteúdo em tempo de execução, depende da programação e decisão do programador em alterar esse valor se necessário.ClickOk escreveu:Só se for uma variavel que eu nunca mude o valor e daí chame de constante...
Já quanto as CONSTANTES MANIFESTAS, você pode definir em qualquer parte do .PRG, porém, ela terá efeito somente a partir de onde foi definida, assim, se você colocar no inicio do .PRG, poderá usá-la em qualquer parte dele.
Você pode também colocá-la em Arquivo.CH e inserir esse .CH no início de cada .Prg com o comando #include "Arquivo.CH". CONSTANTES MANIFESTAS são tão boas quanto complexos são seu uso. Vou passar 2 exemplos para tentar explicar sua funcionalidade, espero que seja um start:
Exemplo 1:
Código: Selecionar todos
#define NTRIM(n) (LTrim(Str(n)))
Local xResult
CLS
xResult := (5 * 12.5)
?
?
? xResult // retorna 62.5
?? " => variavel numerica:", ValType( xResult )
xResult := NTRIM( xResult ) // transforma numero em caracter, sem espacos
?
?
? xResult // retorna 62.5
?? " => variavel caractere:", ValType( xResult )
?
?Código: Selecionar todos
#define Falso .F.
#define Verdadeiro .T.
#define Conteudo1 1.2345
#define Conteudo2 "Clipper On Line"
CLS
// Lembre-se sempre: Case Sensitive
?
?
? Falso
? Verdadeiro
? Conteudo1
? Conteudo2
?
?Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Constantes Globais
Obrigado, Jairo. Então no clipper não tem como declarar uma constante comum, só através de #define?
Isso me lembra uma lista muita engraçada, sobre "pure evil" defines de c++
https://gist.github.com/aras-p/6224951
Tenta imaginar o desespero que isso causa:
Isso me lembra uma lista muita engraçada, sobre "pure evil" defines de c++
https://gist.github.com/aras-p/6224951
Tenta imaginar o desespero que isso causa:
Código: Selecionar todos
#define true ((rand()&15)!=15)Fábio Alves
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Constantes Globais
Ué, não vejo como declarar constante de outra forma, aliás, no C também é assim.
A não ser que não esteja explicando direito o que está querendo.
O uso de #define pra declarar fórmulas é outra história.
E ao contrário do que foi dito, é algo bem simples.
Trata-se apenas do compilador trocar o texto pelo conteúdo definido.
Opção 1:
Colocar no cabeçalho de cada fonte o #define, desta forma será válido somente no fonte
Opção 2:
Colocar dentro de um arquivo CH, e nos fontes que precisarem colocar #include "arquivo.ch"
Opção 3:
Colocar a indicação do CH no projeto, e nem precisa colocar #include em cada fonte.
De qualquer forma, em algum fonte vai ter que colocar, e se é global, porque não num arquivo em separado só pra isso?
De nada adiantaria colocar constante global em qualquer fonte, isso seria o mesmo mau uso de criar variável pública em qualquer lugar.
Depois tem que ficar caçando fonte pra saber aonde está a definição, ou pra procurar se já existe o que está querendo usar, ou ficar resolvendo bugs causados por duplicação de nome.
Lembrando que a compilação com -w3 -es2 confere se colocou o nome correto na hora do uso.
A não ser que não esteja explicando direito o que está querendo.
O uso de #define pra declarar fórmulas é outra história.
E ao contrário do que foi dito, é algo bem simples.
Trata-se apenas do compilador trocar o texto pelo conteúdo definido.
Código: Selecionar todos
#define K_ESC 27
IF LastKey() == K_ESC
...
ENDIF
Opção 1:
Colocar no cabeçalho de cada fonte o #define, desta forma será válido somente no fonte
Opção 2:
Colocar dentro de um arquivo CH, e nos fontes que precisarem colocar #include "arquivo.ch"
Opção 3:
Colocar a indicação do CH no projeto, e nem precisa colocar #include em cada fonte.
De qualquer forma, em algum fonte vai ter que colocar, e se é global, porque não num arquivo em separado só pra isso?
De nada adiantaria colocar constante global em qualquer fonte, isso seria o mesmo mau uso de criar variável pública em qualquer lugar.
Depois tem que ficar caçando fonte pra saber aonde está a definição, ou pra procurar se já existe o que está querendo usar, ou ficar resolvendo bugs causados por duplicação de nome.
Lembrando que a compilação com -w3 -es2 confere se colocou o nome correto na hora do uso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Constantes Globais
Olá José,
Acho que usei o termo errado. Quando disse: são tão boas quanto complexos são seu uso, foi exatamente pela gama de formas que podem ser usadas. Por isso passei 2 exemplos: um com um grau um pouco maior de complexidade, e outro com um grau de extrema simplicidade.JoséQuintas escreveu:E ao contrário do que foi dito, é algo bem simples.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
