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.