Apakah ada pola desain untuk mengelola hubungan banyak ke banyak?

10

Saya mengalami masalah dalam menentukan pola data ini yang saya temui saat mengerjakan beberapa aplikasi.

Terdiri dari:

  1. Jenis objek yang terdiri dari banyak objek itu sendiri
  2. Tipe objek kedua, di mana setiap instance 'memiliki banyak' objek pertama
  3. Dan, masing-masing sub-objek dari objek pertama dapat dimodifikasi per setiap asosiasi ke tipe objek kedua.

Contoh sederhana mungkin:

  1. Kursus pemrograman yang terdiri dari serangkaian pelajaran
  2. Pelajaran terdiri dari satu set tugas.
  3. Suatu kursus dapat diberikan kepada seorang siswa.
  4. Namun, begitu sebuah mata pelajaran diberikan kepada seorang siswa, setiap pelajaran dan / atau tugas dapat disesuaikan untuk siswa tersebut, dengan pemindahan dan penambahan, ke titik di mana mata pelajaran yang asli mungkin tidak dapat dikenali.

Dalam solusi saya, hasil dari ini adalah:

Pada tugas kursus kepada siswa, kursus dimuat ke dalam memori. Kemudian untuk setiap sub-objek, objek hubungan siswa / sub-objek dihasilkan dengan metadata yang sesuai. Pada dasarnya, saya menggunakan objek asli sebagai templat untuk menghasilkan objek yang dapat disesuaikan yang diperlukan.

Ini menghasilkan sejumlah besar data ketika sub-objek menjadi lebih kompleks dan diberi nomor. Saya bertanya-tanya apakah ada beberapa optimasi atau pola untuk mengurangi jumlah logika / kompleksitas yang diperlukan untuk memanipulasi pola data ini.

Nicholas Pickering
sumber
2
Anda yakin ingin "mengurangi jumlah data"? Apakah Anda mencari cara untuk "mengurangi jumlah kode dan logika non-sepele" yang perlu ditulis untuk menerapkan perilaku yang diperlukan? (Saya perhatikan bahwa pengelolaan data yang sedang berlangsung membutuhkan struktur data relasional, mirip dengan database.)
rwong
@rwong Ya, "mengurangi jumlah kode dan logika non-sepele" adalah tujuan akhir saya. Bagi saya, itu berarti mengurangi kompleksitas data dalam beberapa cara, tapi itu belum tentu merupakan persyaratan. Ini menjadi pola data yang umum sehingga saya bertanya-tanya apakah ada cara yang lebih sederhana untuk mengelolanya.
Nicholas Pickering
1
Pada prinsipnya ini adalah versi yang disempurnakan dari hubungan m: n. Bagaimana dengan judul seperti »Bagaimana mengelola hubungan objek yang kompleks«?
Thomas Junk
1
Sejumlah besar data tidak sama dengan tingkat kerumitan yang sangat besar dalam data. Kesulitan dalam mengelola apa yang Anda sedang membangun mungkin akan tumbuh dengan kompleksitas lebih daripada dengan volume.
Walter Mitty
1
Menarik. Saya telah bekerja pada beberapa aplikasi yang memiliki pola ini, tetapi tidak pernah terlihat sebelumnya bahwa itu adalah pola. Ingin juga melihat cara sederhana mengelola data seperti ini.
Jules

Jawaban:

6

