msdn16_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

Compartilhando Variáveis entre Instâncias

por Roberto Lopes

Este artigo discute

Este artigo usa as seguintes tecnologias:

·         Compartilhamento de variáveis entre instâncias, sem o uso de variáveis globais (ou de método)

 

VB.Net, OOP

Chapéu

VB.Net

 

Download:

CompartilhandoVariaveis.zip (92 KB)

 

 

Neste artigo vou mostrar duas alternativas para o compartilhamento de variáveis através de instâncias em Visual Basic, buscando estar dentro das melhores práticas de desenvolvimento, evitando fazer uso de variáveis globais (ou de módulo), recurso que não se enquadra nos princípios da orientação a objetos.

 

Um breve histórico

O Visual Basic.Net sofreu uma significativa evolução, adquirindo todas as credenciais necessárias para receber definitivamente a denominação de uma linguagem orientada a objetos. Portanto, existe a necessidade (para não dizer a obrigatoriedade) de seus usuários acompanharem esta evolução.

Deste modo, o recurso de variáveis globais, que em versões anteriores do Visual Basic eram um “mal necessário”, a partir do momento que a linguagem mudou seu paradigma, precisa deixar de ser usado, uma vez que “fere” diretamente os princípios básicos da orientação a objetos.

Não tenho como objetivo ser “purista” quanto os fundamentos da orientação a objetos, citando por exemplo, a utilização de patterns como MVC (Model View Controller), delegates ou algo parecido. Vou abordar uma técnica simples,  eficiente e funcional para o compartilhamento de variáveis, dentro dos princípios da orientação a objetos.

 

Navegando pelas instâncias

Nas versões anteriores do Visual Basic, compartilhar uma variável entre os formulários de um projeto, significava criar uma variável com o modificador “Global” ou “Public” em um módulo de código (arquivos com extensão BAS). Deste modo, esta variável poderia ser manipulada por qualquer um dos formulários do projeto, inclusive pelo próprio módulo. Apesar da versão VB.Net ainda permitir a utilização de variáveis de escopo global, esta é uma prática questionável e não recomendável (pelos motivos citados anteriormente).

A primeira técnica que vou apresentar, consiste na criação de uma classe utilitária, que utiliza variáveis membro e propriedades estáticas (Shared), podendo ser acessadas por qualquer uma das classes do aplicativo sem a necessidade de declaração ou criação de instância.

A segunda técnica consiste em passar a instância que contém a variável membro a ser compartilhada para uma outra instância de classe através do construtor da classe receptora. Se corretamente utilizado, poderiamos dizer que este modo de compartilhamento de variáveis é ainda melhor do que a técnica de classes utilitárias, uma vez que sempre estariamos utilizando objetos com finalidades definidas (classes reais), ao invés de classes com o único objetivo de compartilhar variáveis.

 

Classe Utilitária

Uma classe utilitária tem como finalidade conter variáveis membro, métodos e propriedades dentro do escopo de uma aplicação. Existem duas características que devem ser aplicadas a uma classe para que ela possa ser denominada Utilitária:

 

·         Todos os seus membros, propriedades e métodos precisam ser estáticos (Shared)

·         Possuir um construtor private vazio, uma vez que uma classe utilitária não pode ser instanciada

 

Crie um novo projeto do tipo Windows Application em VB.NET e não altere nenhuma propriedade do projeto, deixando todos os nomes/valores default. Crie uma nova classe chamada “Variaveis” e adicione o código apresentado na Listagem 1:

 

Listagem 1 -  Classe Utilitária Variaveis

 

Public Class Variaveis

  'Inicialize as variáveis membro.

  'Se solicitadas antes de atribuídas, uma exception é gerada

  Private Shared _PrimeiroValor As Integer = 0

  Private Shared _PrimeiraString As String = String.Empty

 

  'Construtor private e vazio. Classes utilitárias não podem ser instanciadas

  Private Sub New()

  End Sub

 

  Public Shared Property PrimeiroValor()

    Get

       Return _PrimeiroValor

    End Get

    Set(ByVal Value)

       'Se o valor realmente for numérico, atribui à variável membro

       'Caso contrário, dispara exception

       If IsNumeric(Value) Then

          PrimeiroValor = Value

       Else

          Throw New Exception("Valor de PrimeiroValor deve ser numérico")

       End If

    End Set

  End Property

 

  Public Shared Property PrimeiraString()

    Get

       Return _PrimeiraString

    End Get

    Set(ByVal Value)

       PrimeiraString = Value

    End Set

  End Property

 

  Public Shared Function MostraValores() As String

       MessageBox.Show("Primeiro Valor=" & _PrimeiroValor.ToString() & _

       Constants.vbNewLine & _

       "Primeira String=" & _PrimeiraString.ToString(), "Exemplo de Variaveis")

...

Quer ler esse conteúdo completo? Tenha acesso completo