Por que usar uma variável local sobre uma variável global? [duplicado]

4

Sou um iniciante no visual studio 2013, e sei o que são, mas estou intrigado, por que alguém usaria uma variável local? Eu sempre usaria apenas uma variável global.

    
por Modrisco 14.05.2016 / 11:32
fonte

4 respostas

14

Esta é uma ótima pergunta! Muitos conselhos de programação e "melhores práticas" se resumem à questão de gerenciar a complexidade. Ou, em outras palavras, como escrevemos e gerenciamos um programa grande e complexo sem sermos sobrecarregados. A solução é (como acontece com a maioria dos grandes problemas) dividi-la em partes menores e mais gerenciáveis.

Cada variável é um pouco complexa, mas uma variável global adiciona complexidade ao programa inteiro (porque pode ter efeitos em todo o programa, daí o nome), enquanto uma variável local adiciona complexidade apenas em uma única unidade isolada, a função.

O pior medo de um desenvolvedor é ter um programa em que uma alteração em uma única função faça com que uma parte totalmente diferente do programa falhe. Cada variável global aumenta esse risco.

    
por 14.05.2016 / 11:49
fonte
3

Uma variável global permite que diferentes componentes se comuniquem lendo e gravando em um local de memória comum. Desta forma, diferentes componentes são dependentes uns dos outros / acoplados: cada componente tem expectativas sobre os valores contidos na variável global, e todos os outros componentes devem atender a essas expectativas se você quiser que o seu programa funcione corretamente.

O acoplamento aumenta a complexidade do seu software: ao modificar um trecho de código, você deve ter em mente todas as possíveis repercussões da alteração em outros componentes que dependem dele.

Portanto, ao usar uma variável local, você diminui as dependências entre seus componentes, ou seja, diminui a complexidade do seu código. Você só deve usar a variável global quando realmente precisar compartilhar dados, mas cada variável deve estar sempre visível no menor escopo possível.

    
por 14.05.2016 / 11:52
fonte
1

Tentando pensar em um exemplo em que variáveis locais são necessárias mais do que apenas boas práticas.

Considere um carrinho de compras com itens e impostos.

Global double CostOfShopping 

AddItem(item)
{
    CostOfShopping += item.price
}

AddTax()
{
    CostOfShopping =* TaxRate
}

Assim, a ordem em que adicionamos itens e calculamos o imposto pode alterar o custo de compras. Esp. Se adicionarmos dois itens!

Vs

double GetCostOfShopping(items)
{
    var tot = 0;
    Foreach(item)
        tot+=item.price;
    tot = tot * taxRate;
    return tot;
}

Como você totaliza uma variável local, controla a ordem do cálculo dentro da função e evita a adição de itens após o cálculo do imposto

    
por 14.05.2016 / 14:03
fonte
1

Além de outras boas respostas, devemos considerar as noções separadas, mas intimamente relacionadas, de tempo de vida variável, escopo variável e permissão de acesso; vamos considerá-los em relação ao conceito de variáveis globais, estáticas e locais. Ao separá-las, vamos analisar algumas das diferenças nas declarações.

E o ponto que o @JacquesB faz sobre a complexidade do programa está certo.

Cada um dos itens acima pode ser usado para reduzir ou ampliar a complexidade do programa.

Tempo de vida é a duração efetiva da variável; simplesmente, quanto tempo a variável vive. Uma variável global vive durante todo o programa. Uma variável local vive pelo comprimento do método em que está (diferenças de módulo menores em linguagens de programação e a noção de escopo). Uma variável que vive mais tem mais efeito potencial na complexidade do programa. Variáveis estáticas têm o mesmo tempo de vida de variáveis globais.

Também vamos observar que, quando há várias variáveis de toda a duração do programa (global ou estática), há problemas de ordenação de inicialização (que são ou não resolvidos pela ordenação de inicialização do idioma). Os problemas de encomenda por terminação também estão presentes.

O escopo é uma noção do contexto e do ambiente de compartilhamento. A maioria das linguagens permite o aninhamento de escopos. Uma variável global está no maior escopo, o que significa que está sendo compartilhada com todos os outros códigos. Uma variável estática é (potencialmente) reduzida em escopo para a classe que está definindo-a, portanto, seu compartilhamento pode ser limitado a uma classe em vez de a todas as funções (também diferenças de módulo nas linguagens de programação e a noção de permissão de acesso). Uma variável local é declarada como um dos menores escopos possíveis, que é o escopo da função, e como tal só é acessível ao código dentro da função. Algumas linguagens permitem que os escopos internos restrinjam ainda mais o compartilhamento da variável com um código ainda menor.

Normalmente, variáveis declaradas em uma função ou escopo aninhado também têm vida útil do escopo funcional ou aninhada, mas isso nem sempre é o caso devido a diferenças de idioma e recursos como closures, que podem efetivamente estender o tempo de vida de variáveis locais. / p>

Permissões de acesso concedem permissão de leitura e / ou gravação a vários públicos-alvo. Quando falamos de variáveis globais, a permissão de acesso conotada é geralmente leitura e escrita, a permissão mais permissiva. Os idiomas que suportam variáveis estáticas, por outro lado, geralmente permitem que restrições de acesso personalizadas sejam aplicadas, como públicas ou privadas. Público sendo o mesmo que leitura / gravação global e acesso restrito privado ao escopo (ou seja, a classe de definição).

Variáveis locais, por definição na maioria das linguagens, são inacessíveis a outros códigos em outras funções, embora as linguagens geralmente não tentem restringir a leitura vs. escrita para locais (embora algumas linguagens como Swift e Javascript (e outras) suportem write-once (inicializar apenas) por meio de uma palavra-chave LET ou const , não confundir com a palavra-chave LET do VB para atribuição de valor versus a SET para atribuição de referência).

O raciocínio sobre a maior parte do que está acontecendo em relação ao estado no escopo da função não requer análise completa do programa (diferenças de idioma do módulo e métodos de passagem de parâmetros).

Em resumo

As variáveis globais vivem pelo tempo de vida do programa, são compartilhadas com todas as funções e geralmente permitem read & acesso de gravação.

Variáveis estáticas vivem pelo tempo de vida do programa; permitir escopo restrito (para a classe) e permitir permissão diferente de leitura vs. gravação.

As variáveis locais, por outro lado, são válidas para o tempo de vida do escopo (função ou outro), são compartilhadas apenas para o código no mesmo escopo.

Decompõe esses aspectos da declaração de variáveis, você provavelmente pode imaginar o efeito que cada um deles tem na complexidade potencial e o esforço exigido por humanos ou ferramentas com relação à análise do que o programa está fazendo ou tem potencial para fazer. / p>     

por 14.05.2016 / 18:58
fonte