Notifications
Clear all

Por que evitar variáveis globais?

9 Posts
3 Usuários
0 Reactions
1,482 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Há por aí pessoas que evitam o uso de globais a todo custo, só permitindo-se o uso das mesmas, quando for um caso específico, fundamentalmente não há outra opção...
Outras pessoas parecem ter uma fixação fora do comum por variáveis globais e insistem no uso das mesmas como solução para todos os problemas de código.

Queria saber de vocês, desenvolvedores, qual sua postura e por quê? *(objetividade, por favor!)

Resolvi colocar dois links para facilitar leitura do pq evitar variáveis globais:
https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=why+avoid+global+variables
https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=por+que+evitar+vari%C3%A1veis+globais

 
Postado : 10/04/2015 8:54 am
(@edcronos)
Posts: 1006
Noble Member
 

fernando,
como falei eu uso globais sim, mas elas são limitadas a variaveis de controle intercalado
e não vi como não usar elas sem complicar mais ainda minhas macros

como falei não sou um profissional da area ,
apenas brinco , mas levo a serio a performance e segurança da mesma
enfrento algumas falhas ?
sim,
assim como creio que vc tbm enfrente até hoje e faz testes antes aplicar definitivamente na planilha
a planilha que eu mexo é de testes de experiencias,

ela já teve varias modificações, mas a estrutura inicial é a mesma, tanto que macros antigas ainda funcionam
já tentei achar outras maneira de refazer, pode ver no proprio forum topicos meus a respeito

a planilha tem uma otima dinamica e quero aumentar ainda mais essa dinamica
quando achar que ela aceita qualquer tipo de dados e vindo de qualquer banco de dados ou planilha e for 100% escalonável
"quero criar um banco de dados propria para ela, mas ainda não me paguei a esse ponto de agilidade"

aí sim eu refaço todas as macro, para tirar residuos e condigos não otimizados "
mas ainda não acho que vou conseguir eleiminar as variaveis publicas que uso "talvez usando modulo de classe"

 
Postado : 10/04/2015 9:39 am
(@edcronos)
Posts: 1006
Noble Member
 

mais uma coisa
variaveis de escopo global tem um tom diferente de variaveis publica , assim como as privadas ou de procedimento

Global fg As Long
Public ColunD() As Variant
dim gg as byte
private hd as range

sub vario()
dim coluno() "o vba vai criar uma nova instancia para coluno e vai ter 2
dim fg ' o vba vai ignorar essa istancia pq fg já é global
end sub

isso foi oq eu entendi em meus testes
tem um topico meu a respeito

 
Postado : 10/04/2015 9:55 am
(@edcronos)
Posts: 1006
Noble Member
 

para vc achar que eu não sei das consequências de se usar variaveis publicas

o fato mais estranho que enfrentei
viewtopic.php?f=10&t=13766

em uma analise posterior me fez perceber que apesar da variavel ser long e não range,
ao mudar de aba, mesmo sendo por with assumia por conta propria o valor dessa aba
o fato foi suprimido usando Application.Calculation = xlCalculationManual "só não me pergunte pq"

 
Postado : 10/04/2015 10:56 am
(@edcronos)
Posts: 1006
Noble Member
 

estive pensando em minha estrategia de uso de variaveis

talvez o ponto de eu não ter enfrentado problemas com a publicas é que elas sempre são redefinidas

eu tenho apenas uma macro que define os valores delas
que é a SetorL
essa macro localiza o setor na tabela pode ser por nome ou posição em qualquer aba

todas as macros principais chamam a SetorL para saber onde está o setor e as especificações

as variaveis somente são reproveitadas quando essa macro chama outra para completar o servço

exemplo de macros auxiliares que tbm são principais
essa macro copia o setor requerido para uma array

Sub Copia_SetorO(ByVal SetorOrigem As Variant, Optional ByVal Nome_aba As String)

    If Nome_aba = "" Then Nome_aba = ActiveSheet.Name

    Call SetorL(SetorOrigem, Nome_aba)

    ColunO = Sheets(Nome_aba).Range(Ti & Li , Fc & Lf ).Value2
    CqO = Cq

End Sub

essa array pode ser trabalhada por outras macros

essa macro localiza o setor de destino e cola o array que contem o setor copiado

Sub Colar_Setor(ByVal SetorDestino As Variant, ByRef NomeArray As Variant, _
        Optional ByVal linha_inicial As Long, Optional ByVal Nome_aba As String)

    If Nome_aba = "" Then Nome_aba = ActiveSheet.Name

    Dim Qc As Long
    Qc = UBound(NomeArray, 2) - 4

    Call SetorL(SetorDestino, Nome_aba) '<<<localiza o setor de Destino

    If Cq <> Qc Then
        Call ColunasN(Qc, Nome_aba) '<<<< aqui o setor é redimensionado caso necessário 
    End If

    Sheets(Nome_aba).Range(Ti & Li, Fc & Lf).ClearContents '<<<Aqui limpa o setor de destino 

    If linha_inicial > 0 Then Li = linha_inicial

    Lf = Li + UBound(NomeArray, 1) - 1 '<<< ajusta o numero de linhas da Rage

    Sheets(Nome_aba).Range(Ti & Li, Fc & Lf).Value2 = NomeArray ' <<<<< Cola o array


End Sub

então se eu quiser em linhas simples
copiar o Setor com o nome Casas da Aba3 e colar no lugar do setor com nome Apartamentos da Aba Atual mas com a range espelhada

sub mudança()
Copia_SetorO("Casas","Aba3")
    Call Espelhar(ColunO, 1)
Call Colar_Setor("Apartamentos", ColunO)
end sub

ainda estou refinando os codigos e uso

 
Postado : 10/04/2015 3:36 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Eu entendo que toda ferramenta tem um uso específico.

Você pode colocar um parafuso com martelo e até com um serrote (dependendo do caso). Mas não significa que seja o mais adequado.

Ou seja, se as variáveis globais existem, vou usar quando precisar delas, sem medo, mas não vou viver só com isso. Também não vou viver declarando tudo como "as string" ou "as double". Tenho que saber quando usar cada um, e quando usar "as byte" também. Simples assim.

Em projetos pequenos, não vejo porque usar variáveis globais, a não ser que não consiga resolver de outra forma.

Em projetos médios, eu até uso uma ou duas, se eu tiver que criar uma rotina de controle e relação entre diversas subs (pra evitar erros de programação). Mas, como falei, uso uma ou duas, em especial, para controle de eventos em formulários, pois não sei fazer isso de outra forma.

 
Postado : 10/04/2015 3:43 pm
(@edcronos)
Posts: 1006
Noble Member
 

gtsalikis mas é esse mesmo meu caso,

primeiro não sei como Não usar elas para oq eu quero fazer
uso apenas como intercambio entre macros
e o projeto é grande, 3322 linhas de macros

"claro que tem muito lixo no meio pq eu criei macros novas que simplifica todo os projetos"

mas bem, se pode dizer que não sou muito normal,

para ter uma ideia no inicio do projeto da minha macro mais complexa
eu levei 5 dias para planejar "mentalmente" as variaveis,
e apenas 3 horas para escrever a macro,
ela já recebeu N modificações e melhorias de lá para cá
atualmente está com umas 46 variaveis a maioria long , (fique tranquilo que não são variaveis publica "mas uso gosub para fazer loop e definir o fluxo de execução" )
pretendo adicionar mais recuso nessa macro, mas dá nó no raciocínio

agora que eu pensei,
toda essa discussão pq eu uso variáveis publicas :shock: ??? :?

 
Postado : 10/04/2015 4:25 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Essa discussão na verdade é pra saber pq as pessoas não usam ou evitam usar globais, e assim, mostrar pra vc Ed, que todo mundo segue as "minhas" regras, pq não são minhas, são padrões internacionais de desenvolvimento que funcionam e são aplicados em quase todas as linguagens. E de quebra, pararmos de sujar o tópico do outro menino, pois já foi respondido e ele nunca nem voltou pra ver a resposta. E qdo voltar vai levar um susto.

Eu falei no tópico para ser objetivo na resposta e vc fez algumas respostas enormes, Claro respeito vc e suas respostas, mas o foco deste tópico é entender pq evitar as globais (ou publicas)... E vc está explicando pq vc as usa. O que é coerente, mas sua opinião é oposta.

Mas eu acho que seu caso é diferento do caso do Gilmar, BEM diferente. Vc usa na maioria as variáveis globais. Vc tem mais globais do que locais, sempre. Vc não fica só em umas duas, no máximo 5.. Isso fica claro nos seus códigos.
Nós usamos publicas só em casos onde identificamos que a única alternativa é essa. E pode sim acontecer de ter várias, mas terá uma boa explicação, um bom motivo pra cada uma delas.

primeiro não sei como Não usar elas para oq eu quero fazer uso apenas como intercambio entre macros

Não saber é o primeiro passo para aprender. O reconhecimento de uma limitação é saber aonde vc pode melhorar. Usá-las para intercâmbio entre macros é também resolver um problema de conta de soma, por exemplo, abrindo o Excel. Digamos, vc quer fazer uma soma, e pode usar a calculadora que está ao seu lado, mas vc liga o computador, loga no windows, abre o Excel escreve nas células e faz a soma. Resolve? Claro que resolve, mas não precisa ir tão longe. Assim como as publicas resolvem seus problemas mas acabam atrapalhando seu raciocinio. Oras, se o objetivo é passar variaveis de uma macro pra outra, não custa nada aprender a parametrizar. Até pq vc não perderia 5 dias pensando nas variáveis, antes de perder mais 3 horas desenvolvendo algo que vc poderia fazer tudo em 1 hora se abrisse sua mente para outros meios de trabalhar.

A maioria das pessoas vai dizer que usa uma, duas, se o projeto for enorme, talvez 10... eu já fiz código com 50mil linhas e mesmo evitando publicas e globais, devo ter usado umas 15, talvez 20, no máximo, e a maioria nem eram variáveis, eram constantes.

