L'implementazione agnostica rimane davvero valida?

22

Ho un progetto su cui sto lavorando attualmente utilizzando Tomcat, Spring 4, Spring Security, MySQL e JPA w / Hibernate.

Ho scelto JPA dal punto di vista del fatto che si suppone che si possa fare lo swapping dell'implementazione sottostante dei provider ORM senza soluzione di continuità, o almeno meno dolorosa. Direi che questo sta mentalmente usando le specifiche sull'implementazione (JAX-RS) è il punto di vista predefinito della comunità di sviluppo Java.

Sono curioso di sapere se è davvero un compito che vale la pena fare. Sono sicuro che se avessi usato direttamente Hibernate avrei guadagnato un po 'di energia perché potrei usare le funzionalità che non fanno parte delle specifiche JPA principali.

Parte della mia preoccupazione deriva dall'idea di YAGNI. Essenzialmente sto programmando in uno stile e una moda specifici (usando JPA invece di Hibernate) in modo che ad un certo punto in futuro potrò sostituire la mia implementazione ORM. Dubito strongmente che ciò accadrà mai durante la vita del prodotto, quindi essenzialmente sto mettendo lo sforzo in qualcosa che probabilmente non ne trarrò mai i benefici.

Quali sono i tuoi pensieri? Vale la pena "programmare sull'interfaccia" quando si tratta di cose come JPA? Hai mai effettivamente scambiato un'intera implementazione ORM in un prodotto? Sei mai stato in grado di evitare completamente l'astrazione da qualcosa come JPA che perde comunque? Personalmente ho già una singola chiamata SQL nativa (per ripulire le tabelle del database), e c'è qualcosa che mi piacerebbe avere con il quale sono incorporate le specifiche JPA (i prefissi get / set ai tuoi metodi e la differenza tra MEMBER OF / IN, che solo legandomi a un'implementazione sottostante mi consentirà di evitare.

    
posta Jazzepi 20.10.2014 - 01:54
fonte

5 risposte

26

so that at some point in the future I can swap out my ORM implementation. I severely doubt that will ever happen over the life of the product, so I'm essentially putting effort into something that I'll probably never reap the benefits of

Nella mia esperienza, il progetto aziendale tipico non viene mai scambiato:

  1. database
  2. ORM
  3. Lingua

Non conosco i numeri, ma la percentuale di app a due livelli che ho visto implementare e quindi modificare una di queste cose sarebbe probabilmente inferiore al 10%. Se succede, è raro e di solito accade nei primi 2-3 mesi del progetto quando le persone sono ancora in modalità di scoperta. La maggior parte dei sistemi che conosco sono ancora in esecuzione sulle piattaforme originali 8-10 anni dopo.

Più spesso che scambiare un ORM, vuoi sapere di cosa ho visto di più? Rimozione completa dell'ORM per passare all'SQL a causa di problemi di prestazioni. Quindi non importa cosa, in quel caso, stai per riscrivere le cose.

Per quanto riguarda l'implementazione agnostica, è un mito. Davvero equivale a sminuire. Quindi il mio approccio è quello di abbracciare il livello dati. Rendilo una parte di prima classe della tua lingua e del tuo design. Fa progetti più felici e di maggior successo.

    
risposta data 20.10.2014 - 09:28
fonte
5

ne vale la pena?
Ciò dipenderebbe interamente dall'applicazione.
Se stai scrivendo un'applicazione interna per una singola azienda, dimenticala. Quel database sopravvivrà all'applicazione per anni, forse per decenni.
A meno che, naturalmente, non vi sia stato dato di capire fin dall'inizio che il database è pianificato per essere sostituito da qualcos'altro nel prossimo futuro.
Se lo stai scrivendo per la vendita ai clienti, che possono avere diversi motori di database, E i requisiti sono tali che supporterà supportare più motori di database, POI ha senso.

Per la maggior parte delle persone che scrivono applicazioni Java, è in gran parte irrilevante.

    
risposta data 20.10.2014 - 11:56
fonte
4

Dalla mia esperienza: no, non ne vale la pena in caso di JPA / Hibernate.

Is "programming to the interface" worth it when it comes to stuff like JPA?

Lo è, ma non ha nulla a che fare con JPA in particolare. Puoi fare "programmazione sulle interfacce" di Hibernate. Non si tratta di nascondere un framework sotto uno standard, si tratta di SOLID .

Have you ever actually swapped an entire ORM implementation in a product?

Sì e no. Uno dei prodotti della nostra azienda è migrato parzialmente da Hibernate a jOOQ (che non ha nulla a che fare con JPA). Non era esattamente un "tipico progetto di impresa" menzionato da @codenheim, quindi lo scambio era possibile.

Non vedo la possibilità di scambiare Hibernate con un altro ORM compatibile con JPA.

Have you ever been able to completely avoid the abstraction from something like JPA leaking anyways?

No. È impossibile perché sia JPA che Hibernate sono molto complessi. E devi affrontare comunque i problemi di performance di Hibernate e i difetti di progettazione.

    
risposta data 20.10.2014 - 10:07
fonte
3

A rischio di sembrare contrarian qui, direi che sì, ne vale la pena. E non lo è.

Il problema non è tanto nel cambiare il tuo ORM o provider di database in quanto tale. È più una questione di separazione delle preoccupazioni e di agilità.

Una volta che inizi a fare affidamento su alcuni dettagli di implementazione di una libreria, inizi a creare coinvolgimenti di problemi sempre più profondi.

Se sai che la tua implementazione ORM è Hibernate, questa conoscenza inizia a filtrare tutta l'architettura della tua applicazione. E ogni volta che arriva una nuova tecnologia che sostituisce Hibernate o JPA in modo così completo come Hibernate ha fatto a qualsiasi cosa venisse prima, si scopre che le dipendenze sono diventate molto più profonde di quanto ci si aspettasse.

È molto meglio mettere da parte l'intera preoccupazione di mantenere il tuo modello da qualche parte fuori mano, dove tutte le complessità dei rapporti con database e transazioni e quant'altro, possono essere facilmente ignorati dal resto dell'applicazione. In quel remoto angolo buio, puoi legarti in nodi su specifici dettagli di implementazione, se vuoi: non importa più.

    
risposta data 23.10.2014 - 13:03
fonte
1

Il problema con l'agnosticismo nell'implementazione è che, nel tuo tempo come sviluppatore, perderai tempo inutile.

Ho scritto diversi progetti che abbiamo sprecato un sacco di tempo scrivendo su un'interfaccia, che non sono mai stati utilizzati in alcun modo nuovo, non sono mai stati convertiti e sono stati usati "così com'è" per anni

Ho anche sprecato un carico di tempo per convertire software che nessuno avrebbe mai dovuto convertire.

L'unica osservazione reale che devo fare è che il primo è molto meno doloroso.

    
risposta data 24.10.2014 - 03:29
fonte

Leggi altre domande sui tag