Pergunta

Como eu mencionei no título, estou interessado em saber o que você (como desenvolvedores experientes) refletir sobre o uso do padrão DAO, especificamente dentro de uma aplicação web.Quais são as vantagens que você já encontrou e quais as consequências do seu uso, você não gostou?

Foi útil?

Solução

Os problemas com DAOs que eu tenho visto é que eles geralmente punho cheio de objetos o tempo todo.Isso cria completamente desnecessários sobrecarga de que não existiria com consultas simples.Por exemplo, se uma gota para baixo é para ser criado fora do banco de dados de referência, um DAO usuário pode simplesmente dizer:"Get me a coleção de objetos para esta tabela onde y ordenar por z".Em seguida, esses dados são usados na lista pendente, mas, normalmente, apenas de uma chave/valor de combinação, ignorando tudo o mais em que os objetos (dados criado, o último usuário que atualizou ele, se ele está ou não ativo, etc.), que foi recuperada e mapeados.Mesmo se esta massageando acontece perto da chamada DAO e os objetos não ficam armazenados como eles são obtidos (o que normalmente não é o caso, infelizmente, os objetos são muitas vezes envolto em uma c:forEach (JSP) e iterados para produzir uma gota para baixo), ele ainda cria da base de dados desnecessários e a sobrecarga da rede, para não mencionar o aumento temporário na memória para armazenar esses objetos.

Agora, isto não é para dizer que um DAO não pode ser concebido para obter um Mapa de referência de dados - sem dúvida que pode.Mas normalmente eles são usados para o completo mapeamento de objeto, o que não é o que é necessário todo o tempo.É uma força quando a economia, mas uma fraqueza, IMO, quando a obtenção de dados - claro, você tem tudo isso, mas muitas vezes você não precisa de tudo isso, e ele apenas resíduos de memória, largura de banda e tempo.

Outras dicas

Nota: Você pode encontrar outras deficiências, mas aqui está uma lista rápida da minha experiência

Prós:

  • Chamadas comuns para recuperar objetos.
  • Depois de ter o conjunto de fluxo Geral Create/Read/Atualizar/Excluir, o layout geral pode ser repetido para outros DAOs.
  • Ele também consolida para onde a parte específica da persistência do seu código pode ir. Separa a lógica de negócios de outros componentes do seu código.

Contras:

  • Não é a coisa mais flexível de todos os tempos.
  • Se você deseja-carregar alguns objetos infantis, precisará misturar os DAOs com outras camadas ou tomar precaução ao tentar recuperar os objetos preguiçosos.
  • Se você escrevizar os DAOs, o código pode se tornar tedioso e repetitivo.

Benefícios do uso do padrão de design dao

O padrão de design do objeto DAO ou Data Access é um bom exemplo de princípios orientados a objeto de abstração e encapsulamento. Ele separa a lógica de persistência é uma camada separada chamada camada de acesso a dados que permite que a aplicação reaja com segurança para mudar no mecanismo de persistência. Por exemplo, se você mudar do mecanismo de persistência baseado em arquivos para o banco de dados, sua alteração será limitada à camada de acesso a dados e não afetará os objetos de serviço ou de domínio. O objeto de acesso a dados ou o padrão DAO é praticamente padrão no aplicativo Java, sendo o principal java, aplicativo da web ou aplicativo corporativo. A seguir, alguns mais benefícios do uso do padrão DAO no aplicativo Java:

enter image description here

  1. O padrão de design da DAO também mantém o acoplamento baixo entre diferentes partes de um aplicativo. Ao usar o padrão de design dao, sua camada de visualização é completamente independente da camada DAO e apenas a camada de serviço tem a dependência dele, que também é abstraída usando a interface DAO.

  2. O padrão de design da DAO permite que o teste JUNIT seja mais rápido, pois permite criar simulação e evitar a conexão ao banco de dados para executar testes. Melhora os testes porque é fácil escrever testes com objetos simulados, em vez de um teste de integração com o banco de dados. No caso de qualquer problema, ao executar o teste de unidade, você só precisa verificar o código e não o banco de dados. Também protege com a conectividade do banco de dados e os problemas do ambiente.

  3. Como o padrão DAO é baseado na interface, ele também promove o princípio do design orientado a objetos "Programação para interface do que a implementação", o que resulta em código flexível e de qualidade.

