O que é Design Patterns?


por Fabio Aguiar em 12/9/2006

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.

voltar   comente  subir

 
Fabio Aguiar



Comentários:
Comentado por: Mauricio Junior - 13/9/2006 12:16:12
Muito legal a sua explicação. Parabens pelo artigo, me ajudou muito.
Comentado por: Roberto Amâncio - 18/9/2006 1:08:07
Parabéns Fábio, o artigo ficou ótimo.
Comentado por: Rafael - 3/10/2006 16:26:07
Trabalho com VB.Net, li seu artigo e achei muito legal, um exemplo simples porém inteligente.
Abraço
Comentado por: Rubens - 9/10/2006 23:26:04
Artigo ótimo!
Parabéns...

Leia o artigo sobre O/R M, ele pode ser muito util para construção de sistemas adotando este design pattern.
Comentado por: Cleiton Marx - 7/7/2008 0:00:00
Era tudo que eu precisava. Eu não conseguia entender quando era chamado o VO. Com esse exemplo ficou tudo exclarecido. Valeu!

Comente (dê sua opinião):
Comentário:
Código Imagem:  (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

 

Outros Artigos do Autor

Alterando e criptografando a String de Conexão em RunTime (.NET 2.0)
Como criar facilmente arquivos XML via código
Como criar um CompositeControl, TextBox com Validador
O que é Design Patterns?