SyntaxHighlighter

sexta-feira, 16 de agosto de 2013

VB.NET - Module

Em nosso primeiro artigo sobre VB, vamos falar sobre seus conceitos básicos, diante disso, vamos começar por Module, por ser o trecho de código mais elementar no VB.NET, mais adiante veremos outras formas de codificação como Classes, tipos e afins.

A palavra chave Module define um tipo de classe, com algumas exceções. Primeiro de tudo, qualquer função pública, subrotina, propriedade ou variável de instância ou membro definido dentro do escopo de um Module é definido como um membro compartilhado, ou seja, pode ser utilizado globalmente em sua aplicação, este tipo de membro definido permite ao desenvolvedor simular um escopo global dentro de sua aplicação. Abaixo, vemos a estrutura principal e padrão de um módulo, este é o Módulo principal de uma Console Application gerada pelo Visual Studio:

Module Module1 
 Sub Main()
 End Sub 
End Module 

Vamos então, utilizar um projeto com o Module, em seu Visual Studio, crie na sua Solution um Projeto Console Application no VB com o nome DivertindoSeComModule e digite o código como no Trecho de Código abaixo:

Module Module1

    Sub Main()
        'Executa a subrotina MostraBanner
        MostraBanner()

        'Pega o nome do usuário e diz "Olá"
        ApresentaUsuario()

        Console.ReadKey()
    End Sub

    Sub MostraBanner()
        Dim currColor As ConsoleColor = Console.ForegroundColor

        'Muda a cor do texto para amarela
        Console.ForegroundColor = ConsoleColor.Yellow

        Console.WriteLine("*** Bem vindo ao nosso primeiro projeto em VB ***")
        Console.WriteLine(" Este programinha simples, ilustra o papel ")
        Console.WriteLine("do Tipo Module")
        Console.WriteLine("*************************************************")

        'Devolve a cor original
        Console.ForegroundColor = currColor
    End Sub

    Sub ApresentaUsuario()
        Dim userName As String
        Console.Write("Entre com o seu nome: ")
        userName = Console.ReadLine()
        Console.WriteLine("Olá {0}. É um prazer tê-lo conosco.", userName)
    End Sub

End Module

Este programa ao ser executado, pressionando F5, retornará a seguinte saída:


"*** Bem vindo ao nosso primeiro projeto em VB ***
Este programinha simples, ilustra o papel
do Tipo Module
*************************************************
Entre com o seu nome: Luis Gabriel N. Simas
Olá Luis Gabriel N. Simas. É um prazer tê-lo conosco."


Projetos com Multiplos Modules

Em nosso exemplo atual, mostramos que o método Main() pode acessar diretamente os métodos MostraBanner e ApresentaUsuario. Porque estes métodos estão definidos dentro do mesmo Module junto com Main(), não é necessário que coloquemos como prefixo destes métodos o nome de Module1. Porém, caso precise fazê-lo, precisamos refatorar Main() como segue:

Sub Main()
        'Executa a subrotina MostraBanner
        Module1.MostraBanner()

        'Pega o nome do usuário e diz "Olá"
        Module1.ApresentaUsuario()

        Console.ReadKey()
    End Sub

No trecho acima, é completamente opcional esta sintaxe (não influencia nem mesmo na performance). Mas, digamos que vamos precisar criar um novo Módulo em nosso Projeto - chamado MeuModulo - dentro do mesmo arquivo .vb que cria um método parecido com o ApresentaUsuario de Module que contém a Main():

Module MeuModulo
 Public Sub ApresentaUsuario()
  Console.WriteLine("Olá Usuário Maroto...")
 End Sub
End Module

Agora, se você quiser chamar ApresentaUsuario de MeuModulo de dentro da Main(), aí sim você vai precisar colocar como prefixo explicitamente o nome do Módulo. Caso isso não aconteça, o método Main irá procurar por Module.ApresentaUsuario, se este método existir o compilador não retornará erro, mas caso não exista, teremos problemas. Vejamos abaixo a forma de chamada correta do método Main():

Sub Main()
        'Executa a subrotina MostraBanner
        MostraBanner()

        'Pega o nome do usuário e diz "Olá"
        MeuModulo.ApresentaUsuario()

        Console.ReadKey()
    End Sub

Novamente, para fixar: que um único projeto que define muitos Modulos não é necessário que se use o nome do Módulo como prefixo dos métodos que serão utilizados a não ser que os nomes sejam ambíguos assim como no caso do método ApresentaUsuario que existe em Module1 e MeuModulo, neste caso sim, precisamos informar ao compilador qual é o correto do contrário, Main() pegará de seu Module1.
Então, vamos criar mais um Módulo neste nosso projeto atual, chamado ModuloMatematico, como segue:

Module ModuloMatematico
    Function Soma(ByVal x As Integer, ByVal y As Integer)
        Return x + y
    End Function

    Function Subtracao(ByVal x As Integer, ByVal y As Integer)
        Return x - y
    End Function

End Module

Como estamos no mesmo Projeto, basta colocar o nome Soma no metodo Main() de Module1 que ele irá funcionar corretamente:

Sub Main()
        ...
 ...
 'Soma dois numeros
 Console.WriteLine("O resultado da soma é {0}.",Soma(2,2))
 
 'Subtrai dois Números
 'Colocar o nome do módulo como prefixo neste caso, é opcional 
 'É apenas uma demonstração de generalidade
 Console.WriteLine("O resultado da subtração é {0}", ModuloMatematico.Subtracao(2,2))
        Console.ReadKey()
    End Sub

Não se preocupe com relação a explicação de o que é uma Function e o que significa o ByVal, posto que mais adiante, estarei escrevendo um artigo sobre Funções e Subrotinas com VB.NET.

Módulos não são "instanciáveis"

Outra regra do tipo Module é que ele não pode ser diretamente criado usando a palavra new - qualquer tentativa de fazê-lo irá retornar em erro de compilação. Como o trecho abaixo irá retornar em erro:

'Isto não existe no .NET Framework 4.0
Dim m as New Module1()

Uma melhor explicação é que um Módulo apenas expõe membros compartilhados.

Membros dos Módulos

Para incrementar nosso estudo sobre Tipos de Módulos, saiba que módulos podem ter membros adicionais além de apenas subrotinas e funções. Se o leitor amigo quiser definir campos tais como propriedades ou eventos, você é livre para fazê-lo. Por exemplo, você precisa atualizar MeuModulo para receber uma única parte de um dado contendo uma String publica. Veja que o método ApresentaUsuario() agora irá imprimir este valor quando solicitado:

Module MeuModulo
 Public ContaUsuario As String
 Public Sub ApresentaUsuario()
  Console.WriteLine("Olá {0}",ContaUsuario)
 End Sub
End Module

Agora, vamos implementar o método refatorado:

Sub Main() 
 ... 
 'Grava o nome do usuário e chama ApresentaUsuario
 ContaUsuario = "Fred" 
 MeuModulo.ApresentaUsuario() 
 ... 
End Sub

Este foi o nosso primeiro artigo sobre VB.NET como prometido para os nossos leitores que precisam aprender e dominar tal linguagem, primeiramente, vamos explicar e detalhar o básico da linguagem sem muita firula, porque muito material sobre programação fala do be-á-bá que chega a ser cansativo, tentei ser o mais sucinto possível e sempre usando um Projeto por artigo.

Valorize sempre o trabalho em equipe porque não se consegue atingir nenhum resultado sozinho.

Obrigado por visitar o Blog, é um prazer tê-lo como leitor e até o próximo artigo.