Apakah ORM Anti-Pola? [Tutup]

58

Saya melakukan diskusi yang sangat menggairahkan dan interessting dengan seorang rekan tentang ORM dan pro dan kontra. Menurut pendapat saya, ORM hanya berguna dalam kasus yang paling langka. Setidaknya dalam pengalaman saya.

Tetapi saya tidak ingin membuat daftar argumen saya sendiri saat ini. Jadi saya bertanya, apa pendapat Anda tentang ORM? Apa kelebihan dan kekurangannya?

derphil
sumber
3
Sudahkah Anda membaca ini: seldo.com/weblog/2011/08/11/orm_is_an_antipattern ?
FrustratedWithFormsDesigner
2
Iya. Kecuali Anda memiliki aplikasi CRUD generik yang tidak melakukan apa pun yang bernilai dengan database dalam hal ini Anda tidak boleh menggunakan database relasional.
Raynos
1
@ Derphil: Anda mungkin ingin membuatnya kurang luas, kalau tidak ini akan ditutup. Jika Anda percaya itu anti-pola, mungkin nyatakan mengapa dan kemudian tanyakan dalam situasi apa anti-pola ini sesuai (tapi itu mungkin masih terlalu luas).
FrustratedWithFormsDesigner
2
@ Derphil, ada banyak tandingan di komentar ke posting blog itu, sudahkah Anda membacanya?
Péter Török
2
Dan hanya bukti lain tentang mengapa Anda tidak memerlukan ORM: medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Jawaban:

83

Ada a adalah serangkaian kesulitan konseptual dan teknis yang cukup besar dan beragam ketika mencoba mendekati database relasional dari sudut berorientasi objek. Kesulitan-kesulitan ini secara kolektif dikenal sebagai ketidakcocokan impedansi objek-relasional dan artikel Wikipedia terkait sangat informatif. Artikel mengidentifikasi beberapa, saya tidak melihat cara yang masuk akal untuk menggambarkannya di sini. Hanya untuk memberi Anda ide umum, mereka dikatalogkan sebagai:

  • Ketidakcocokan
    • Konsep berorientasi objek
    • Perbedaan tipe data
    • Perbedaan struktural dan integritas
    • Perbedaan manipulatif
    • Perbedaan transaksional
  • Memecahkan ketidakcocokan impedansi
    • Minimalisasi
    • Arsitektur alternatif
    • Kompensasi
  • Pendapat
  • Perbedaan filosofis

Saya pikir jika Anda meluangkan waktu untuk membaca artikel Anda akan memahami bahwa fakta bahwa ORM kadang-kadang digambarkan sebagai anti-pola sebenarnya tidak bisa dihindari. Kedua domain tersebut sangat berbeda sehingga pendekatan apa pun untuk memperlakukan satu sebagai yang lainnya secara default adalah anti-pola, dalam arti bahwa anti-pola adalah pola yang bertentangan dengan filosofi domain.

Tapi saya tidak berpikir istilah itu harus berlaku untuk apa pun yang pada dasarnya bertindak sebagai jembatan antara dua domain yang sangat berbeda. Memberi label suatu pola sebagai anti-pola hanya masuk akal di dalam domainnya. Jadi pertanyaan apakah itu anti-pola atau tidak tidak relevan.

Tetapi apakah ini berguna? Ya ORM adalah salah satu anti-pola yang paling berguna di luar sana. Anda akan mengerti mengapa hanya jika Anda menemukan diri Anda dalam situasi praktis di mana Anda harus bertukar basis data dalam suatu proyek. Atau bahkan meningkatkan ke versi lain dari database yang sama. ORM adalah salah satu dari hal-hal itu, yang hanya Anda pahami sepenuhnya saat Anda benar-benar membutuhkannya.

Tentu saja, karena semuanya bermanfaat, ORM sangat rentan terhadap penyalahgunaan. Jika Anda berpikir itu menggantikan kebutuhan untuk mengetahui segala sesuatu tentang database yang Anda kerjakan, maka itu akan kembali dan menggigit Anda. Keras.

Akhirnya, izinkan saya tanpa malu menyambungkan satu lagi jawaban saya , pada yang terkait "Apakah pola ActiveRecord mengikuti / mendorong prinsip-prinsip desain SOLID?" pertanyaan, yang bagi saya adalah pertanyaan yang jauh lebih relevan daripada "apakah itu anti-pola".

yannis
sumber
5
+1 untuk bekerja dalam frasa "ketidakcocokan impedansi". Buzzwords untuk Geeks, tapi saya juga menyukainya!
hardmath
Sepenuhnya setuju ... periksa tautan ini dengan sangat baik dijelaskan: seldo.com/weblog/2011/08/11/orm_is_an_antipattern
sandino
42

Ini mirip dengan bertanya "apakah bor kekuatan merupakan anti-pola?". ORM mendapatkan tempat yang baik di kotak alat saya, mengurangi kode boilerplate saya dan saya masih dapat menggunakan SQL kustom jika perlu. Jadi jika itu anti-pola, pola mana yang dilawannya?

Jawaban saya adalah tidak, ada banyak ORM dewasa di luar sana yang membuat hidup Anda jauh lebih mudah dan membuat kode Anda lebih mudah dimengerti. Ini berarti Anda tidak perlu memahami SQL, justru sebaliknya.

Otávio Décio
sumber
11
+1 Saya juga berpikir itu sangat berguna, ada kurva belajar. Tapi itu sangat menyenangkan tidak harus mengisi pojo secara manual, dll.
NimChimpsky
18

Saya akan benci untuk menyebut sesuatu sebagai "anti-pola" yang pertama kali disebut pola oleh Martin Fowler dan sejak itu telah dianut di hampir setiap bahasa pemrograman modern. (Lihat artikel Wikipedia di ActiveRecord .)

ORM yang baik dapat menyebabkan kode jauh lebih sedikit (dan jauh lebih sedikit pengulangan) dalam suatu proyek, dan tidak ada yang sangat berkorelasi dengan bug seperti jumlah kode asli.

ORM umumnya dirancang untuk menangani kasus penggunaan yang paling umum untuk bekerja dengan database. Pertanyaan kompleks mungkin masih perlu ditulis secara eksplisit. Tapi saya akan sangat tidak suka menulis pertanyaan eksplisit untuk setiap interaksi basis data. Dalam kebanyakan kasus, itu buang-buang waktu.

Nathan Long
sumber
12
"Saya akan ragu untuk menentang argumen oleh otoritas"
Raynos
3
@ Raynos: Maksud Anda ... maksud Anda ... Fowler mungkin .... SALAH?!?! kaget & kaget bid'ah! Penghujatan !! : P;)
FrustratedWithFormsDesigner
9
@ Raynos - Mungkin otoritas bukan argumen terbaik, tetapi OP mengatakan "dalam pengalaman saya". Ini pada dasarnya adalah seruan kepada otoritas pribadi, jadi saya pikir masuk akal untuk melawan dengan seruan kepada otoritas dan konsensus. Selain itu, istilah "anti-pola" itu sendiri tentang pendapat. Saya telah memberikan contoh apa yang dipikirkan orang lain.
Nathan Long
3
@ NathanLong Saya baru saja menunjukkan bahwa popularitas dan ketepatan adalah ortogonal.
Raynos
1
FWIW Data Mapper mungkin merupakan pola yang paling dekat memetakan ke ORM. ActiveRecord adalah pola yang berbeda, meskipun pasti terkait.
JasonTrue
11

Menggunakan ORM alih-alih belajar SQL adalah ide yang sangat buruk. Jika Anda tidak tahu persis jenis SQL yang dihasilkan, jika Anda tidak memahami masalah N + 1 dan bagaimana mengoptimalkannya, maka itu pasti akan menyebabkan lebih banyak kerugian daripada kebaikan. Namun saya merasa bahwa saya jauh lebih produktif menggunakan ORM. Saya lebih suka Rails ActiveRecord, yang tidak mencoba untuk berpura-pura bahwa tidak ada database dan tidak menghalangi Anda jika Anda hanya perlu menulis SQL. Namun saya khawatir beberapa orang mungkin mempercayai idiom yang mereka lihat terlalu dalam, tanpa pemahaman mendalam tentang apa yang mereka lakukan.

Jeremy
sumber
11

Pengalaman saya: Saya menggunakan NHibernate dengan Linq2NHibernate.

Pro:

  • Itu menghilangkan "Magic Strings", atau setidaknya menawarkan tempat sekali dan hanya sekali untuk menempatkan mereka
  • Ini memungkinkan saya untuk bekerja dalam paradigma OO sepanjang waktu
  • Kode lebih mudah dibaca
  • Kode yang dibangun di atas lebih mudah untuk diubah
  • Ini memungkinkan Anda untuk menukar basis data relasional Anda yang sebenarnya tanpa memelihara 2 repositori terpisah (jarang dilakukan, tetapi itu satu manfaat besar jika Anda membutuhkannya).

Cons:

  • Kode lebih sulit untuk ditulis , karena
  • Ini bukan abstraksi yang memadai - Anda masih harus akrab dengan apa yang dilakukannya di latar belakang

Saya akan mengatakan bahwa itu tidak memenuhi janji yang kebanyakan orang harapkan pada awalnya. Saya tidak akan menyalahkan seseorang karena mengatakan itu anti-pola. Saya menemukan, dalam kasus saya, bahwa saya masih perlu melakukan tes integrasi terhadap database SQLite untuk memastikan bahwa permintaan Linq2NHibernate saya benar-benar berfungsi. Jadi sungguh, jika Anda melakukan tes integrasi terhadap database relasional nyata, maka hal semacam itu menghilangkan masalah dengan "string ajaib".

Jika saya memulai proyek baru, saya tidak yakin apakah saya akan menggunakan ORM atau tidak. Saya mungkin akan, tetapi saya tidak bisa mengatakan pasti Anda harus. Saya akan mengatakan itu seperti perbedaan antara memilih C ++ atau Java / .NET untuk proyek Anda: apakah Anda akan memerlukan fleksibilitas yang Anda dapatkan dengan bekerja di level yang lebih rendah, atau apakah Anda lebih suka bekerja di level yang lebih tinggi dan (seharusnya) lebih produktif? Jawaban normal adalah bekerja pada level setinggi yang Anda bisa lakukan . Itu biasanya berarti menggunakan ORM.

Scott Whitlock
sumber
6

Kekuatan ORM adalah memungkinkan Anda untuk memodelkan perilaku aplikasi menggunakan teknik berorientasi objek. Di dunia yang direkayasa dengan cermat, Anda memiliki satu lapisan aplikasi di mana bahasa bisnis dengan rapi memenuhi bahasa tim pengembangan. ORM adalah enabler dari itu, jika ORM digunakan secara masuk akal.

Kelemahannya adalah bahwa jumlah orang yang benar-benar benar-benar mendapatkan pemrograman berorientasi objek cukup kecil. Banyak orang menulis spaghetti dan bakso, dengan benda-benda yang sangat berpasangan yang memiliki sedikit perilaku sendiri dan perilaku yang sebenarnya berakhir di kelas "Layanan" dan "Manajer" 8000 yang mengerikan, dan kode itu sering kali berbelit-belit sehingga semua orang takut mengubahnya karena mereka tidak tahu apa efek sampingnya.

Selain itu, banyak orang tidak benar-benar mendapatkan model relasional. ORM tidak akan membantu mereka mendapatkannya, dan itu tidak akan membantu mereka dengan mencabut model relasional. Ini hanya memungkinkan Anda untuk fokus pada lapisan domain Anda sejak dini dan melakukannya tepat sebelum Anda mulai terlalu peduli tentang desain database. Jika diterapkan dengan baik, dengan bantuan alat migrasi skema yang masuk akal, dan ORM dapat membantu Anda mencegah bertambahnya utang kode.

Saya telah membangun aplikasi di mana ORM membuat kode aplikasi sederhana, dapat dibaca, dan dapat diuji, dan memiliki kinerja yang wajar. Saya juga memelihara aplikasi di mana polanya disalahgunakan dan kodenya berbelit-belit, tidak bisa dites, lambat, dan rapuh; ternyata ORM itu sendiri tidak ada hubungannya dengan hal ini, kecuali bahwa alih-alih menulis kode buruk yang memodelkan domain aplikasi dengan buruk, tim insinyur lama menulis kode buruk yang memodelkan domain aplikasi dengan buruk dan kode lapisan layanan buruk yang mengabaikan semua nilai yang ORM mereka bisa berikan kepada mereka.

ORM tidak akan membuat Anda lebih pintar, tetapi di tangan pengembang yang tepat, dapat menghasilkan kode yang lebih mudah dikelola dan berkualitas lebih tinggi.

