Registrar   Login 
 
 C#    fevereiro 6, 2012
Artigos publicados - C# Minimizar
14

Não faz muito tempo que um amigo me procurou desejando que eu convertesse um sistema, que ele mesmo havia desenvolvido, do Visual Basic para o C#.

Ao analisar o código percebi que a conversão não seria nenhum bicho-de-sete-cabeças. Não existia na aplicação nenhum componente de terceiros, apesar do código ser um exemplo clássico de POG - Programação Orientada à Gambiarra.

O ponto crucial do trabalho estava centrado na conversão de um módulo do Visual Basic. Para quem não sabe, em linhas gerais, um módulo em Visual Basic é uma classe especial onde podem ser declaradas constantes, variáveis, funções e procedimentos, de forma que estes possam ser acessados por toda a aplicação. Não são poucos os desenvolvedores que fazem uso deste recurso. Contudo, é importante que se saiba que não existe no C# a funcionalidade de um módulo do VB, ou seja, não há a possibilidade de "alguém" disponibilizar variáveis globais para uma aplicação.

E a complicação não para por ai! A primeira solução para muitos, que seria usar uma classe estática, não resolve o problema. Na verdade, é preciso garantir a existência de UMA ÚNICA INSTÂNCIA de uma determinada classe para toda aplicação. Somente desta forma resolve-se o "problema do new".

A palavra-chave "new", parte integrante de grande parte das linguagens orientadas a objeto, permite criar quantos objetos você quiser de qualquer tipo. E estes objetos são instâncias distintas. O que significa que duas instâncias diferentes de uma classe poderiam escrever valores distintos em uma propriedade pública de nome "valor", por exemplo, existente nesta classe. E como cada instância da classe é uma área de memória diferente, teríamos duas classes distintas cujas propriedades de nome "valor" teriam valores diferentes uma da outra. Ótimo, não é? Com certeza não era esse o desejo do meu amigo quando implementou a classe "Module1" usando o VB.

Ao estudar melhor o problema apresentado, percebi que havia a necessidade de alterar o projeto original da classe "Module1", incompatível com o C#, de forma a dotá-la de um funcionamento similar a original e sem causar "grandes impactos" ao código legado. Sendo assim, resolvi adotar o "PADRÃO SINGLETON" para reprojetar a classe "Module1".

O padrão Singleton garante que uma classe possui apenas uma instância, e provê um ponto de acesso global a ela. Recomendo a pesquisa e a leitura de literatura sobre o assunto. Vale a pena! De qualquer forma, o problema foi solucionado com a adoção deste padrão.

Apresento abaixo a implementação da classe "Modulo" de acordo o padrão Singleton. Esta classe substituiu a antiga classe "Module1" no projeto do meu amigo. Observe o construtor da classe e, principalmente, a propriedade "Instancia" que retorna a própria classe "Modulo". Aí está a implementação do padrão Singleton. Veja que é bastante simples.

public class Modulo
{
    private static Modulo instancia;

    public int valor = 0;
    public string BD_tipo = string.Empty;
    public string UserID = "Usuário de Teste";

    // ### Aqui está o construtor da classe.
    private Modulo()
    {
    }

    public static Modulo Instancia
    {
        get
        {
            if (instancia == null)
            {
                instancia = new Modulo();
            }
            return instancia;
        }
    }
}

Para facilitar o entendimento dos senhores, eu preparei uma pequena aplicação de exemplo. O aplicativo completo pode ser baixado na área de downloads do site. O arquivo "ObjetoUNICO.zip" contém o projeto que foi compilado no Microsoft Visual C# 2008 Express Edition. De qualquer forma, como a coisa é realmente simples, eu mostro abaixo o código do único Form desta aplicação:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace app01
{
    public partial class Form1 : Form
    {
        Modulo Module1 = Modulo.Instancia;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Module1.valor = 500;
            Module1.BD_tipo = "SQL Server 2008 Enterprise";
            textBox1.Text = Module1.valor.ToString();
            textBox2.Text = Module1.UserID;
            textBox3.Text = Module1.BD_tipo;
        }
    }
}

Observe que o "Form1" faz uso da classe "Modulo", mas não a instancia por meio de "new", e sim, pela propriedade "Instancia", o que garante uma única instância da classe, independente de quem a chame. Eu declarei uma variável de nome "Module1" para receber a instância da classe "Modulo". Desta forma, os desenvolvedores VB que usam "Module1" terão menos trabalho na migração dos seus códigos.

Veja que o botão "Exibir" (button1_Click) manipula livremente (lê e escreve) as propriedades (variáveis) e métodos (funções) disponíveis na classe.

Pode até parecer bobeira, mas esta pequena dica pode acabar com as dores de cabeça de muitos desenvolvedores por aí. No caso do meu amigo, foi o ponto de partida para a total conversão para C# de uma comercial bastante complexa.

Espero ter sido útil.

Até breve!

Post Rating

Comments

There are currently no comments, be the first to post one.

Post Comment

Apenas usuários cadastrados podem postar comentários.
Imprimir  
 
 Copyright 2003-2010 - Ronaldo Cesar   Termos de Uso  Privacidade