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 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 ' 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 |
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
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.