Tive uma discussão muito estimulante e interessante com um colega sobre ORM e seus prós e contras. Na minha opinião, um ORM é útil apenas nos casos mais raros. Pelo menos na minha experiência.
Mas não quero listar meus próprios argumentos no momento. Então eu pergunto a você, o que você acha do ORM? Quais são os prós e os contras?
Respostas:
Existe um conjunto bastante amplo e variado de dificuldades conceituais e técnicas ao tentar abordar um banco de dados relacional a partir de um ângulo orientado a objetos. Essas dificuldades são coletivamente conhecidas como incompatibilidade de impedância objeto-relacional e o artigo relacionado da Wikipedia é extremamente informativo. O artigo identifica alguns, não vejo nenhuma maneira sensata de descrevê-los aqui. Apenas para lhe dar uma ideia geral, eles são catalogados como:
Acho que, se você der um tempo para ler o artigo, entenderá que o fato de o ORM às vezes ser descrito como um antipadrão é inevitável. Os dois domínios são tão diferentes que qualquer abordagem para tratar um como o outro é, por padrão, um antipadrão, no sentido de que um antipadrão é um padrão contrário à filosofia de um domínio.
Mas não acho que o termo deva se aplicar a qualquer coisa que atue essencialmente como uma ponte entre dois domínios muito diferentes. Rotular um padrão como antipadrão faz sentido apenas dentro de seu domínio. Portanto, a questão de saber se é um anti-padrão ou não é irrelevante.
Mas isso é útil? Sim, o ORM é um dos anti-padrões mais úteis existentes. Você entenderá o motivo somente se se encontrar em uma situação prática em que precisará trocar bancos de dados em um projeto. Ou ainda atualize para outra versão do mesmo banco de dados. ORM é uma dessas coisas, que você só entende completamente quando realmente precisa delas.
Obviamente, como tudo útil, o ORM é altamente propenso a abusos. Se você acha que, de alguma forma, substitui a necessidade de saber tudo sobre o banco de dados em que trabalha, ele voltará e o morderá. Difícil.
Por fim, permita-me sem vergonha acrescentar outra das minhas respostas , no relacionado "O padrão ActiveRecord segue / incentiva os princípios de design do SOLID?" questão, que para mim é uma questão muito mais relevante do que "é um antipadrão".
fonte
Isso é semelhante a perguntar "uma furadeira é um antipadrão?". Os ORMs ganharam um bom lugar na minha caixa de ferramentas, reduzindo meu código padrão e ainda posso usar o SQL personalizado, se necessário. Então, se é um antipadrão, contra qual padrão ele vai contra?
Minha resposta é não, existem muitas ORMs maduras por aí que tornam sua vida muito mais fácil e tornam seu código mais compreensível. De qualquer forma, isso significa que você não precisa entender SQL, muito pelo contrário.
fonte
Eu hesitaria em chamar algo de "antipadrão", que foi chamado de Martin Fowler por padrão e desde então foi adotado em quase todas as linguagens de programação modernas. (Veja o artigo da Wikipedia sobre ActiveRecord .)
Um bom ORM pode levar a muito menos código (e muito menos repetição) em um projeto, e nada está tão fortemente correlacionado com bugs quanto a quantidade de código original.
Os ORMs geralmente são projetados para lidar com os casos de uso mais comuns para trabalhar com bancos de dados. As consultas complexas ainda precisam ser escritas explicitamente. Mas eu recomendaria fortemente escrever consultas explícitas para cada interação com o banco de dados. Na maioria dos casos, isso é uma perda de tempo.
fonte
Usar um ORM em vez de aprender SQL é uma péssima idéia. Se você não sabe exatamente o tipo de SQL que está sendo gerado, se não entende os problemas do N + 1 e como otimizar, isso definitivamente causará mais danos do que benefícios. Porém, sinto que sou muito mais produtivo usando um ORM. Eu prefiro o Rails ActiveRecord, que não tenta fingir que não há banco de dados e não atrapalha se você apenas precisar escrever SQL. Eu me preocupo, no entanto, que algumas pessoas possam confiar profundamente nos idiomas que vêem, sem uma compreensão profunda do que estão fazendo.
fonte
Minha experiência: estou usando NHibernate com Linq2NHibernate.
Prós:
Contras:
Eu direi que não cumpre a promessa que a maioria das pessoas inicialmente espera. Eu não culpo alguém por dizer que é um anti-padrão. Acho, no meu caso, que ainda preciso fazer testes de integração com um banco de dados SQLite para garantir que minhas consultas Linq2NHibernate realmente funcionem. Então, realmente, se você estiver fazendo testes de integração com um banco de dados relacional real de qualquer maneira, isso elimina o problema com as "cordas mágicas".
Se eu fosse iniciar um novo projeto, não tenho certeza se usaria um ORM ou não. Eu provavelmente faria, mas não posso dizer com certeza que você deveria. Eu diria que é a diferença entre escolher C ++ ou Java / .NET para o seu projeto: você precisará da flexibilidade que obtém ao trabalhar em um nível mais baixo ou prefere trabalhar em um nível mais alto e (supostamente) ser mais produtivo? A resposta normal é trabalhar no nível mais alto possível . Isso geralmente significa usar um ORM.
fonte
A força de um ORM é que ele permite modelar o comportamento do aplicativo usando técnicas orientadas a objetos. Em um mundo cuidadosamente projetado, você tem uma camada do aplicativo em que o idioma da empresa atende perfeitamente ao idioma da equipe de desenvolvimento. O ORM é um facilitador disso, se o ORM for usado com sensatez.
O ponto fraco é que o número de pessoas que realmente recebem realmente programação orientada a objetos é bem pequeno. Muitas pessoas escrevem espaguete e almôndegas, com objetos altamente acoplados que têm pouco comportamento próprio e o comportamento realmente acaba nas hediondas classes "Serviço" e "Gerente" de 8000 linhas, e esse código geralmente é tão complicado que todo mundo tem medo de alterá-lo porque eles não conseguem descobrir quais serão os efeitos colaterais.
Além disso, muitas pessoas realmente não entendem o modelo relacional. Um ORM não os ajudará a obtê-lo e não os ajudará abstraindo o modelo relacional. Ele apenas permite que você se concentre na camada do domínio logo no início e corrija isso antes de começar a se preocupar demais com o design do banco de dados. Se bem aplicado, com a ajuda de ferramentas de migração de esquema sensatas, o ORM pode ajudar a impedir que a dívida de código se acumule.
Criei aplicativos nos quais um ORM mantinha o código do aplicativo simples, legível e testável e tinha um desempenho razoável. Também mantive aplicativos em que o padrão foi mal utilizado e o código foi complicado, não testável, lento e frágil; Acontece que o próprio ORM tinha pouco a ver com isso, exceto que, em vez de escrever código ruim que modelou mal o domínio do aplicativo, a equipe de engenharia herdada escreveu código ruim que modelou mal o domínio do aplicativo E código ruim da camada de serviço que negligenciou todos o valor que seu ORM poderia fornecer a eles.
As ORMs não o tornarão mais inteligente, mas nas mãos do desenvolvedor certo, podem levar a um código mais sustentável e de maior qualidade.
fonte
Talvez a resposta esteja no inverso da sua pergunta: está armazenando seus dados de aplicativos em algo diferente do que um banco de dados relacional uma boa idéia? Quais problemas você está eliminando e quais outros problemas você encontrará? Você pode viver sem a capacidade de cruzar facilmente seus dados (junções) ou filtrar rapidamente os registros que deseja com base em vários critérios? Você não precisa de suporte sólido a transações (supondo que sua alternativa não o possua)? Nem todos os aplicativos precisam de um armazenamento de dados sempre consistente e completo.
Eu acho que o verdadeiro anti-padrão aqui pode estar usando um banco de dados relacional quando você não precisa de um. Se você precisar de um, precisará do ORM, e definitivamente não é um anti-padrão.
fonte
ORM é uma ferramenta. Como todas as ferramentas, quando usadas adequadamente, elas funcionam muito bem. Quando usado de forma inadequada, ele precisa de um martelo maior e um pouco de fita adesiva.
No caso do projeto atual em que estou trabalhando, ele será mantido por não desenvolvedores (engenheiros mecânicos, para ser mais preciso) e, portanto, precisa ser simples e fácil de descobrir. Levará vários anos até que este grupo tenha um orçamento para contratar desenvolvedores (presumindo que o próximo presidente não abole a agência envolvida), portanto as futuras capacidades de manutenção são um fator importante em nossas considerações.
fonte