Pertimbangkan contoh ini:
Saya punya situs web. Itu memungkinkan pengguna untuk membuat posting (bisa apa saja) dan menambahkan tag yang menggambarkan posting. Dalam kode, saya memiliki dua kelas yang mewakili pos dan tag. Mari kita panggil kelas-kelas ini Post
dan Tag
.
Post
mengurus pembuatan posting, menghapus posting, memperbarui posting, dll.
Tag
mengurus pembuatan tag, menghapus tag, memperbarui tag, dll.
Ada satu operasi yang hilang. Menautkan tag ke posting. Saya berjuang dengan siapa yang harus melakukan operasi ini. Itu bisa cocok dengan baik di kedua kelas.
Di satu sisi, Post
kelas bisa memiliki fungsi yang mengambil Tag
parameter, dan kemudian menyimpannya dalam daftar tag. Di sisi lain, Tag
kelas bisa memiliki fungsi yang mengambil Post
sebagai parameter dan menautkan Tag
ke Post
.
Di atas hanyalah contoh dari masalah saya. Saya benar-benar mengalami ini dengan beberapa kelas yang semuanya mirip. Ini bisa cocok dengan baik di keduanya. Singkat untuk tidak menempatkan fungsionalitas di kedua kelas, konvensi atau gaya desain apa yang ada untuk membantu saya memecahkan masalah ini. Saya berasumsi harus ada sesuatu yang kurang dari hanya memilih satu?
Mungkin meletakkannya di kedua kelas adalah jawaban yang benar?
Tidak, tidak di keduanya! Itu harus di satu tempat.
Apa yang saya temukan tanpa henti dalam pertanyaan Anda adalah kenyataan bahwa Anda mengatakan "
Post
berhati-hati dalam membuat posting, menghapus posting, memperbarui posting" dan sama untukTag
. Ya, itu tidak benar.Post
hanya dapat mengurus pembaruan, sama untukTag
. Membuat dan menghapus adalah pekerjaan orang lain, eksternalPost
danTag
(sebut sajaStore
).Tanggung jawab yang baik untuk
Post
adalah "tahu pembuatnya, konten dan tanggal pembaruan terakhir". Tanggung jawab yang baikTag
adalah "tahu nama dan tujuannya (baca: deskripsi)". Tanggung jawab yang baik untukStore
adalah "tahu semua Posting dan semua Tag dan dapat menambah, menghapus dan mencari mereka".Jika Anda melihat ketiga peserta ini, siapa yang paling alami yang harus memiliki pengetahuan tentang hubungan Post-Tag?
(bagi saya, itu adalah Post, sepertinya wajar "tahu tag-nya"; pencarian terbalik (semua posting untuk sebuah tag) tampaknya merupakan pekerjaan Toko; meskipun saya mungkin salah)
sumber
ConditionalWeakTable
(dengan asumsi orang cukup beruntung memiliki kerangka kerja di mana ada)?Ada detail penting yang hilang dari persamaan. Mengapa tag mengandung post dan sebaliknya? Jawaban untuk pertanyaan ini menentukan solusi untuk setiap set yang diberikan.
Secara umum saya dapat memikirkan situasi yang serupa. Sebuah kotak dan isinya. Sebuah kotak memiliki konten sehingga hubungan has-a sesuai. Bisakah isi kotak? Tentu, sebuah kotak dengan sebuah kotak. Sebuah kotak isinya. Tapi IS-A bukan desain yang bagus untuk semua kotak. Dalam kasus seperti itu saya akan mempertimbangkan pola dekorator. Dengan cara ini sebuah kotak didekorasi dengan konten saat runtime sebagaimana diperlukan.
Tag juga dapat memiliki Posting, tetapi bagi saya ini bukan hubungan yang statis. Sebaliknya itu bisa berupa laporan dari semua posting yang memiliki tag kata. Dalam hal ini entitas baru, bukan has-a.
sumber
Sementara dalam teori hal-hal seperti itu bisa berjalan baik, dalam praktiknya ketika Anda turun ke implementasi satu cara hampir selalu lebih cocok daripada yang lain. Firasat saya adalah itu akan lebih cocok di
Post
kelas karena asosiasi akan dibuat selama pembuatan posting atau pengeditan, ketika hal-hal lain tentang posting berubah pada saat yang sama.Juga, jika Anda mengaitkan beberapa tag dan ingin melakukannya dalam satu pembaruan basis data, Anda harus membuat semacam daftar semua tag yang terkait dengan pos yang sama sebelum melakukan pembaruan. Daftar itu jauh lebih cocok di
Post
kelas.sumber
Secara pribadi, saya tidak akan menambahkan fungsi itu ke salah satu dari mereka.
Bagi saya, keduanya
Post
danTag
merupakan objek data, jadi seharusnya tidak menangani fungsionalitas basis data. Mereka seharusnya ada. Mereka dimaksudkan untuk menyimpan data, dan digunakan oleh bagian lain dari aplikasi Anda.Sebagai gantinya, saya memiliki kelas lain yang bertanggung jawab untuk logika bisnis dan data Anda yang berkaitan dengan halaman web Anda. Jika halaman Anda menampilkan posting dan memungkinkan pengguna untuk menambahkan tag, maka kelas akan memiliki
Post
objek, dan berisi fungsionalitas untuk ditambahkanTags
ke sanaPost
. Jika halaman Anda menampilkan tag dan memungkinkan pengguna untuk menambahkan posting ke tag itu, itu akan berisiTag
objek dan memiliki fungsi untuk ditambahkanPosts
ke sanaTag
.Tapi itu hanya aku. Jika Anda merasa bahwa Anda harus menangani fungsionalitas basis data dalam objek data Anda, maka saya akan merekomendasikan jawaban pdr
sumber
Ketika saya membaca pertanyaan ini, hal pertama yang muncul di benak saya adalah hubungan database Many To Many . Posting dapat memiliki banyak Tag ... Tag dapat memiliki banyak Posting .... Tampaknya bagi saya bahwa kedua kelas memerlukan kemampuan untuk mengelola hubungan ini sampai batas tertentu.
Dari sudut pandang Posting ...
Jika Anda mengedit atau membuat Posting, aktivitas sekunder menjadi mengelola hubungan Tag .
IMO, pembuatan TAG yang sepenuhnya baru bukan milik di sini.
Dari sudut pandang Tag ...
Anda dapat membuat Tag tanpa harus menetapkannya ke Pos. Satu-satunya aktivitas yang saya lihat yang melibatkan interaksi dengan Post adalah fungsi Delete Tag. Namun, fungsi ini harus merupakan fungsi mandiri yang berdiri sendiri.
Ini hanya akan berfungsi jika ada tabel yang menghubungkan database yang menyelesaikan hubungan Many to Many
sumber