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() Private Sub cmdSair_Click() |
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 :
SetFahrenheit - define um valor para a classe
SetCelsius - define um valor para classe
GetFahrenheit - obtém um valor da classe
GetCelsius - obtém um valor da classe
Public Class temperaturaPrivate temperatura As Single Public Sub setFahrenheit(ByVal valor As String) temperatura = 5 * (Val(valor) - 32) / 9 End SubPublic Sub setCelsius(ByVal valor As String) temperatura = Val(valor) End SubPublic Function getFahrenheit() As Single getFahrenheit = 9 * (temperatura / 5) + 32 End FunctionPublic Function getCelsius() As Single getCelsius = temperatura End FunctionEnd 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 ElseclTemp.setFahrenheit(txtTemperatura.Text) txtTemperaturaConvertida.Text = clTemp.getCelsius End IfEnd 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