Saya melihat beberapa opsi tergantung pada apa yang Anda butuhkan: (1) jika ada banyak contoh unik yang mengikuti algoritma umum, (2) jika ada banyak objek serupa atau Anda akan menghasilkan objek pada saat run-time, dan (3) jika Anda ingin secara dinamis mengubah perilaku objek saat berjalan. Catatan: Anda dapat menggabungkan semua pola yang saya sebutkan di sini, jika perlu.

  1. Jika setiap "tipe objek kedua" unik tetapi mengikuti pola perilaku yang sama, Anda bisa menggunakan Pola Templat . Sepertinya Anda mungkin melakukan ini. Tetapi untuk membuatnya eksplisit, abstrak Anda, kelas dasar memiliki algoritma umum yang diprogram; langkah-langkah tertentu dari algoritma ini diimplementasikan di kelas turunan.

  2. Jika Anda akan membuat banyak objek atau jika membuat objek saat run-time penting bagi Anda, Anda bisa menggunakan Pola Pabrik .

  3. Dan jika Anda ingin mengubah perilaku secara dinamis, Pola Stategy dapat bekerja. Misalnya, jika seorang siswa dalam kurikulum reguler diputuskan untuk menjadi kebutuhan khusus atau masuk ke program akselerasi. Ini bekerja dengan menyusun "siswa" dari objek yang akan mewakili kelas dasar dari kurikulum. Kurikulum akan ditugaskan ke kurikulum turunan di konstruksi siswa (yang terdengar aneh) dan dapat dipindahkan ke kurikulum turunan lain nanti.

(Hanya FYI, jika menggunakan (3) Pola Strategi dengan C ++, Anda harus Rvalues ​​untuk komposisi.)

Untuk menyimpan objek dan objek kedua Anda, ada baiknya mempertimbangkan Pola Iterator (untuk menelusuri, menambahkan, menghapus, mengurutkan, dll.).

Referensi yang baik adalah Head First Design Patterns , yang mencakup pola yang saya sebutkan dan implementasinya. Mereka bekerja di Jawa.

audrow
sumber
0

Saya merasa sulit untuk percaya, di bawah keberadaan penyimpanan data atau kegigihan, bahwa Anda perlu memiliki objek dengan kedalaman seperti ini pada titik tertentu dalam jangka waktu tertentu. Apakah ini untuk CRUD GUI? Jika demikian, maka saya akan menyarankan untuk mengubah pendekatan Anda dari awal. YAITU:

Mengidentifikasi substruktur yang diperlukan untuk Mahasiswa untuk acara, dan statefully menyimpan indeks asal kembali ke db, dan statelessly memperbarui itu, pergi ke atau dari pandangan dan db backend.

John P. Feltz
sumber
Saya tidak yakin saya mengerti saran Anda. Saya harus membuat subobjek kosong, lalu memaksa pengguna ke bentuk lain yang memungkinkan mereka untuk memodifikasi subobjek?
Nicholas Pickering
Saya menyarankan agar objek dalam diri mereka tidak menghasilkan banyak, jika semua yang Anda lakukan adalah transaksi tanpa kewarganegaraan antara konten mereka dan database back-end. Jika demikian, hapus dan lakukan transaksi untuk data tertentu yang menghadap klien.
John P. Feltz
Sunting: Ini juga bisa berarti membuat objek untuk menangkap data tertentu yang sedang ditransaksikan- jika Anda bias menggunakan ORM karena kenyamanan mereka dalam hal itu.
John P. Feltz
Kecuali saya salah paham, saya tidak berpikir apa-apa tentang proses ini dapat dibuat tanpa kewarganegaraan. Itu semua tergantung pada konteks aksi pengguna. Ketika pengguna membuat objek utama, mereka berharap substruktur tersedia untuk segera diubah.
Nicholas Pickering
-1

Kursus yang disesuaikan untuk setiap siswa sampai titik di mana kursus asli tidak dapat dikenali menunjukkan bahwa kursus asli hanyalah referensi "default". Apa yang akan saya lakukan adalah membuat kelas yang disebut CustomizedCourse (atau daftar mereka) dan menjadikannya (atau daftar itu) sebagai properti siswa. CustomizedCourse dapat memiliki referensi ke kursus asli untuk penggunaan "referensial" tetapi pekerjaan utama dan data akan berada di CustomizedCourse itu sendiri.

frezq
sumber
downvoter peduli untuk berkomentar?
frezq
Saya tidak mengundurkan diri (saya OP), tetapi sepertinya Anda mencoba menggambarkan Pola Template atau Strategi yang sudah dijelaskan dalam jawaban lain.
Nicholas Pickering