DDD dengan ORM kemana perginya logika bisnis?

10

Saya telah menggunakan alat MDA (model driven architecture) di masa lalu di mana kami memodelkan melalui UML dan ini menghasilkan entitas bisnis (model domain kami) dan ORM (pemetaan dll) di antara hal-hal lainnya.

Banyak kode bisnis dan layanan yang bekerja pada domain adalah bagian dari model dan repositori kami mengembalikan entitas bisnis (jadi tidak mungkin untuk beralih ke ORM lain (bukan yang kami inginkan)).

Namun, sekarang saya memulai proyek dan saya ingin berpikir dalam hal DDD.

Sejauh ini rasanya seolah-olah saya meletakkan logika bisnis saya dalam model domain saya dan melalui repositori saya akan bekerja dengan ORM (yang pernah saya pilih). Namun, jika saya ingin terus menggunakan alat MDA untuk bagian ORM dari aplikasi, model yang dibuat di sini akan sangat anemia (yaitu tidak mengandung logika bisnis). Demikian pula jika saya menggunakan kerangka kerja Entity (.net) atau NHibernate untuk ORM saya juga akan menjadi model anemia. Saya tidak yakin di mana Anda akan meletakkan logika bisnis jika saya hanya menggunakan NHibernate.

Apakah saya benar dalam berpikir seperti ini, dengan kata lain dengan DDD semua logika bisnis dalam domain dan hanya menggunakan ORM untuk kegigihan melalui repositori?

JD01
sumber

Jawaban:

12

jadi tidak mungkin untuk beralih ke ORM lain (bukan yang kita inginkan)).

Sepertinya itu salah. Keuntungan utama dari pola repositori adalah Anda menyembunyikan logika akses data dan mudah ditukar.

Sejauh ini rasanya seolah-olah saya meletakkan logika bisnis saya dalam model domain saya dan melalui repositori saya akan bekerja dengan ORM (yang pernah saya pilih). Namun, jika saya ingin terus menggunakan alat MDA untuk bagian ORM dari aplikasi, model yang dibuat di sini akan sangat anemia (yaitu tidak mengandung logika bisnis). Demikian pula jika saya menggunakan kerangka kerja Entity (.net) atau NHibernate untuk ORM saya juga akan menjadi model anemia. Saya tidak yakin di mana Anda akan meletakkan logika bisnis jika saya hanya menggunakan NHibernate.

Model domain anemik dianggap praktik buruk oleh banyak orang, misalnya oleh Martin Fowler. Anda harus menghindari desain seperti itu karena model seperti itu mengarah pada teknik desain prosedural daripada desain berorientasi objek yang baik. Anda kemudian memiliki kelas data dan kelas manajer / pemrosesan yang berarti Anda memisahkan status dan perilaku. Tetapi suatu objek haruslah "keadaan dan perilaku".

NHibernate melakukan pekerjaan yang bagus dengan ketidaktahuan yang gigih. Anda dapat menyembunyikan detail pemetaan dalam XML atau dengan FluentNHibernate dan cukup menulis POCO biasa. Sangat mudah untuk membuat model domain yang kaya dengan NHibernate. Saya pikir Anda bisa melakukannya dengan kerangka kerja entitas dan alat MDA juga. Selama alat ini menghasilkan kelas parsial, Anda dapat memperpanjang kode yang dihasilkan dengan mudah tanpa harus khawatir bahwa generasi baru dapat merusak kode yang ditulis pengguna Anda.

Singkat cerita ini. Saat Anda menggunakan NHibernate, tidak ada, saya tidak mengulangi apa pun , menghentikan Anda untuk merangkul model domain kaya. Saya sarankan menggunakannya dengan FluentNHibernate dan pemetaan dengan tangan. Kode pemetaan hanya membutuhkan 5 hingga 10 menit untuk menulis. Saya kira hal yang sama juga berlaku untuk kerangka kerja entitas dan alat-alatnya setidaknya membuat kelas parsial yang mudah diperluas.

Apakah saya benar dalam berpikir seperti ini, dengan kata lain dengan DDD semua logika bisnis dalam domain dan hanya menggunakan ORM untuk kegigihan melalui repositori?

Sebagian besar Anda benar. Anda harus memiliki model domain yang kaya. Terutama ketika hal-hal menjadi lebih dan lebih kompleks, lebih mudah untuk mempertahankan dan memperluas ketika Anda telah mendesainnya dengan benar. Tetapi perlu diingat bahwa DDD juga tahu (Lapisan Domain dan Lapisan Aplikasi) Layanan untuk mengimplementasikan logika bisnis dan Pabrik untuk merangkum logika kreasi.

Saya juga cenderung membedakan logika bisnis menjadi logika domain dan logika bisnis aplikasi aktual. Logika domain adalah bagaimana domain berinteraksi dan berperilaku sementara logika aplikasi, yang merupakan lapisan yang sama sekali berbeda, merangkum bagaimana domain digunakan untuk kasus penggunaan / aplikasi tertentu. Sering kali saya harus memperbarui model domain untuk mendukung kasus penggunaan khusus dan membuatnya lebih kuat.

