Apakah menulis sendiri Layer Akses Data / Pemetaan Data adalah ide yang "baik"?

20

Kami saat ini berada dalam situasi di mana kami memiliki pilihan antara menggunakan map-relational objek-out-of-the-box atau menggulung kita sendiri

Kami memiliki aplikasi lawas (ASP.NET + SQL Server) di mana lapisan data & lapisan bisnis sayangnya dihaluskan bersama. Sistem ini tidak terlalu rumit dalam hal akses data. Itu membaca data dari grup besar (35-40) dari tabel yang saling terkait, memanipulasinya dalam memori & menyimpannya kembali ke beberapa tabel lain dalam format ringkasan. Kami sekarang memiliki kesempatan untuk melakukan beberapa refactoring dan sedang mencari kandidat teknologi untuk digunakan secara terpisah & menyusun dengan benar Akses Data kami.

Apapun teknologi yang kami putuskan, kami ingin:

  • memiliki objek POCO dalam Model Domain kami yang Ketidaktahuan
  • memiliki lapisan abstraksi untuk memungkinkan kita menguji unit objek model domain kita terhadap sumber data yang didasari mocked up

Jelas ada banyak hal di luar sana tentang hal ini dalam hal Pola & Kerangka Kerja dll.

Secara pribadi saya mendorong untuk menggunakan EF bersama dengan ADO.NET Unit Testable Repository Generator / POCO Entity Generator . Ini memenuhi semua persyaratan kami, dapat dengan mudah dimasukkan ke dalam Pola Repo / UnitOfWork dan Struktur DB kami cukup matang (telah mengalami refactor) sehingga kami tidak akan membuat perubahan harian pada model.

Namun yang lain di grup menyarankan untuk membuat / memutar DAL kita sendiri sepenuhnya dari awal. (Custom DataMappers, DataContexts, Repository, Antarmuka di mana-mana, Ketuntasan Injeksi Ketergantungan untuk membuat objek konkret, Terjemahan LINQ-ke-Underlying Query Translation, Implementasi Caching Kustom, Implementasi Custom FetchPlan ...) daftar berjalan dan terus terang mogok saya sebagai orang gila.

Beberapa argumen yang dilontarkan adalah "Yah setidaknya kita akan mengendalikan kode kita sendiri" atau "Oh saya sudah menggunakan L2S / EF dalam proyek sebelumnya dan itu tidak lain adalah sakit kepala". (Meskipun saya telah menggunakan keduanya dalam Produksi sebelum dan menemukan masalah sedikit dan jauh di antara, dan sangat mudah dikelola)

Jadi, apakah ada arsitek / arsitek berpengalaman Anda di luar sana yang memiliki kata-kata bijak yang dapat membantu saya menjauhkan produk ini dari apa yang bagi saya sepertinya akan menjadi bencana total. Saya tidak dapat membantu tetapi berpikir bahwa manfaat apa pun yang diperoleh dengan menghindari masalah EF, akan hilang dengan cepat dengan mencoba menemukan kembali kemudi.

Eoin Campbell
sumber
4
Ada beberapa yang baik (lebih baik, jika Anda bertanya kepada saya, tetapi saya tidak akan memulai perang suci itu ... oh tunggu) alternatif untuk EF, di mana Anda akan dapat "mengendalikan kode", seperti NHibernate.
Brook
@ Brook Bagaimana cara menjawab pertanyaan Apakah menulis sendiri Akses Data / Lapisan Pemetaan Data Anda merupakan ide "baik"?
MickyD

Jawaban:

22

Kedua argumen terhadap ORM yang ada tidak valid:

"Yah, setidaknya kita akan mengendalikan kode kita sendiri"

Mengapa tidak menulis bahasa Anda sendiri? Kerangka kerja Anda sendiri? Sistem operasi Anda sendiri? Dan untuk memastikan Anda mengendalikan segalanya, itu juga ide yang baik untuk membuat perangkat keras Anda sendiri.

"Oh, aku sudah menggunakan L2S / EF di proyek sebelumnya dan itu hanya sakit kepala"

EF cukup matang dan digunakan dengan sukses oleh banyak orang. Ini berarti bahwa seseorang yang mengklaim bahwa EF tidak lain adalah sakit kepala mungkin harus mulai belajar bagaimana menggunakan EF dengan benar.


Jadi, apakah Anda harus menulis ORM sendiri?

Saya tidak akan menyarankan itu. Sudah ada ORM tingkat profesional, yang berarti Anda harus menulis sendiri hanya jika:

  • Anda memiliki konteks yang tepat di mana semua ORM yang ada tidak dapat masuk karena suatu alasan,
  • Anda yakin bahwa biaya untuk membuat dan menggunakan ORM Anda sendiri alih-alih mempelajari yang sudah ada jauh lebih rendah. Ini termasuk biaya dukungan di masa depan, termasuk oleh tim pengembang lain yang harus membaca ratusan halaman dokumentasi teknis Anda untuk memahami cara bekerja dengan ORM Anda.

Tentu saja, tidak ada yang melarang Anda untuk menulis ORM Anda sendiri hanya karena penasaran, untuk mempelajari sesuatu. Tetapi Anda tidak harus melakukannya pada proyek komersial.


Lihat juga poin 2 sampai 3 dari jawaban saya untuk pertanyaan Reinventing the wheel dan TIDAK menyesalinya. Anda dapat melihat bahwa berbagai alasan untuk menciptakan kembali roda tidak berlaku di sini.

Arseni Mourzenko
sumber
10
1. Menguasai bagian-bagian penting sistem bisnis seringkali merupakan ide yang bagus. Kadang-kadang mungkin melibatkan menulis kerangka kerja Anda sendiri daripada menggunakan perpustakaan yang didirikan dan populer. 2. Kadang-kadang alat yang populer kelebihan jual atau overhyped.
quant_dev
3
@quant_dev: jika Anda menulis perangkat lunak yang akan mengendalikan pembangkit nuklir atau pesawat ruang angkasa, Anda benar. Tetapi saya ragu bahwa inilah masalahnya. BTW, saya tidak yakin apakah kita dapat menyebut EF sebagai "perpustakaan yang mapan dan populer".
Arseni Mourzenko
3
Ada perpustakaan Open Source yang terkenal untuk penetapan harga derivatif yang disebut Quantlib. Tetapi setiap bank yang saya kenal menulis perpustakaan harga mereka sendiri, karena ini adalah inti dari bisnis mereka. Tidak harus menjadi pesawat ruang angkasa ...
quant_dev
2
Juga lebih mudah untuk merekrut karyawan baru yang memiliki pengalaman dalam kerangka kerja standar yang Anda gunakan daripada harus melatih setiap orang yang Anda sewa tentang cara menggunakan Kerangka Kerja.
HLGEM
2
Mengapa tidak menulis bahasa Anda sendiri? Kerangka kerja Anda sendiri? Sistem operasi Anda sendiri? Dan untuk memastikan Anda mengendalikan segalanya, itu juga ide yang baik untuk membuat perangkat keras Anda sendiri. Itulah yang dikatakan Apple :-)
Konamiman
19

Gunakan Kerangka Entitas untuk semua hal CRUD biasa (80 hingga 95 persen dari kode), dan gunakan kode akses data khusus untuk kode tersisa yang perlu dioptimalkan. Ini harus memuaskan kekhawatiran mereka yang berpendapat bahwa Anda tidak memiliki cukup kendali.

Robert Harvey
sumber
sorakan untuk itu. Ya di situlah saya mencoba untuk mendorongnya.
Eoin Campbell
Terutama karena EF adalah teknologinya M $ bergerak ke. Dan LINQ membuat kehidupan dev jauh lebih mudah.
SoylentGray
Itu cukup banyak jalan StackOverflow turun, berhasil, bukan? Linq-To-SQL untuk semua hal biasa, dan hal-hal khusus yang berubah menjadi perpustakaan Dapper untuk bit yang membutuhkannya.
Carson63000
5

Adalah ide yang baik jika dan hanya jika Anda dapat (setidaknya cukup) yakin bahwa Anda akan menghemat setidaknya banyak waktu / usaha dengan menulis kode Anda sendiri seperti yang diperlukan untuk menghasilkan kode itu di tempat pertama. Bergantung pada situasinya, melakukannya juga dapat memengaruhi jadwal Anda, dan Anda harus memperhitungkannya juga. Anda juga harus memasukkan faktor perawatan jangka panjang ke dalam persamaan. Jika Anda memutar ORM Anda sendiri, Anda harus mempertahankannya selamanya (atau setidaknya selama Anda menggunakannya).

Intinya adalah bahwa hal itu dapat masuk akal, di bawah hanya kondisi yang tepat. Kondisi-kondisi ini umumnya meliputi:

  1. Proyek yang Anda kerjakan cukup besar, sehingga biayanya diamortisasi karena penggunaan yang besar.
  2. Penggunaan data Anda cukup tidak biasa sehingga perpustakaan yang ada (dan semacamnya) bekerja sangat buruk untuk tujuan Anda.

Dengan risiko menyatakan yang sudah jelas, kedua hal ini berhubungan terbalik - jika Anda bekerja pada proyek yang benar-benar raksasa, maka bahkan penghematan kecil pada setiap penggunaan individu dapat menambah hingga cukup untuk membenarkan pengembangan. Sebaliknya, jika kebutuhan Anda benar - benar tidak biasa, sehingga Anda memperoleh banyak dalam setiap penggunaan, pekerjaan itu dapat dibenarkan bahkan pada proyek yang cukup kecil.

Paling tidak berdasarkan deskripsi Anda, bagaimanapun, tidak ada yang benar-benar berlaku dalam kasus Anda. Mungkin satu (atau bahkan keduanya) berlaku untuk penggunaan EF rekan kerja Anda sebelumnya, atau mungkin dia hanya berprasangka - saya tidak berpikir Anda telah memberi kami informasi yang cukup untuk menebak yang mana (meskipun secara adil, saya harus menambahkan bahwa saya ' Kurasa itu karena dia belum memberitahumu cukup untuk menebak).

Jika saya bertanggung jawab atas situasi ini, saya pikir saya akan membuat Anda dan rekan kerja Anda masing-masing menulis jenis kertas posisi - daftar kekuatan dan kelemahan yang Anda lihat dengan setiap pendekatan, bersama dengan bukti nyata untuk mendukung setiap pernyataan / klaim /terserah. Seluruh tim kemudian akan (yaitu, diminta untuk) mengkritik setiap makalah. Poin utama dalam kritik mereka adalah menilai setiap poin dalam dua skala:

  1. sejauh mana poin tersebut tampak akurat, didukung oleh fakta, dll., dan
  2. sejauh mana titik tersebut tampaknya berlaku untuk proyek yang sedang dikerjakan.

Lalu saya akan mengevaluasi kertas dan kritik untuk membuat keputusan (meskipun sepenuhnya jujur, mungkin sulit untuk mengatakan berapa banyak saya menggunakan mereka untuk membuat keputusan, dan seberapa banyak saya menggunakan mereka untuk membenarkan keputusan Saya sudah membuat - saya tahu saya mungkin tidak harus mengakui itu, tetapi kenyataannya adalah bahwa saya juga manusia ...)

Edit:

Jika saya ingin menjadi sangat jahat (atau "mendidik" - sulit untuk membedakan perbedaan dalam kasus ini) saya akan meminta Anda masing-masing untuk mengembangkan estimasi dari keseluruhan upaya pengembangan baik menggunakan ORM / DAL yang ada, dan mengembangkan milikmu. Meskipun ini hanya tebakan, tebakan langsung saya adalah bahwa sebagian besar orang dengan rencana besar untuk menggulirkannya sendiri tidak akan repot-repot menyerahkan perkiraan mereka - pada saat mereka datang dengan perkiraan upaya keseluruhan yang bahkan sudah selesai (dan realistis), mereka akan menyadari bahwa tidak mungkin mereka dapat bersaing dengan menggunakan kode yang ada. Pada saat yang sama, itu

Sunting 2: (semacam saran dari @ CmdKey): Meskipun tidak disebutkan secara eksplisit, saya berasumsi bahwa perkiraan secara implisit akan mencakup penilaian risiko. Secara khusus, perkiraan waktu biasanya harus menyertakan nomor gaya PERT:

  1. Perkiraan terbaik dari tercepat itu bisa dilakukan jika semuanya berjalan dengan baik.
  2. Perkiraan "normal" - berapa lama Anda mengharapkannya.
  3. Perkiraan kasus terburuk dari terlama yang bisa dilakukan jika semuanya berjalan salah.

Tentu saja, perkiraan terbaik dan terburuk tidak seharusnya mencakup hal-hal seperti campur tangan ilahi langsung, tetapi harus mencakup apa pun yang kurang dari itu.

Jerry Coffin
sumber
Terima kasih untuk itu Jerry. (jawaban ini perlu lebih banyak upvotes :-))
Eoin Campbell
@ Jerry poin yang sangat baik tentang biaya, pada akhirnya manajemen yang peduli, namun Anda perlu memasukkan ukuran risiko dalam permintaan "pendidikan" Anda. Kegagalan untuk menghargai risiko yang dilibatkan dalam suatu proyek biasanya membuat proyek penawaran terendah lebih mahal daripada opsi lain.
CdMnky
@ CDMnky: Poin bagus. Mengedit dengan tepat.
Jerry Coffin
3

