.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; - Coesão é o nível de integralidade
interna de uma classe; (Veja
o principio da responsabilidade única - SRP) 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 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: