Clipper On Line • Ver Tópico - Constantes Globais

Constantes Globais

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Constantes Globais

Mensagempor ClickOk » 17 Jan 2017 19:20

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)
ClickOk
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 12 Jan 2017 20:29
Cidade/Estado: Brasilia/DF
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Constantes Globais

Mensagempor Jairo Maia » 19 Jan 2017 08:53

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:
#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:
#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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Constantes Globais

Mensagempor ClickOk » 19 Jan 2017 18:21

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:
#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)
ClickOk
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 12 Jan 2017 20:29
Cidade/Estado: Brasilia/DF
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Constantes Globais

Mensagempor JoséQuintas » 19 Jan 2017 19:59

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.

#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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18012
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Constantes Globais

Mensagempor Jairo Maia » 21 Jan 2017 13:52

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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro