Apakah implementasi agnostik tetap benar-benar layak?

22

Saya punya proyek yang saya kerjakan saat ini menggunakan Tomcat, Spring 4, Spring Security, MySQL, dan JPA w / Hibernate.

Saya memilih JPA dari sudut pandang bahwa itu seharusnya membuat swapping implementasi yang mendasari penyedia ORM mulus, atau setidaknya kurang menyakitkan. Saya akan mengatakan bahwa ini secara mental menggunakan spec atas implementasi (JAX-RS) adalah sudut pandang standar komunitas pengembangan Java.

Saya ingin tahu apakah ini benar-benar tugas yang pantas dilakukan. Saya yakin jika saya menggunakan Hibernate secara langsung, saya akan mendapatkan kekuatan karena saya bisa menggunakan fitur yang bukan bagian dari spesifikasi JPA utama.

Bagian dari kekhawatiran saya berasal dari ide YAGNI. Saya pada dasarnya pemrograman dalam gaya dan mode tertentu (menggunakan JPA, bukan Hibernate) sehingga di beberapa titik di masa depan saya bisa menukar implementasi ORM saya. Saya sangat meragukan bahwa hal itu akan pernah terjadi selama masa pakai produk, jadi pada dasarnya saya berupaya menjadi sesuatu yang mungkin tidak akan pernah saya manfaatkan.

