none
Dúvida: Usar Classes Personalizadas ou Objetos (DataSet Tipado) para manipução dos Dados? RRS feed

  • Pergunta

  • Boa noite Pessoal..

    Vou explicar minha dúvida e tentar explicar o máximo!

    Em minha caminhada pelo mundo .Net fiz leituras de vários artigos de como manipular dados (Alterar, Incluir, Excluir ... dados um um BD) por exemplo, vários desses artigos citavam uma forma de fazer que vou mostra abaixo, e é o que uso hoje...

    Por exemplo, para cada Tabela do banco de dados crio uma classe.. Para a tabela de Produtos por exemplo crio a classe ClsProdutos com suas propriedades (cada campo da tabela é uma propriedade) e em seguida crio os métodos tais como Incluir(), Alterar(), Excluir() bem como vou postar abaixo:

        class ClsProdutos
        {
    
            //Campos Privados da Classe
            private int codigo;
            private string descricao;
            /*
             * ...
             * ...
             */
    
            //Propriedades Públicas p/ serem acessadas
            public int Codigo
            {
                set {codigo = value;}
                get { return codigo; }
            }
            public string Descricao
            {
                set { descricao = value; }
                get { return descricao; }
            }
            /*
             * ...
             * ...
             * ...
             */
    
            //Métodos da Classe
            public void Incluir()
            {
                //Código para incluir um registro no banco!
            }
            public void Alterar()
            {
                //Código para alterar um registro no banco!
            }
            public void Excluir()
            {
                //Código para excluir um registro no banco!
            }
            public DataTable RetornaTabela()
            {
                //Código para retornar todos os registro do bd!
                return new DataTable();
            }
            /*
             * Outros métodos para manipular Registros
             * ...
             * 
             */
        }
    Já no form, consumo a classe para usar os métodos Incluir, Alterar, Excluir ... desta maneira:

            //Para Gravar um Registro
            private void btnGravar_Click(object sender, EventArgs e)
            {
                clsProdutos ClsProdutos = new clsProdutos();
                //Adiciona o valor do Text Box para a propriedade Codigo da Classe ClsProdutos
                ClsProdutos.Codigo = (int)tbCodigo.Text;
                //Adiciona o valor do Text Box para a propriedade Descricao da Classe ClsProdutos
                ClsProdutos.Descricao = tbDescricao.Text();
                //Executa o método para inclusão!
                ClsProdutos.Incluir();
            }
    
            //Para excluir um registro
            private void btnExcluir_Click(object sender, EventArgs e)
            {
                clsProdutos ClsProdutos = new clsProdutos();
                //Adiciona o valor do Text Box para a propriedade Codigo da Classe ClsProdutos para efetivar a exclusão
                ClsProdutos.Codigo = (int)tbCodigo.Text;
                //Executa o método para a exclusão!
                ClsProdutos.Excluir();
            }
    
            /*
             * Outros processos!
             * 
             */

    Depois de algum tempo, me deparei com formas diferentes de fazer isto (Muito mais produtivas), uma forma seria manipular os dados direto no DataTable e apenas executar o método Update() do DataAdapter para efetivar a gravação dos registros no bd conforme o que foi feito na Row do DataTable (se a linha foi incluída o método Update() executa um insert no banco, caso foi alterada executa um Update e assim por diante...)

    Já no form posso usar o BindingSource vinculado em meus controles que fica mais facil e consequentemente a produção aumenta bastante!!..





    E é aí que vem a dúvida, qual usar, e porque muitas pessoas usam da primeira maneira, ou quem sabe eu que estou "viajando"???

    Gostaria que o pessoal postem suas opiniões sobre está questão, ou se eu estiver enganado de alguma coisa postem tambem!

    Abraços a todos
    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    • Movido Ricardo Oneda quarta-feira, 15 de julho de 2009 11:29 (De:C#)
    quarta-feira, 15 de julho de 2009 02:07

Respostas

  • Oi,

    O que você tem aí é um design pattern chamado ActiveRecord.
    Um objeto representando um registro do banco de dados e responsabilizando-se pelo próprio Insert, Update, e Delete.

    Vendo por um nível mais você tem aí um mapeamento entre dados do banco de dados e um objeto, o que é conhecido como ORM.
    Esta reprensentação de um registro do banco em forma de um objeto tornará o seu código muito mais expressivo do que a utilização de DataTable e DataSets.

    O ideal é que você utilize um framework ORM para resolver o problema do mapeamento para você.
    Isto te trará não apenas produtividade (que TableAdapters e DataTablez também trazem), mas também diversos tipos de ganho associados ao aumento de expressividade do código, gerados pela adoção do ORM.

    Um bom framework vai gerar automaticamente para você as instruções SQL de insert, update, delete, e alguns tipos de select.
    []'s
    Rafael Noronha
    http://rafanoronha.net/
    follow me: @rafanoronha
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:02
    quarta-feira, 15 de julho de 2009 15:49
  • Pimpão,

    Eu ficaria longe de datasets.
    Complementando o que o Rafael já falou, eu buscaria um padrão que separasse o código da entidade e seu comportamento de negócios, do código relacionado a banco de dados. Dê uma olhada no padrão repositório, ele faz exatamente isso.
    Aproveitando: Se você decidir continuar neste padrão, você pode fazer isso sem escrever uma linha de SQL, com o Castle ActiveRecord.
    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:02
    quinta-feira, 16 de julho de 2009 04:31
    Moderador
  • Tem um vídeo do Ayende (do NH) mostrando o Castle ActiveRecord. É um video impressionante:
    http://archive.oredev.org/topmenu/video/altnet/ayenderahien.4.71552e2411fa881a5cb800021937.html
    Você pega o Castle AR aqui:
    http://www.castleproject.org/activerecord/
    Aqui tem um video sobre o Entity Framework no PDC do ano passado:
    http://channel9.msdn.com/pdc2008/TL20/
    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:03
    sexta-feira, 17 de julho de 2009 02:10
    Moderador
  • De certa forma você usa um padrão reconhecido, o ActiveRecord. Só que há maneiras melhores de fazê-lo, com ajuda de alguns ORMs.
    Como eu disse, prefiro o padrão repositório, ao Active record.

    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:03
    sexta-feira, 17 de julho de 2009 02:48
    Moderador
  • Opa Pimpão

    Não.. Eu me referia ao paragrafo: "Aproveito o gancho para perguntar: existe alguem que desenvolva usando DataSets tipados, TableAdapters, BindingSource, BindingNavigator e cia?? "

    []s

    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:04
    sexta-feira, 17 de julho de 2009 02:52

Todas as Respostas

  • Oi,

    O que você tem aí é um design pattern chamado ActiveRecord.
    Um objeto representando um registro do banco de dados e responsabilizando-se pelo próprio Insert, Update, e Delete.

    Vendo por um nível mais você tem aí um mapeamento entre dados do banco de dados e um objeto, o que é conhecido como ORM.
    Esta reprensentação de um registro do banco em forma de um objeto tornará o seu código muito mais expressivo do que a utilização de DataTable e DataSets.

    O ideal é que você utilize um framework ORM para resolver o problema do mapeamento para você.
    Isto te trará não apenas produtividade (que TableAdapters e DataTablez também trazem), mas também diversos tipos de ganho associados ao aumento de expressividade do código, gerados pela adoção do ORM.

    Um bom framework vai gerar automaticamente para você as instruções SQL de insert, update, delete, e alguns tipos de select.
    []'s
    Rafael Noronha
    http://rafanoronha.net/
    follow me: @rafanoronha
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:02
    quarta-feira, 15 de julho de 2009 15:49
  • Pimpão,

    Eu ficaria longe de datasets.
    Complementando o que o Rafael já falou, eu buscaria um padrão que separasse o código da entidade e seu comportamento de negócios, do código relacionado a banco de dados. Dê uma olhada no padrão repositório, ele faz exatamente isso.
    Aproveitando: Se você decidir continuar neste padrão, você pode fazer isso sem escrever uma linha de SQL, com o Castle ActiveRecord.
    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:02
    quinta-feira, 16 de julho de 2009 04:31
    Moderador
  • Olá Rafael e Giovanni.

    Primeiramente obrigado pelas respostas...

    Se possível, vcs tem algum exemplo da utilização de algum ORM?

    Se possível postem links de artigos (Estou procurando, mas se vocês tem algum material que consideram bom por favor postem!)...


     Obrigado a todos!


    Abraços!
    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    sexta-feira, 17 de julho de 2009 02:07
  • Tem um vídeo do Ayende (do NH) mostrando o Castle ActiveRecord. É um video impressionante:
    http://archive.oredev.org/topmenu/video/altnet/ayenderahien.4.71552e2411fa881a5cb800021937.html
    Você pega o Castle AR aqui:
    http://www.castleproject.org/activerecord/
    Aqui tem um video sobre o Entity Framework no PDC do ano passado:
    http://channel9.msdn.com/pdc2008/TL20/
    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:03
    sexta-feira, 17 de julho de 2009 02:10
    Moderador
  • Olá pessoal

    O Giovanni diz "Eu ficaria longe de datasets."..

    Aproveito o gancho para perguntar: existe alguem que desenvolva usando DataSets tipados, TableAdapters, BindingSource, BindingNavigator e cia??

    Vejo que todos aqui (com exceção de alguns iniciantes/estudantes) implementam tudo "no braço" ou utilizam ORM.

    Pq ninguem usa essas "parafernalhas" acima (e seus wizards)?

    []s

    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    sexta-feira, 17 de julho de 2009 02:20
  • No braço eu não implemento nada. É muito improdutivo, cliente nenhum paga essas longas horas. E eu nem quero que pague...

    Já vi (e infelizmente fiz - no passado) desenvolvimento com datasets e tableadapters. Porque não recomendo? Porque geralmente leva a um desenho baseado em tabelas, e não a entidades de negócio. Porque muitas vezes o sistema fica procedural e não OO. Porque é mais dificil trabalhar com boas práticas, e mais dificil de testar.
    TableAdapter, Datasources, etc, me parece quase sempre demoware.

    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    sexta-feira, 17 de julho de 2009 02:22
    Moderador
  • Obrigado Giovanni

    Todos nós já usamos os dataset tipados algum dia... heheh

    Outra coisa: para utilizar o pattern Castle Active Record, devo utilizar o NHIbernate, correto?
    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    sexta-feira, 17 de julho de 2009 02:27
  • Sim, ele usa internamente o NH.

    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    sexta-feira, 17 de julho de 2009 02:28
    Moderador
  • Olá Robson..

    Onde vc faz a pergunta "Pq ninguem usa essas "parafernalhas" acima (e seus wizards)?" vc está se referindo o Castle Active Record e outros???


    Agora fiquei meio "boiando", vc aconselha o uso das "parafernalhas" ou não?


    Outra pergunta para todos:
    Então a maneira que estou desenvolvendo está correto? (Criando as classes ....) ?


    Abraços!
    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    sexta-feira, 17 de julho de 2009 02:44
  • De certa forma você usa um padrão reconhecido, o ActiveRecord. Só que há maneiras melhores de fazê-lo, com ajuda de alguns ORMs.
    Como eu disse, prefiro o padrão repositório, ao Active record.

    Giovanni Bassi, Microsoft MVP, MCSD, MCPD, CSM, Arquiteto de software - http://www.giovannibassi.com
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:03
    sexta-feira, 17 de julho de 2009 02:48
    Moderador
  • Opa Pimpão

    Não.. Eu me referia ao paragrafo: "Aproveito o gancho para perguntar: existe alguem que desenvolva usando DataSets tipados, TableAdapters, BindingSource, BindingNavigator e cia?? "

    []s

    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta Pimpão sexta-feira, 17 de julho de 2009 03:04
    sexta-feira, 17 de julho de 2009 02:52
  • Ok pessoal...

    Acho que agora depende de mim mesmo (Estudar sobre o uso de ORMs)...


    Vou fechar o post agora, irei estudar mais sobre ORMs e quando surgir mais dúvidas irei postar..


    Não sei nem como agradecer pelo tempo gasto dos senhores..

    Muito agradecido.

    Abraços a todos!
    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    sexta-feira, 17 de julho de 2009 03:02