.NET - Variáveis Globais em VB .NET e C#


Falar em variáveis globais em tempos de orientação a objetos pode soar um tanto como que ultrapassado pois as boas práticas apontam para o encapsulamento de métodos e atributos, baixo acoplamento, alta coesão, interfaces, injeção de código, etc., e por ai andam os desenvolvedores...

 Acoplamento

- Acoplamento é o nível de dependência/conhecimento que pode existir entre as classes;
- Uma classe com acoplamento fraco não é dependente de muitas classes para fazer o que ele tem que fazer;
- Uma classe com acoplamento forte depende de muitas outras classes para fazer o seu serviço;
- Uma classe com
acoplamento forte é mais difícil de manter, de entender e de ser reusada;

 Coesão

- Coesão é o nível de integralidade interna de uma classe; (Veja o principio da responsabilidade única - SRP)
- A coesão Mede o grau que um classe ou seus métodos fazem sentido, ou seja, quão claro é o entendimento do que a classe ou método possui
- Uma classe com alta coesão possui responsabilidades bem definidas e são difíceis de serem desmembradas em outras classes;
- Uma classe com baixa coesão possui muitas responsabilidades, geralmente que pertencem a outras classes, e podem ser facilmente desmembradas em outras classes;
- Uma classe com
baixa coesão
é difícil de entender, manter e reusar;

 Portanto quanto mais forte o acoplamento e mais baixa a coesão de uma classe mais difícil ela será de entender, manter e ser reusada.

Diante desses fatos por que eu tocaria nesse assunto ???

Porque no mundo real do desenvolvimento de software, no dia a dia, existem algumas situações onde usar uma variável global (é bom não abusar...)  vai resolver o seu problema e não vai comprometer a robustez do código nem tão pouco ser considerado uma má prática de desenvolvimento.

Sendo assim vou mostrar como podemos usar esse recurso lembrando sempre que bom senso e canja de galinha não fazem mal a ninguém...

Usando Variáveis Globais  no VB .NET

Comecei pelo VB .NET por que na linguagem VB .NET é muito simples usar variáveis globais.

Como ???

A maneira mais fácil e incluir um novo modulo no seu projeto.

Módulos são como formulários sem a parte gráfica e uma de suas características é que as variáveis que forem declaradas como Public ou Friend em um módulo são visíveis em todas as partes do seu projeto.

Agora vamos provar que isso é verdade.

Abra o VB 2010 Express Edition e crie um novo projeto do tipo Windows Forms com o nome UsandoVariaveisGlobais;

A seguir no menu Project selecione Add Windows Forms e selecione o template Windows forms e aceite o nome form2.vb;

Temos então dois formulários vamos incluir em cada um deles dois Buttons e uma Label conforme o leiaute abaixo:

Form1.vb Form2.vb

Vamos incluir um módulo no projeto no menu Project -> Add New Item -> Module com o nome MeuModulo.vb e vamos definir neste módulo duas variáveis globais, uma Public : SiteVB e outra Friend: nomeAutor ;

Module MeuModulo

    Public SiteVB As String = "macoratti.net"
    Friend nomeAutor As String = "Macoratti"    

End Module
Uma variável do tipo Friend pode ser acessada de qualquer parte do projeto ou Assembly;

Uma variável do tipo Public pode ser acessada de qualquer lugar;

MeuModulo.vb

Atribuímos valores a estas variáveis e vamos mostrar que podemos acessá-las de qualquer lugar: formulário, classe, etc.

Em seguida vamos incluir uma classe no projeto via menu Project -> Add Class com o nome minhaClasse incluindo nela o seguinte código:

Public Class MinhaClasse

    Public Sub testaAcessoVariavelGlobalSiteVB()
        MeuModulo.SiteVB = "http://www.macoratti.net"
    End Sub

    Public Sub testaAcessoVariavelGlobalNomeAutor()
        MeuModulo.nomeAutor = "José Carlos Macoratti"
    End Sub
End Class

Nesta classe eu definimos dois métodos um para acessar a variável Public SiteVB definida no módulo e alterando o seu valor outro para acessar a variável Friend nomeAutor também definida no módulo.

Agora vamos definir o código de cada um dos botões do formulário form1.vb:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

         MessageBox.Show(" O site é : " & MeuModulo.SiteVB, "Resposta", MessageBoxButtons.OK)

End Sub
 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

     Dim mVarGlobal_SiteVB As New MinhaClasse

     mVarGlobal_SiteVB.testaAcessoVariavelGlobalSiteVB()

     MessageBox.Show(" O site é : " & MeuModulo.SiteVB, "Resposta", MessageBoxButtons.OK)

End Sub

 

No primeiro Button estou exibindo o valor da variável Publica SiteVB definida no módulo MeuModulo.vb;

No segundo Button estou criando uma instância da classe MinhaClasse e usando o método testaAcessoVariavelGlobalSiteVB estou acessando a variável e alterando o seu valor.

 O resultado pode ser visto na figura abaixo:

Vejamos  o código de cada um dos botões do formulário form2.vb:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(" O site é : " & MeuModulo.nomeAutor, "Resposta", MessageBoxButtons.OK)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim mVarGlobal_NomeAutor As New MinhaClasse
        mVarGlobal_NomeAutor.testaAcessoVariavelGlobalNomeAutor()
        MessageBox.Show(" O site é : " & MeuModulo.nomeAutor, "Resposta", MessageBoxButtons.OK)
    End Sub

No primeiro Button estou exibindo o valor da variável Friend nomeAutor definida no módulo MeuModulo.vb;