Biasanya tidak pernah merupakan ide yang baik untuk menemukan kembali roda, dan melakukannya biasanya merupakan indikasi ketidaktahuan teknis ("Saya tidak tahu apa-apa lagi, dan tidak ingin belajar") atau kesombongan ("X itu bodoh, saya bisa tulis alat saya sendiri dalam dua minggu! "); Ada alat yang matang yang dapat melakukan banyak hal lebih baik daripada yang bisa diretas bersama oleh beberapa pengembang rata-rata dalam beberapa minggu.

Namun demikian, ada saat-saat di mana Anda tidak dapat secara andal memasukkan aplikasi warisan di sekitar solusi yang ada (tidak peduli seberapa fleksibelnya) tanpa satu ton pekerjaan; dalam kasus seperti ini, itu bukan ide "baik", tetapi ide yang lebih baik daripada alternatif (yaitu membiarkannya apa adanya, atau menulis ulang setengahnya agar dapat menggunakan lapisan pihak ketiga) sehingga Anda memiliki banyak pilihan.

Wayne Molina
sumber
3

Saya sedang mengerjakan proyek yang menolak alat Java ORM yang ada untuk menulis sendiri, karena beberapa fitur "kritis" yang tidak ada di Hibernate. Ini adalah kesalahan jutaan dolar, dan biayanya meningkat setiap hari. Mereka masih belum memiliki dukungan penuh untuk hubungan objek. Jadi selain semua waktu yang dihabiskan untuk membuat dan memelihara kerangka kerja, mereka menghabiskan berjam-jam menulis kode yang dapat ditulis dalam hitungan menit menggunakan Hibernate, atau dalam banyak kasus tidak perlu ditulis sama sekali.

Kerangka kerja yang ada adalah produk dari upaya puluhan tahun manusia. Sangat naif membayangkan bahwa satu tim bisa mendekati mana saja dalam beberapa minggu ke depan.

kevin cline
sumber
1

Kode yang harus Anda tulis adalah kode yang harus Anda pertahankan. Waktu yang dihabiskan untuk mempertahankan kode ORM adalah waktu yang dihabiskan untuk tidak memelihara aplikasi. Kecuali jika ORM memberi Anda semacam keuntungan strategis, maka itu bukan sesuatu yang akan menghasilkan uang untuk bisnis, jadi itu murni overhead. Apakah perusahaan Anda lebih suka menghabiskan uang untuk overhead atau meningkatkan produk penghasil uang? Jika ini untuk aplikasi internal maka ini mungkin bukan masalah, tetapi Anda masih meningkatkan jumlah kode yang perlu ditulis, diuji, dan didokumentasikan.

TMN
sumber
0

Saya akan mengatakan meluncurkan ORM Anda sendiri adalah ide yang BURUK - kecuali Anda memiliki alasan yang sangat, sangat tuhan untuk melakukannya (btw. Yang Anda kutip tidak cukup baik :)

Saya melakukan kesalahan ketika meminta orang lain meyakinkan saya untuk tidak menggunakan ORM dan saya dapat memberitahu Anda bahwa menulis semua DAL sendiri benar-benar memperlambat kami dan alih-alih menerapkan fitur yang penting bagi bisnis kami menghabiskan waktu di DAL (itu jauh lebih banyak pekerjaan dari tampilannya).

Sem semut EF baru cukup bagus, tetapi jika Anda ingin lebih banyak kontrol - Saya akan mengambil mikro ORM seperti: Drapper http://code.google.com/p/dapper-dot-net/ atau PetaPOCO http : //www.toptensoftware.com/petapoco/

Anda juga dapat mencampur dan mencocokkan - menggunakan EF untuk sebagian besar barang dan Drapper untuk beberapa penyempurnaan.

Pokoknya itu hanya 2c saya;)

orang Slavia
sumber