Jason True
sumber
Saya pikir ini membingungkan menggunakan ORM sebagai pola untuk akses DB dan ORM sebagai generator kode mewah untuk membuat akses DB lebih mudah dan lebih baik.
gbjbaanb
Saya tidak yakin apa yang Anda maksud dengan itu. Komentar Anda tidak masuk akal bagi saya.
JasonTrue
Dalam hal ORM membuat cara yang bagus untuk mengakses DB dengan banyak kerja keras yang dilakukan untuk Anda, tetapi jika Anda menggunakannya sebagai pola desain untuk berpura-pura DB adalah kumpulan objek, itu mulai runtuh. Itulah yang saya pikir Anda katakan.
gbjbaanb
Saya tidak berpikir saya pernah menganjurkan menggunakan ORM untuk berpura-pura bahwa Anda punya toko objek magis yang tidak mengharuskan Anda untuk memahami cara kerja database. Saya mengatakan sebaliknya: Jika Anda memahami pemrograman berorientasi objek dengan baik DAN bagaimana database bekerja, ORM dapat membantu Anda menghasilkan kode yang lebih dapat dikelola.
JasonTrue
5

Mungkin jawabannya terletak pada kebalikan dari pertanyaan Anda: Apakah menyimpan data aplikasi Anda dalam sesuatu yang lain dari database relasional ide yang baik? Masalah apa yang Anda hilangkan, dan masalah apa yang akan Anda temukan? Bisakah Anda hidup tanpa kemampuan untuk dengan mudah mereferensikan data Anda (bergabung) atau dengan cepat menyaring catatan yang Anda inginkan berdasarkan beberapa kriteria? Apakah Anda tidak memerlukan dukungan transaksi yang solid (dengan asumsi alternatif Anda tidak memilikinya)? Tidak semua aplikasi membutuhkan penyimpanan data yang selalu konsisten dan lengkap.

Saya pikir anti-pola nyata di sini mungkin menggunakan DB relasional ketika Anda tidak membutuhkannya. Jika Anda membutuhkannya, maka Anda membutuhkan ORM, dan itu jelas bukan anti-pola.

TMN
sumber
1
SAAT saya setuju bahwa menggunakan basis data relasional jika Anda tidak membutuhkannya adalah ide yang buruk, sampai hari ini jika Anda menggunakan basis data, Anda membutuhkan ORM yang menggelikan!
HLGEM
1
Um, lalu bagaimana Anda akan mendapatkan data Anda masuk dan keluar dari database? Di suatu tempat, sesuatu harus memetakan objek Anda ke struktur relasional, dan membuat ulang ketika mereka dibaca dari database. Bahkan jika Anda menulis pertanyaan dan menyalin data ke dalam dan keluar dari set hasil, Anda sedang melakukan ORM.
TMN
1
Menggunakan procs yang disimpan (satu-satunya cara yang dapat diterima untuk memasukkan segala jenis data keuangan untuk alasan pengendalian internal) untuk melakukan semua manipulasi basis data bukanlah ORM dalam pikiran saya. Saya belum pernah melihat nilai ORM untuk seseorang yang sebenarnya tahu SQL dengan baik. Saya juga tidak pernah bekerja pada sistem (dan saya bekerja dengan aplikasi Enterprise yang sangat kompleks) yang sangat tergantung pada ORM, mereka tidak cukup baik ketika apa yang Anda lakukan kompleks.
HLGEM
6
@HLGEM: Dan bagaimana dengan data yang Anda dapatkan dari database? Saat Anda query database relasional, apakah Anda tidak memetakan hasilnya ke objek? Dalam pengalaman saya, ada dua jenis proyek yang menggunakan database relasional: yang menggunakan ORM pihak ketiga, dan yang termasuk ORM mereka sendiri yang dibangun dengan buruk.
Carson63000
2
+1 Carson. Anda menggunakan beberapa jenis ORM apa pun kecuali Anda hanya mengembalikan DataSets mentah dan memplesternya di atas kode Anda (pelanggaran paling mengerikan dari semua IMHO) karena Anda akan selalu harus memetakan hasil dari prosedur yang tersimpan ke kelas, yang persis seperti apa ORM lakukan untuk Anda.
Wayne Molina
4

ORM adalah alat. Seperti semua alat, ketika digunakan dengan tepat, mereka bekerja dengan sangat baik. Ketika digunakan secara tidak tepat, perlu palu yang lebih besar dan beberapa lakban.

Dalam kasus proyek saat ini yang sedang saya kerjakan, itu akan dikelola oleh non-pengembang (insinyur mesin, tepatnya) dan jadi itu harus sederhana dan mudah diketahui. Butuh beberapa tahun sebelum grup ini memiliki anggaran untuk merekrut pengembang (menganggap Presiden berikutnya tidak menghapus agen yang terlibat), sehingga kemampuan pemeliharaan di masa depan merupakan faktor utama dalam pertimbangan kami.

Tangurena
sumber