ORM é um antipadrão? [fechadas]

58

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?

derphil
fonte
3
Você já leu isso: seldo.com/weblog/2011/08/11/orm_is_an_antipattern ?
FrustratedWithFormsDesigner
2
Sim. A menos que você tenha um aplicativo CRUD genérico que não faça nada de valor com o banco de dados, nesse caso, você não deve usar um banco de dados relacional.
Raynos
11
@derphil: convém torná-lo menos amplo, caso contrário, isso será fechado. Se você acredita que é um antipadrão, talvez indique o motivo e pergunte em que situações esse antipadrão é apropriado (mas ainda pode ser muito amplo).
FrustratedWithFormsDesigner
2
@derphil, existem muitos argumentos contrários nos comentários dessa publicação no blog, você os leu?
Péter Török
2
E apenas mais uma evidência de por que você não precisa de um ORM: medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Respostas:

83

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:

  • Incompatibilidades
    • Conceitos orientados a objetos
    • Diferenças de tipo de dados
    • Diferenças estruturais e de integridade
    • Diferenças manipulativas
    • Diferenças transacionais
  • Resolução de incompatibilidade de impedância
    • Minimização
    • Arquiteturas alternativas
    • Compensação
  • Contenção
  • Diferenças filosóficas

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".

yannis
fonte
5
+1 por trabalhar na frase "incompatibilidade de impedância". Chavões para geeks, mas eu também gosto deles!
hardmath
Concordo totalmente ... confira este link é tão bom explicou: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino
42

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.

Otávio Décio
fonte
11
+1 Eu também acho muito útil, há uma curva de aprendizado. Mas é muito bom não ter que preencher manualmente pojos etc.
NimChimpsky
18

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.

Nathan Long
fonte
12
"Eu hesitaria em ir contra o argumento por autoridade" #
Raynos 17/11/11
3
@ Raynos: Você quer dizer ... você está dizendo ... Fowler poderia estar .... ERRADO?!?! choque & suspiro Heresia! Blasfêmia!! : P;)
FrustratedWithFormsDesigner
9
@ Raynos - Talvez a autoridade não seja o melhor argumento, mas o OP disse "na minha experiência". Isso é essencialmente um apelo à autoridade pessoal, então acho razoável contrariar um apelo à autoridade e ao consenso. Além disso, o termo "antipadrão" é sobre opiniões. Eu dei exemplos do que as outras pessoas pensam.
Nathan Long
3
@ NathanLong Eu estava apenas apontando que a popularidade e a correção são ortogonais.
Raynos
11
O FWIW Data Mapper é provavelmente o padrão que mais se aproxima de um ORM. O ActiveRecord é um padrão diferente, embora certamente relacionado.
JasonTrue
11

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.

Jeremy
fonte
11

Minha experiência: estou usando NHibernate com Linq2NHibernate.

Prós:

  • Ele se livra de "Magic Strings", ou pelo menos oferece um lugar único e único para colocá-los
  • Isso me permite trabalhar em um paradigma OO o tempo todo
  • O código é mais fácil de ler
  • O código construído no topo é mais fácil de mudar
  • Ele permite que você troque seu banco de dados relacional real sem manter 2 repositórios separados (raramente feito, mas esse é um grande benefício se você precisar).

Contras:

  • O código é mais difícil de escrever , porque
  • Não é uma abstração suficiente - você ainda precisa estar intimamente familiarizado com o que está fazendo em segundo plano

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.

Scott Whitlock
fonte
6

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.

JasonTrue
fonte
Eu acho que isso confunde o uso de um ORM como padrão para acesso ao DB e um ORM como um gerador de código sofisticado para tornar o acesso ao DB mais fácil e melhor.
gbjbaanb 27/02
Não tenho certeza do que você quer dizer com isso. Seu comentário não faz muito sentido para mim.
JasonTrue
Nesse sentido, um ORM é uma ótima maneira de acessar um banco de dados com muito trabalho duro para você, mas se você o usar como um padrão de design para fingir que um banco de dados é uma coleção de objetos, ele começará a cair. Foi o que pensei que você estava dizendo.
gbjbaanb 27/02
Acho que nunca defendi o uso de um ORM para fingir que você tem um armazenamento de objetos mágicos que não exige que você entenda como o banco de dados funciona. Eu disse exatamente o oposto: se você entende bem a programação orientada a objetos E como os bancos de dados funcionam, um ORM pode ajudá-lo a produzir um código mais sustentável.
JasonTrue 27/02
5

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.

TMN
fonte
11
Embora eu concorde que o uso de um banco de dados relacional, se você não precisar de um, é uma péssima idéia; hoje em dia, se você usar um, precisará de um ORM é ridículo!
HLGEM #
11
Hum, então como você vai conseguir entrar e sair dos dados do banco de dados? Em algum lugar, algo terá que mapear seus objetos para a estrutura relacional e recriá-los quando forem lidos no banco de dados. Mesmo se você escrever consultas à mão e copiar os dados para dentro e fora dos conjuntos de resultados, estará executando o ORM.
TMN
11
Usar procs armazenados (a única maneira aceitável de inserir qualquer tipo de dados financeiros por razões de controle interno) para fazer toda a manipulação do banco de dados não é ORM em minha mente. Eu nunca vi nenhum valor para um ORM para alguém que realmente conhece bem o SQL. Também nunca trabalhei em um sistema (e trabalho com aplicativos corporativos muito complexos) altamente dependentes de um ORM; eles simplesmente não são bons o suficiente quando o que você faz é complexo.
HLGEM
6
@HLGEM: E os dados que você obtém do banco de dados? Ao consultar o banco de dados relacional, você não mapeia os resultados para objetos? Na minha experiência, existem dois tipos de projetos que usam bancos de dados relacionais: aqueles que usam ORMs de terceiros e aqueles que incluem seus próprios ORMs mal construídos.
Carson63000
2
+1 Carson. Você usa algum tipo de ORM, não importa o que seja, a menos que você simplesmente retorne DataSets brutos e cole sobre o seu código (a ofensa mais flagrante de todos os IMHO), pois sempre será necessário mapear os resultados desse procedimento armazenado para as classes, que é exatamente o que ORMs fazem por você.
Wayne Molina
4

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.

Tangurena
fonte