Entendeu ?

Para passar variaveis como parametros é só aprender o seguinte:
- Opcionalidade da existêcia da variável
- ByVal e ByRef
- Nomenclatura adequada (e não, variaveis com duas letras...)
- Tipagem adequada sempre
- ParamArray (passar varias variáveis que serão vistas como uma matriz no código destino)

A assinatura das rotinas *(quando digo assunatura, me refiro à linha que diz Sub ou Function) diz se a rotina vai retornar valor ou não, diz todas as variáveis que serão usadas ali dentro (se vierem de fora), todas se tornam locais, podem manter ou perder valor ao término da rotina, o código fica mais limpo, etc... mas vc tb já disse q não se preocupa nem um pouco com o que vão pensar do seu código ou com o uso que vão dar, uma vez que vc esteja ausente.... Isso cria dependêcia do cliente, o que por um lado é bom, ele sempre vai ter que chamar vc, mas ao mesmo tempo ele pode desconsiderar tudo que vc tem, e fez pq ninguem consegue dar manutenção ou continuidade nas suas ferramentes, qdo vc está indisponível... Vc acaba fazendo algo que só você entende, só você usa.

E preciso admitir, com respeito a sua pessoa, claro, mas dps das nossas gigantescas discussões, da sua teimosia em aprender jeitos melhores e mais fáceis, e vc até já justificou que vc tem o seu jeito e eu respeitei e respeito. Mas vc deve ter percebido que eu passei a evitar tópicos seus. Vc raramente vê resposta minha em tópicos seus. Isso pq eu percebi que minhas tentativas de intervenção nas suas macros eram inúteis. Então resolvi parar de perder meu tempo.
E digo uma coisa positiva, só estou criando este tópico e assim, tentando ajudar a fazer vc enxergar, pq no outro tópico vc mencionou que se alguém conseguir te ajudar vc estará aberto a aprender. Daí vc conseguiu fazer nascer em mim o interesse em te ajudar.

Mas daí será outro tópico... "Como iniciar um desenvolvimento simples", ou sei lá, complexo... Ali vou ensinar como declarar variáveis, como fazer fluir o raciocínio para não haver perda pelo caminho, etc.
Aos poucos aprendemos, melhoramos e continuamos ensinando. Vc precisa de um pouco mais de trabalho, mas eu quero sim te ajudar. E espero que você esteja disposto a aprender.

o foco deste tópico é:
Pq evitar globais? E assim, quero que vc continue acompanhando, mas com objetivo principal de você LER o que a galera responde...

Abs,

 
Postado : 10/04/2015 6:14 pm
(@edcronos)
Posts: 1006
Noble Member
 

bem,
paramos por aqui, não vale a pena discutir sobre algo que somente uso para mim

mas vc deve achar que eu uso todas como publicas pq não ve declaração de variaveis
nem todas as variaveis publicas que criei eu uso "foram mais como definição mental de projeto"

outra coisa eu leio cada palavra sim, assim como li algo sobre elas no link que me mandou apesar de se em ingles "usei tradutor"
e tbm vi que existe sim muita discussão a respeito tem até topicos trancados pq é um assunto improdutivo
e isso pq existe opiniões divergentes

se vc quiser
me mande um lugar que possa baixar dados
eu vou adicionar na minha planilha e tirar apenas algumas macros e te mando ela "apenas 2"

sobre vc evitar topicos meus,
fora a parte de shapes que me responderam recentemente "essa eu duvido que descobriria sozinho",
normalmente eu consigo achar uma solução por mim mesmo, (as vezes com milhares de testes )

o topico serve como uma reavaliação pessoal,

igual ao meu ultimo topico sem resposta, sobre usar uma macro para preencher combobox de todos os userform
eu ia perguntar como fazer isso e enquanto estava escrevendo me veio uma ideia, e funcionou

só que Me.ActiveControl.Name me deixou na duvida se era estável ou nao

cara mas vamos concordar, com meus tipos de pergunta eu nem posso esperar uma resposta,
são as mais estranhas possíveis

viewtopic.php?f=10&t=11682&p=61492#p61492 <<<<Find(rngO.Value2) em coluna de datas?
viewtopic.php?f=10&t=11621 <<< array como coluna's auxiliar
viewtopic.php?f=10&t=11444&p=60174#p60174 <<<<Array bidimensional como planilha
viewtopic.php?f=10&t=11014&p=57937#p57937 <<<<adicionar varias colunas sem loop
viewtopic.php?f=10&t=11171&p=58731#p58731
viewtopic.php?f=10&t=11098&p=58404#p58404 <<<valor de variavel como nome de variavel
viewtopic.php?f=10&t=11188&p=58812#p58812
viewtopic.php?f=10&t=11207&p=58902#p58902 <<<<sincronizar macro mudanças na planilha e formulas

são totalmente genericas e confusas

 
Postado : 10/04/2015 9:20 pm