none
Projeto em Camadas RRS feed

  • Pergunta

  • Fala ai galera bom dia todos blz?

    Pessoal estou iniciando meus estudos em C#, gostaria de tirar algumas dúvidas. Eu estou construindo um projeto em camadas, verifiquei que existem diversas formas para criar este tipo projeto de acordo a necessidade. Eu fiz uns exemplos em VB.NET verifiquei que o meu código tinha vários métodos parecidos como Insert - Delete - Update para as mesmas classes. Sendo o código ficou gigantesco e poluído por tantos métodos repetitivos.

    1 - Gostaria de saber existem um padrão bom para o meu desenvolvimento onde não precise implementar tantos métodos idênticos em classes diferentes.

    2 - Gostaria de uma método que precisa-se só saber qual operação o usuário está requisitando: ( INSERT - UPDATE - DELETE ).

    Não sei se é a maneira mais correta de se fazer, vejo muitos exemplos utilizando esta multidão de código em todas as classes. Eu até arrisquei a fazer uma interface para gerenciar esta parte por antes ficava repetindo todos os método do CRUD em todas as minhas classes, agora só utilize um método para fazer todos os procedimentos, gostaria da ajuda de você sobre esta implementação que fiz para um sistema de pequeno porte. Vejam a imagem:

    Projeto Crud

    Aqui o método utilizado:

     Public Function Inserir(modelo As Pessoa_Information, tagbutton As String) As Boolean Implements IPessoa.Inserir
                _retValor = False
    
                Try
                    _querySql = Nothing
                    Select Case tagbutton
                        Case "1"
                            _querySql = "INSERT INTO TablePessoa (pes_Nome, pes_Endereco) " + _
                                                "VALUES (@pes_Nome, @pes_Endereco); SELECT @@IDENTITY;"
                            Exit Select
    
                        Case "2"
                            _querySql = "UPDATE Pessoa " + _
                                "SET pes_ID=@pes_ID, pes_Nome =@pes_Nome, pes_Endereco =@pes_Endereco, " + _
                                "pes_Cidade=@pes_Cidade, pes_UF =@pes_UF " + _
                                "WHERE pes_ID=@pes_ID"
                            Exit Select
    
                        Case Else
                            _querySql = "DELETE FROM Pessoa WHERE pes_Id = " + modelo.Pessoa_ID
                            Exit Select
                    End Select
    
                    _sqlConn = New SqlConnection(_strSQL)
                    _sqlConn.Open()
    
                    _sqltrans = _sqlConn.BeginTransaction(IsolationLevel.ReadCommitted)
                    _sqlCmd = New SqlCommand()
    
                    With _sqlCmd
                        .Connection = _sqlConn
                        .CommandType = CommandType.Text
                        .CommandText = _querySql
                        .Parameters.AddWithValue("@pes_ID", modelo.Pessoa_ID)
                        .Parameters.AddWithValue("@pes_Nome", modelo.Razao_Social)
                        .Parameters.AddWithValue("@pes_Endereco", modelo.Fantasia)
                        '.Parameters.AddWithValue("@pes_Cidade", modelo.CPFCNPJ)
                        '.Parameters.AddWithValue("@pes_UF", modelo.Orgao_Exp)
                        .Transaction = _sqltrans
                        .ExecuteNonQuery()
                        .Parameters.Clear()
    
                    End With
                    _sqltrans.Commit()
                    _retValor = True
    
                Catch ex As Exception
                    Throw ex
                    _sqltrans.Rollback()
    
                Finally
                    liberaTodosObjetos()
                End Try
    
                Return _retValor
            End Function
    

    quinta-feira, 21 de fevereiro de 2013 14:01

Respostas

  • Fala rapaz,

    Minha opinião é a seguinte:

    O seu exemplo de código pode "parecer" (mas só parecer) inicialmente mais simples de criar, porém, você terá uma séria de desvantagens ao longo do tempo.

    1 - Da forma que você esta criando, se torna quase impossível fazer testes unitários.

    2 - Cada vez que você tiver uma particularidade você terá que incluir mais um IF ou CASE. E sabemos que cada carinhas desses aumenta a probabilidade de bug e dificuldade na manutenção e testes.

    3 - Imagine o seguinte caso: A partir de agora, você precisa apenas alterar a cor do carro. (Update TbCarro no campo Cor.) Só que da forma que você criou, você terá que passar todos os parâmetros, mesmo aqueles que você não utilizou. Para sair desse problema você teria que criar um IF no meio do código ou então passar todos os parâmetros sempre.

    Existem mais desvantagens do que vantagens nesta sua abordagem. Sugiro que você volte para o modelo básico mesmo que aparentemente inicialmente parece mais "custoso"

    ok?


    Francisco Gonçalves
    Blog: http://franciscogoncalves.com
    MTAC - MCPD Web Developer 4

    segunda-feira, 4 de março de 2013 17:16