Apa yang kamu pikirkan? Apakah "pemrograman ke antarmuka" sepadan dengan hal-hal seperti JPA? Pernahkah Anda benar-benar menukar seluruh implementasi ORM dalam suatu produk? Apakah Anda pernah dapat sepenuhnya menghindari abstraksi dari sesuatu seperti JPA bocor? Saya pribadi sudah memiliki satu panggilan SQL asli (untuk membersihkan tabel database), dan ada sesuatu yang saya ingin selesaikan dengan yang dibangun ke dalam spesifikasi JPA (dapatkan / atur awalan untuk metode Anda, dan perbedaan antara ANGGOTA DARI / IN, yang hanya mengikat diri saya pada implementasi yang mendasari akan membuat saya kesempatan untuk menghindari.

Jazzepi
sumber
Apakah Anda menguji unit? Mengganti implementasi tidak selalu berarti produk jadi.
MrDosu

Jawaban:

26

sehingga di beberapa titik di masa depan saya bisa menukar implementasi ORM saya. Saya sangat meragukan bahwa hal itu akan pernah terjadi selama masa pakai produk, jadi pada dasarnya saya berupaya menjadi sesuatu yang saya mungkin tidak akan pernah memetik manfaat dari

Dalam pengalaman saya, proyek khas perusahaan tidak pernah bertukar:

  1. Basis data
  2. ORM
  3. Bahasa

Saya tidak tahu jumlahnya, tetapi persentase aplikasi 2-tier yang telah saya lihat terapkan dan kemudian ubah salah satu dari hal-hal itu mungkin akan kurang dari 10%. Jika itu terjadi, itu jarang terjadi, dan itu biasanya terjadi dalam 2-3 bulan pertama proyek ketika orang masih dalam mode penemuan. Sebagian besar sistem yang saya tahu masih berjalan pada platform aslinya 8-10 tahun kemudian.

Lebih sering daripada mengganti ORM, apakah Anda ingin tahu apa yang lebih sering saya lihat? Menghapus ORM sepenuhnya untuk drop down ke SQL karena masalah kinerja. Jadi tidak peduli apa, dalam hal ini, Anda akan menulis ulang.

Sejauh implementasi agnostik, itu mitos. Ini benar-benar sama dengan meredup. Jadi pendekatan saya adalah merangkul lapisan data. Jadikan itu bagian kelas pertama dari bahasa dan desain Anda. Itu membuat proyek lebih bahagia, lebih sukses.

codenheim
sumber
3
Setuju sepenuhnya, ini juga merupakan dasar dari sebagian besar masalah yang saya miliki dengan Hibernate secara umum - ini mengkompromikan SQL yang dihasilkannya untuk memfasilitasi pertukaran Database. Itu juga "melakukan Access" dengan mengasumsikan bahwa itu adalah tempat terbaik untuk menyimpan cache tabel yang jarang terjadi pada IMO. Ada alasan bagi Hibernate untuk menjatuhkan modul tuning SQL yang mengubah HQL menjadi Oracle, MySQL, SQL Server dll. Mengoptimalkan SQL dan berhenti melakukan hal-hal bodoh yang dilakukan RDBMS dengan lebih baik.
Mcottle
5

Apakah itu layak?
Itu sepenuhnya tergantung pada aplikasi.
Jika Anda menulis aplikasi internal untuk satu perusahaan, lupakan saja. Database itu akan hidup lebih lama dari aplikasi selama bertahun-tahun, mungkin beberapa dekade.
Kecuali tentu saja Anda telah diberikan untuk memahami sejak awal bahwa database direncanakan akan diganti oleh sesuatu yang lain dalam waktu dekat.
Jika Anda menulisnya untuk dijual kepada pelanggan, yang mungkin memiliki mesin basis data yang berbeda, DAN persyaratannya sedemikian rupa sehingga seharusnya mendukung banyak mesin basis data, MAKA masuk akal.

Bagi sebagian besar orang yang menulis aplikasi Java, sebagian besar tidak relevan.

jwenting
sumber
+1 untuk menyebutkan aplikasi di mana dukungan untuk beberapa DBMS adalah fitur. Jika Anda menawarkan aplikasi untuk "hosting sendiri" (sesuatu yang diinginkan banyak pelanggan perusahaan), Anda mungkin memerlukan ini. Namun, Anda mungkin masih dapat tetap menggunakan satu ORM.
sleske
4

Dari pengalaman saya: tidak, itu tidak layak jika menggunakan JPA / Hibernate.

Apakah "pemrograman ke antarmuka" sepadan dengan hal-hal seperti JPA?

Memang, tetapi tidak ada hubungannya dengan JPA secara khusus. Anda dapat melakukan "pemrograman ke antarmuka" dari Hibernate. Ini bukan tentang menyembunyikan kerangka kerja di bawah standar, ini tentang SOLID .

Pernahkah Anda benar-benar menukar seluruh implementasi ORM dalam suatu produk?

Iya dan tidak. Salah satu produk perusahaan kami sebagian dimigrasi dari Hibernate ke jOOQ (yang tidak ada hubungannya dengan JPA). Itu bukan "proyek perusahaan biasa" yang disebutkan @codenheim, jadi bertukar mungkin saja.

Saya tidak melihat ada gunanya menukar Hibernate dengan ORM lain yang sesuai dengan JPA.

Apakah Anda pernah dapat sepenuhnya menghindari abstraksi dari sesuatu seperti JPA bocor?

Tidak. Tidak mungkin karena JPA dan Hibernate sangat kompleks. Dan Anda harus berurusan dengan masalah kinerja dan kekurangan desain Hibernate pula.

skrip
sumber
3

Dengan risiko terdengar pelawan di sini, saya akan mengatakan, bahwa ya, itu sepadan. Dan itu tidak benar.

Masalahnya tidak banyak dalam beralih ORM Anda atau penyedia database seperti itu. Ini lebih merupakan masalah pemisahan keprihatinan dan tetap gesit.

Setelah Anda mulai mengandalkan beberapa detail implementasi perpustakaan, Anda mulai membuat keterkaitan yang lebih dalam dan lebih dalam.

Jika Anda tahu apakah implementasi ORM Anda adalah Hibernate, pengetahuan ini mulai merambah seluruh arsitektur aplikasi Anda. Dan setiap kali ada teknologi baru yang menggantikan Hibernate atau JPA secara menyeluruh seperti yang dilakukan Hibernate terhadap apa pun yang datang sebelumnya, Anda menemukan bahwa dependensi telah menjadi jauh lebih dalam dari yang Anda harapkan.

Adalah jauh lebih baik untuk menyingkirkan seluruh kepedulian untuk mempertahankan model Anda di suatu tempat, di mana semua seluk-beluk berurusan dengan basis data dan transaksi dan yang lainnya, dapat dengan mudah diabaikan oleh sisa aplikasi. Di sudut gelap terpencil itu, Anda dapat mengikat diri Anda sendiri pada detail implementasi spesifik jika Anda mau - itu tidak terlalu penting lagi.

Roland Tepp
sumber
1

Masalah dengan implementasi agnostisisme adalah bahwa Anda, pada waktu Anda sebagai pengembang, akan membuang waktu dengan cara apa pun.

Saya telah menulis beberapa proyek yang kami buang banyak waktu menulis ke antarmuka, yang kemudian tidak pernah digunakan dengan cara baru, tidak pernah dikonversi dan hanya digunakan 'apa adanya' selama bertahun-tahun

Saya juga menyia-nyiakan banyak waktu untuk mengonversi perangkat lunak yang tak seorang pun pernah berharap perlu dikonversi.

Satu-satunya pengamatan nyata yang harus saya lakukan, adalah bahwa yang pertama jauh lebih menyakitkan.

Jon Story
sumber