Elang
sumber
2
+1: Saya juga memisahkan lapisan logika domain dari lapisan logika aplikasi. Saya meletakkan semua ORM dan basis data di lapisan logika domain. Lapisan logika aplikasi tidak tahu apa-apa tentang ORM, transaksi, dan semua hal itu: ia hanya melihat kelas logika bisnis dan memanggil metode mereka. Saya menemukan pendekatan ini sangat efektif untuk memiliki lapisan logika aplikasi yang lebih sederhana dan bersih.
Giorgio
@ Falcon: Terima kasih atas informasinya. Ketika saya menyebutkan model anemia apa yang saya maksudkan adalah jika saya membuat domain menggunakan DDD, satu versi dari repositori saya mungkin adalah versi mda di mana saya hanya akan memindahkan entitas saya ke entitas mda (yaitu model anemia) dan kemudian bertahan mereka dalam transaksi dll. Apakah ini baik-baik saja? Saya ragu saya akan menggunakan alat MDA tetapi hanya mencoba memahami bagaimana saya bisa jika saya mau. Apakah ini benar?
JD01
@ JD01: Saya tidak begitu mengerti Anda, tetapi sepertinya Anda ingin mengubah entitas model domain sehingga Anda dapat bertahan dengan mudah. Itu cukup banyak seperti menggunakan DTO dan automapper (google it) bisa menjadi alat yang berguna untuk tugas seperti itu. Pendekatan seperti itu tidak selalu mengganggu praktik terbaik DDD. Bagaimanapun, repositori juga dimaksudkan untuk menyembunyikan Logika Akses Data. Anda bisa mengubah objek Bisnis Anda di belakang layar menjadi DTO MDA dan kemudian bertahan dan dan pengguna API tidak akan menyadarinya. Saya pikir tidak apa-apa.
Falcon
1
@ JD01: Saya sarankan Anda melihat pada tautan berikut untuk melihat berapa banyak orang java Enterprise yang melakukannya. Mereka pada dasarnya memiliki DAO, DTO dan BO (objek Bisnis). Bagi saya, itu terlalu banyak lapisan tetapi desainnya ok. java.sun.com/blueprints/corej2eepatterns/Patterns/…
Falcon
@ Falcon: Ya, saya berpikir sepanjang garis DTO menjadi objek MDA saya, bukan bahwa saya akan pergi ke sana. Hanya mendapatkan pegangan apa yang setiap bagian dari pemain DDD d0. Sekali lagi terima kasih.
JD01
3

Namun, jika saya ingin terus menggunakan alat MDA untuk bagian ORM dari aplikasi, model yang dibuat di sini akan sangat anemia (yaitu tidak mengandung logika bisnis).

Saya tidak tahu alat MDA mana yang Anda gunakan, tetapi yang saya kerjakan selalu membuat kelas parsial sehingga Anda bebas untuk melengkapinya dengan logika bisnis sebanyak yang Anda inginkan.

Namun, saya merasa alat MDA sedikit kurang tepat dalam konteks DDD daripada ORM, karena pembuatan kode sering cenderung menghasilkan kelas yang kacau dengan kebisingan khusus alat alih-alih entitas domain yang ramping dan jelas diekspresikan yang kami harapkan. Sebenarnya, yang sering Anda dapatkan adalah campuran data domain, logika persistensi, logika validasi kendala ... dan saya tidak tahu apakah ada cara untuk memisahkan masalah ini dengan sebagian besar alat MDA.

Dan tentu saja, Anda tidak dapat menyentuh kode yang dihasilkan kecuali melalui kelas parsial, yang berarti Anda tidak dapat menghilangkan perilaku anti-DDD potensial yang akan diintegrasikan. Ini bermasalah dalam pendekatan di mana Anda ingin menegakkan hambatan ketat antara Agregat dan menyesuaikan hubungan antara entitas Anda dengan sempurna. Membangun waktu dalam lingkungan integrasi berkesinambungan dapat menderita dari langkah pembuatan kode tambahan juga.

Terlepas dari itu, saya pikir Falcon cukup banyak mengatakan itu semua - sama sekali tidak ada dalam alat ORM atau MDA mencegah Anda dari memiliki entitas domain yang kaya.

guillaume31
sumber
Hai, saya menggunakan ECO (objek inti perusahaan) dari ableobjects.com dan persis seperti yang Anda gambarkan.
JD01
1

Apa yang saya lakukan di tim saya adalah memodelkan objek, domain, dan menambahkan logika bisnis saya secara bersamaan. Saya tidak menggunakan Pengembangan Model Driven yang akan menghasilkan kode dari model tetapi lebih suka pendekatan penjelasan. Maksud saya bahwa pada level objek di dalam diagram kelas saya menambahkan stereotip ORM. Ini akan menambah anotasi persistensi langsung dalam kode yang kompatibel dengan EJB3 / hibernate. Pembuatan basis data dilakukan oleh Hibernate dan tentu saja bukan oleh template UML. Ini jauh lebih baik karena jika perubahan kode dan penjelasan yang ditambahkan tidak persis apa yang hibernate spesialis maka dia dapat mengubahnya tetapi modelnya masih bagus. Saya juga dapat mengubah persyaratan saya dan model domain saya masih ok.

Pengembang dapat menambahkan logika bisnis di dalam setiap metode dan menambahkan komentar, saya juga bisa membuat model dan menambahkan kendala. Misalnya penjualan harus lebih dari 50rb jika tidak dll .... Saya tidak perlu kode itu tetapi hanya menulis dalam model dan informasi ini akan terlihat oleh tim pengembang. UML sangat keren dan fleksibel.

UML_GURU
sumber