Usando conceitos de  programação orientada a objetos 

 

A partir da versão 4.0 do Visual Basic já podíamos vislumbrar que tornar o VB uma linguagem orientada a objetos era uma questão de tempo. Nesta versão você já podia criar módulos de classes e módulos de formulários e usá-los como objetos. Herança ??? Nem pensar...

 

O problema é que após tantos anos de programação estrutura (as vezes desestruturada) fica difícil mudar a maneira pensar. Neste artigo vou mostrar como você pode aplicar os conceitos da orientação a objetos a projetos desenvolvidos no VB.NET.

 

Para saber mais sobre o assunto leia também os artigos :

 

VB .NET - Finalmente uma linguagem orientada a objetos

VB5/VB6 - Pondo em prática a Programação orientada a objetos

VB.NET - Orientação a objetos : Conceitos básicos em 10 lições

Meu primeiro projeto orientado a objetos : Cadastro de Clientes

Criando classes no Visual Basic

 

A solução estruturada

 

Suponha que você tenha que escrever um programa que faça a conversão de temperaturas de Celsius para Fahrenheit e vice-versa usando o VB.NET. Não seria difícil resolver este problema basta saber a fórmula para conversão.

 

A fórmula para conversão Celsius/Fahrenheit é    C =  (F-32) * 5/9    e    F = 9/5 * C +32

 

Usando os recursos do IDE do VB você poderia criar uma interface na qual o usuário informasse a temperatura e selecionasse qual o tipo de conversão para obter o resultado. Poderíamos fazer algo assim :

 

Option Explicit

Private Sub cmdConverter_Click()
Dim temperatura As Single
Dim temperaturaConvertida As Single

If optFahrenheit.Value Then
    temperaturaConvertida = 9 * (txtTemperatura.Text / 5) + 32
Else
    temperaturaConvertida = 5 * (txtTemperatura.Text - 32) / 9
End If

txtTemperaturaConvertida.Text = temperaturaConvertida

End Sub


Private Sub cmdSair_Click()
End
End Sub
 

 

Não levaria nem 1 minuto e a interface e o código estaria prontos para rodar e fazer a conversão conforme desejado. O usuário informa a temperatura que deseja converter clique em dos botões de opção e a seguir clica no botão Converter para obter o resultado final.

 

Embora o programa seja extremamente simples e fácil de compreender ele apresenta vários problemas. Eu não estou falando da verificação da entrada de dados , nem da verificação da seleção do usuário. O problema mais significativo neste aplicativo é que temos a regra de negócio e o tratamento de dados juntos com interface com o usuário.

 

Se você ainda não sabe é sempre bom separar a regra de negócios da camada de apresentação. Fazendo assim alterações na interface/regras de negócio não terão muito impacto no projeto em produção. (Se você precisar converter para graus Kelvin , por exemplo, vai ter que mexer no código e na interface)

 

Vou mostrar usando este projeto simples como você pode usar os conceitos da programação orientada a objetos para tornar a aplicação mais escalável e fácil de manter. Vou criar módulo de classes onde irei colocar toda lógica da aplicação separada da interface com o usuário. Com isto quero mostrar que você pode aplicar estes conceitos no seu dia a dia e em aplicações simples até as mais complexas com ganho final de produtividade e desempenho. Vamos então arregaçar as mangas e por a mão na massa...

 

Criando a classe Temperatura

 

Vou criar uma classe para o projeto chamada temperatura. Você sabe o que é uma classe no VB ? Bem , uma classe é um módulo que pode conter funções privadas e públicas e subrotinas que podem tratar variáveis e dados. Uma classe é como um formulário que não tem interface visual. Estas funções e subrotinas presentes no arquivo de módulo de classe são conhecidos como métodos.

 

Meu objetivo será remover a regra de negócios , no caso os cálculos de conversão , da interface e movê-los para a classe temperatura que irei criar.

 

Crie um novo projeto no Visual Basic .NET e inclua um módulo de classe chamada temperatura através do menu Project|Add Module e dê o nome temperatura.vb a classe criada:

 

A seguir eu vou criar o código para efetuar a conversão no módulo de classe. Para isto vou criar quatro métodos :

  1. SetFahrenheit - define um valor para a classe

  2. SetCelsius - define um valor para classe

  3. GetFahrenheit - obtém um valor da classe

  4. GetCelsius - obtém um valor da classe

Public Class temperatura
 

Private temperatura As Single


Public
Sub setFahrenheit(ByVal valor As String)

   temperatura = 5 * (Val(valor) - 32) / 9

End Sub
 

Public Sub setCelsius(ByVal valor As String)

   temperatura = Val(valor)

End Sub
 

Public Function getFahrenheit() As Single

   getFahrenheit = 9 * (temperatura / 5) + 32

End Function
 

Public Function getCelsius() As Single

   getCelsius = temperatura

End Function
 

End Class

 

Para você entender:

 

- A variável temperatura foi definida como do tipo private ; desta forma ela não pode ser vista fora da classe

- Os métodos são definidos como do tipo public ; desta forma podem ser acessados de fora da classe.

- Para alterar valores na classe e para obter valores da classe você terá que usar os métodos definidos

- O ponto principal da criação desta classe é que agora que esta chamando a classe não precisa saber nada sobre como os dados estão armazenados e como são tratados e retornados. Somente a classe deve saber isto.

- Podemos também incrementar a classe fazendo validações nos métodos criados de forma impedir valores incorretos.

- A classe trata os dados : você pode fornecer dados a ela e obter dados de conversão de temperatura.

- Se você precisar alterar a classe incluindo mais cálculos a interface não sofre alteração alguma.

 

Vamos agora usar a classe na interface. O código abaixo mostra como fazer isto:

 

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

 

Dim temperatura As Single

Dim temperaturaNova As Single

Dim clTemp As New Temperatura()
 

If optFahrenheit.Checked Then

   clTemp.setCelsius(txtTemperatura.Text)

   txtTemperaturaConvertida.Text = clTemp.getFahrenheit

Else

   clTemp.setFahrenheit(txtTemperatura.Text)

   txtTemperaturaConvertida.Text = clTemp.getCelsius

End If
 

End Sub

 

Como você pode ver não temos mais a regra de negócios na interface pois os cálculos foram movidos para a classe temperatura.

 

A linha de código :  Dim clTemp As New temperatura() cria uma instância da classe temperatura

 

Perceba que para criar uma copia funcional da classe (a sua instância) usamos a palavra chave New com a declaração Dim.

 

Nota: Se você apenas fizer : Dim clTemp As temperatura() estará criando um ponteiro para a instância da classe mas não terá inicializado uma instância atual . Você pode também definir o valor do ponteiro usando a palavra-chave Set. Ex: Set cltTemp = New temperatura.

 

Criamos a instância da classe temperatura e conforme a opção do usuário invocamos o método da classe pertinente para realizar conversão. A  linha de código clTemp.setCelsius(txtTemperatura.Text) usa o método setCelsius da classe temperatura através do objeto clTemp . (

(Podemos  observar a sintaxe objeto.método)

 

Percebeu que não foi preciso muito para ter um código mais limpo e reutilizável. Você pode melhorar ainda mais a classe e o projeto  retirando a decisão da camada de apresentação.

 

Embora o projeto acima tenha sido feito no VB.NET você pode aplicá-lo sem mudanças no VB5/6.

 

Até o próximo artigo ...

 


José Carlos Macoratti