As forças do padrão DAO são que elas permitem que você crie uma boa camada de abstração do sistema de armazenamento real. Eles fornecem uma visão mais orientada a objetos da camada de persistência e uma separação limpa entre o domínio e o código que realmente executará o acesso a dados (JDBC reto, estruturas de persistência, ORM ou mesmo JPA).

Se eu tivesse que citar uma fraqueza, bem, eu diria que é outra camada ... mas acho que esse é o preço a pagar para não vincular seu código à API de persistência subjacente.

Vimos algum benefício real na introdução de um padrão DAO em nossa implementação. Isso devido principalmente à clara separação entre a interface e a implementação do banco de dados. Observamos os seguintes benefícios:

  • A abstração para a implementação real de acesso ao banco de dados separa a estratégia de acesso a dados da lógica de negócios do usuário. Isso nos permitiu escolher uma estratégia de implementação de curto prazo (Spring JDBC) para a fase inicial do projeto com a opção de mudar para Ibatis ou hibernar em uma data posterior. (Uma escolha que não estamos em posição de fazer neste momento.)
  • A separação introduz benefícios significativos de testabilidade, pois toda a implementação de acesso a dados pode ser ridicularizada nos testes de unidade. (Este é provavelmente o maior benefício)
  • Combinar isso com a primavera nos permite injetar qualquer implementação de banco de dados no sistema que escolhemos (embora isso possivelmente diga mais sobre DI do que o padrão DAO).

Uma questão que encontramos, e isso pode ser devido à falta de clareza de design de nossa parte é a "inclinação" para reutilizar os objetos de valor de dados publicados fora do banco de dados como objetos de transferência entre as camadas de abstração subsequentes na arquitetura. Nossa solução após alguma dor era ter um objeto de valor por camada (ou seja, não reutilizar os objetos de valor do banco de dados nas camadas arquitetônicas subsequentes).

PRÓ

  • Ponto único de definição para tabela de banco de dados - mapeamento de atributo de objeto
  • Possibilidade transparente para implementações DAO para outros tipos de armazenamento
  • Desenvolva um padrão de interface todos os seguintes
  • Desenvolvendo uma aula de teste Junit mais ou menos padrão para os resultados da DAO em melhor cobertura de teste
  • controle total sobre detalhes
  • sem perda de desempenho devido a uma solução excessivamente genérica

VIGARISTA

  • menos "sexy" do que usar a estrutura mais recente
  • Os desenvolvedores não conseguem inventar suas próprias rodas (pode ser um profissional :-))

Como na maioria dos padrões de desenvolvimento, o uso de Dao leva algum tempo para se acostumar. Com a experiência, surgem os benefícios de código e desenvolvedores mais robustos que sabem por que as coisas funcionam, não apenas o que parece. Esse último ponto é a maior vantagem para mim.

Advertência, dependendo da sua situação usando uma estrutura de persistência, pode ser uma boa alternativa para codificar o seu próprio DAO.

Que alternativa você está considerando?

Parece bastante óbvio que colocar a responsabilidade pela persistência em algum lugar que não seja o nível de apresentação geralmente será bom, apenas a partir de argumentos de clareza de responsabilidade e reutilização. Instintivamente, adoto uma abordagem de três camadas: apresentação, serviço, persistência. Confesse em ter feito isso dessa maneira há tanto tempo que não consigo adquirir evidências de dor sofridas por não fazê -lo dessa maneira. Para mim, parece "óbvio" que ter uma única camada que entenda o mecanismo de persistência deve simplificar os testes, facilitar a manutenção e dar uma boa separação de preocupações.

Então isso deixa a questão de exatamente como fazer a camada de persistência. Minha suposição padrão seria usar o JPA (ou estruturas similares). Eu vejo isso como um exemplo sofisticado de Dao.

Então, eu vejo dois custos de Dao. Primeiro, você precisa investir na estrutura do seu programa, em seu design. Para casos triviais, isso pode parecer um exagero. Segundo, se você usar uma estrutura que implementa o DAO para você, existe uma curva de aprendizado. Comparado com apenas escrever o código JDBC diretamente, este é outro investimento.

Pro: separação abstrata.
CON: Código Boilerplate (graças a Deus por geradores/modelos de código e ORM).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top