Usuário com melhor resposta
Projeto em Camadas

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:
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
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- Sugerido como Resposta Francisco Gonçalves segunda-feira, 4 de março de 2013 17:16
- Marcado como Resposta Levi DomingosModerator domingo, 17 de março de 2013 12:47