Olá Amigos da Comunidade ASPNETi,
Meu nome é Fabio Aguiar, sou programador asp.net nas linguagens VB.NET e C# há 3 anos e este é o meu primeiro artigo técnico. Vai ser um desafio e tanto, mas tenho certeza que vai ser uma experiência muito boa para mim, e espero, pra vocês também. Quero dividir aqui, minha experiência em ASP.NET e mostrar também as novidades que estão surgindo nessa área.
Hoje vou falar sobre Design Patterns. Mas afinal, o que são Design Patterns?
A definição clássica para Pattern é a seguinte: "um Pattern descreve um problema que se repete várias vezes em um determinado meio, e em seguida descreve o núcleo da sua solução, de modo que esta solução possa ser usada milhares e milhares de vezes” [Christopher Alexander].
Patterns são soluções genéricas e reutilizáveis, aplicáveis em classes de problemas bem conhecidos. Soluções que um dia funcionaram, tornam-se receitas para situações similares (desde que estas soluções tenham sido projetadas com flexibilidade).
Um Design Pattern pode ser usado em qualquer linguagem de programação, já que se trata de padrões de desenvolvimento, por isso, o que vou descrever aqui, é o padrão que eu sigo. Não é necessário também que se uso só um padrão, você pode usar vários conceitos num mesmo sistema.
Meu padrão de código se divide em três partes, VO (Value Object), BO (Business Object), e Model (modelo). Na teoria, VO’s são usados para transportar dados entre as camadas BO e Model. Vamos ver como é isso na prática: imagine que você tenha uma procedure para logar o usuário no sistema, você manda o usuário e a senha, e retorna todas as informações do usuário caso o logon tenha sucesso, como você poderia fazer isso usando o conceito de Design Patterns?
Veja a seguir, primeiro a classe voUsuarios, que contém os valores:
|
Public Class voUsuarios
Private _usuario As String
Private _senha As String
Private _nome As String
Private _email As String
Private _codigo As Integer
Public Property Usuario() As String
Get
Return _usuario
End Get
Set(ByVal value As String)
_usuario = value
End Set
End Property
Public Property Senha() As String
Get
Return _senha
End Get
Set(ByVal value As String)
_senha = value
End Set
End Property
Public Property Nome() As String
Get
Return _nome
End Get
Set(ByVal value As String)
_nome = value
End Set
End Property
Public Property Email() As String
Get
Return _email
End Get
Set(ByVal value As String)
_email = value
End Set
End Property
Public Property Codigo() As Integer
Get
Return _codigo
End Get
Set(ByVal value As Integer)
_codigo = value
End Set
End Property
End Class
|
Depois a classe modelUsuários, que contem os parametros e o nome da procedure:
|
Imports System.Data
Imports System.Data.SqlClient
Public Class modelUsuarios
Private mIList As IList
'Nome da procedure
Public ReadOnly Property ComandoAutenticar() As String
Get
Return "proc_AutenticaUser"
End Get
End Property
'Parametros
Public Function mountParamAutenticar(ByVal vUsuarios As voUsuarios) As IList
Dim SQLparam As SqlParameter
mIList = New Collection
Try
'Login
SQLparam = New SqlParameter
SQLparam.ParameterName = "@login"
SQLparam.SqlDbType = SqlDbType.VarChar
SQLparam.Value = vUsuarios.Usuario
mIList.Add(SQLparam)
'Senha
SQLparam = New SqlParameter
SQLparam.ParameterName = "@senha"
SQLparam.SqlDbType = SqlDbType.VarChar
SQLparam.Value = vUsuarios.Senha
mIList.Add(SQLparam)
Return mIList
Catch ex As Exception
Throw ex
End Try
End Function
End Class
|
Por fim, a classe boUsuarios, onde tudo acontece:
|
Imports System.Data
Imports System.Data.SqlClient
Public Class boUsuarios
Private oSQL As SqlConnection
Private oCmd As SqlCommand
Private ds As DataSet
Private DtAdp As SqlDataAdapter
Public Sub Autenticar(ByVal vUsuarios As voUsuarios)
Dim mUsuarios As New modelUsuarios
oSQL = New SqlConnection(ConfigurationManager.ConnectionStrings(0).ConnectionString)
oCmd = New SqlCommand(mUsuarios.ComandoAutenticar, oSQL)
Try
oSQL.Open()
Dim mList As IList = mUsuarios.mountParamAutenticar(vUsuarios)
For Each param As SqlParameter In mList
oCmd.Parameters.Add(param)
Next
DtAdp = New SqlDataAdapter(oCmd)
DtAdp.Fill(ds)
Try
If ds.Tables(0).Rows.Count <> 0 Then
Dim dr As DataRow = ds.Tables(0).Rows(0)
vUsuarios.Codigo = dr("usu_codigo")
vUsuarios.Nome = dr("usu_nome")
vUsuarios.Email = dr("usu_email")
vUsuarios.Usuario = dr("usu_usuario")
Else
vUsuarios.Codigo = -1
End If
Catch ex As Exception
Throw ex
End Try
Catch ex As Exception
Throw ex
Finally
oSQL.Close()
oCmd.Dispose()
oCmd = Nothing
oSQL = Nothing
DtAdp.Dispose()
DtAdp = Nothing
End Try
End Sub
End Class
|
Agora veja, como usamos:
|
Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLogin.Click
Dim vUsuarios As New voUsuarios
Dim bUsuarios As New boUsuarios
Try
vUsuarios.Usuario = tbUserName.Text
vUsuarios.Senha = tbSenha.Text
bUsuarios.Autenticar(vUsuarios)
If vUsuarios.Codigo <> -1 Then
Session("UserDados") = vUsuarios
FormsAuthentication.RedirectFromLoginPage(tbUserName.Text, False)
Else
lbMSG.Text = "Nome de Usuário ou Senha inválida"
End If
Catch ex As Exception
lbMSG.Text = "Erro: " & ex.Message
Finally
vUsuarios = Nothing
bUsuarios = Nothing
End Try
End Sub |
Note que salvei os dados do login no Session, você poderá utilizar esses dados em qualquer situação, bastando declarar como uma variável do tipo voUsuarios:
|
Dim vUsuarios As voUsuarios
vUsuarios = DirectCast(Session("UserDados"), voUsuarios)
If Not IsNothing(vUsuarios) Then
lbCodigo.Text = vUsuarios.Codigo
lbNome.Text = vUsuarios.Nome
End If |
Este modelo assegura que somente a camada VO terá acesso aos dados, fazendo o papel do transporte. O desenvolvimento N-Tier, ou multi-camadas, é recomendado para qualquer aplicação, ou pelo menos eu penso assim. Minha recomendação é que faça sempre uso de boas práticas de desenvolvimento, com certeza suas aplicações ficarão mais limpas, seguras, mais fácil de fazer a manutenção e a reutilização do código.
Espero que seja muito proveitoso para vocês.
Um abraço e até a próxima.