No segundo Button estou criando uma instância da classe MinhaClasse e usando o método testaAcessoVariavelGlobalNomeAutor estou acessando a variável e alterando o seu valor.

O resultado da execução será idêntico ao do exemplo anterior.

Com isso mostramos que variáveis Public e Friend definidas em um módulo são variáveis globais.

Usando Variáveis Globais com C#

A linguagem C#, diferentemente da linguagem VB .NET, não possui um Modulo para declarar variáveis globais.

Como fazemos então em C# ?

Podemos fazer assim:   Declarar uma classe public com variáveis estáticas.


A palavra chave static na linguagem C# descreve um membro como um campo, propriedade ou método que é parte de um tipo e não de uma instância do tipo.
 

Dessa forma as variáveis serão visíveis em todo o projeto.

Vamos mostrar isso usando o seguinte cenário: Ao efetuar o login precisamos que o perfil do usuário seja visível em todo o projeto para verificamos se ele têm acesso ou não aos recursos do sistema.

Abra o Visual C# 2010 Express Edition e crie um novo projeto Windows Forms chamado Login;

Vamos primeiro criar a classe public onde iremos definir as variáveis publicas e estáticas que serão visíveis no projeto todo:

No menu Project selecione Add Class e informe o nome Global.cs;

A seguir defina o seguinte código nesta classe:

using System;
namespace Login
{
    public static class Usuario
    {
        private static string m_perfil = "";
        public static string Perfil
        {
            get { return m_perfil; }
            set { m_perfil = value; }
        }
        private static string _login = "";
        public static string Login
        {
            get { return _login; }
            set { _login = value; }
        }
    }
}

 

Na classe Usuario definimos duas propriedades publicas e estáticas: Perfil e Login;

No menu Project selecione Add Windows Forms e aceite o nome padrão form2.cs;

Vamos incluir no formulário form1.cs 2 controles TextBox , 1 ComboBox e dois controle Button,  conforme o leiaute abaixo:

Na combobox na propriedade Itens informe os valores : Admin e Operador;

Este formulário será apresentado ao usuário para informar o nome a senha;

Após clicar no botão Login será feita a verificação das credenciais informadas;

Se as credenciais forem válidas  o valor do login do usuário e sua credencial será atribuído as variáveis globais e o formulário form2.cs será aberto;

No formulário form2.cs inclua 4 controles Label e um controle Button conforme o leiaute abaixo:

Neste formulário apresenta o nome do usuário e o seu perfil;

Os valores já foram armazenados em variáveis globais e serão recuperados e exibidos;

No formulário form1.cs devemos definir o seguinte código:

- Evento Load : defina a proriedade SelectedIndex da ComboBox como igual a zero para exibir o primeiro valor do item:

private void Form1_Load(object sender, EventArgs e)
{
    cboPerfil.SelectedIndex = 0;
}

- No evento Click do botão Cancelar vamos fechar o formulário:

private void btnCancela_Click(object sender, EventArgs e)
{
  
this.Close();
}

- No evento Click do botão Login vamos chamar a rotina verificaLogin();

private void btnLogin_Click(object sender, EventArgs e)
{
   verificaLogin();
}

A rotina verificaLogin() deverá possuir o seguinte código:

private void verificaLogin()

{

   if (txtUsuario.Text.Equals("Macoratti") || txtSenha.Text.Equals("numsey"))

   {

      //verifica se o login e senha e atribuir o

      //nome do usuário e perfil ás variáveis globais

      Usuario.Perfil = cboPerfil.Text;

      Usuario.Login = txtUsuario.Text;

      Form2 frmAcesso = new Form2();

      frmAcesso.Show();

    }else{

       MessageBox.Show("Usuário/Senha Inválido(s).");

    }  

}

A rotina verificaLogin faz uma verificação simples que por questão de didática e foco do artigo eu não implementei como deveria ter sido implementada.

Se o usuário e e senha forem Macoratti e numsey estou atribuindo o valor do perfil informado no controle ComboBox CboPerfil e o nome do usuário informado na caixa de texto txtUsuario.

Observe que acessamos as variáveis globais Perfil e Login definidas na classe Usuario sem necessitar criar uma instância da classe visto a mesma ser estática.

A seguir o formulário form2.cs é exibido e nele temos o seguinte código no evento Load:

private void Form2_Load(object sender, EventArgs e)
{
   lblLogin.Text =
Usuario.Login;
   lblPerfil.Text =
Usuario.Perfil;
}

Executando o projeto iremos obter:

Dessa forma mostrei como podemos usar variáveis globais na linguagem C#. Lembrando que podemos também definir uma constante global definindo na classe Publica:

  public const string SiteVB = "www.macoratti.net";
  public static string teste ="isto é um teste

Neste código a variável SiteVB é uma constante que pode ser acessada de qualquer parte do projeto e a variável teste também poderá ser acessada e alterada em qualquer parte do projeto.

Variáveis globais e variáveis estáticas em C# podem introduzir problemas ao usar o Multithreading pois o valor da variável pode ser alterado dependendo da ordem de execução da thread.

Agora uma palavra final...

Você deve evitar usar variável públicas e estáticas, não é uma boa prática, pois variáveis globais podem ser alteradas de qualquer parte do projeto e isso pode te dar muita dor de cabeça, mas existem cenários que usá-las com critério vai trazer um grande ganho ao seu projeto.

Simples, simples assim...

Pegue o código completo usado no artigo aqui: LoginGlobal.zip

Eu sei é apenas C#, mas eu gosto...

Referências:

José Carlos Macoratti