Constantes Globais

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ClickOk
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 12 Jan 2017 21:29
Localização: Brasilia/DF

Constantes Globais

Mensagem por ClickOk »

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
Fábio Alves
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Constantes Globais

Mensagem por Jairo Maia »

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.
ClickOk escreveu:Só se for uma variavel que eu nunca mude o valor e daí chame de constante...
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.

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 )
?
?
Exemplo 2:

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)
ClickOk
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 12 Jan 2017 21:29
Localização: Brasilia/DF

Constantes Globais

Mensagem por ClickOk »

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:

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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Constantes Globais

Mensagem por JoséQuintas »

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.

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/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Constantes Globais

Mensagem por Jairo Maia »

Olá José,
JoséQuintas escreveu:E ao contrário do que foi dito, é algo bem simples.
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.
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)
Responder