Tautan anak ke orang tua - ide buruk?

15

Saya memiliki situasi di mana orang tua saya tahu tentang itu anak (duh) tetapi saya ingin anak itu dapat merujuk orang tua. Alasan untuk ini adalah bahwa saya ingin anak memiliki kemampuan untuk menetapkan dirinya sebagai yang paling penting atau paling tidak penting ketika rasanya seperti itu. Ketika anak melakukan ini, ia memindahkannya ke atas atau bawah anak-anak orang tua.

Di masa lalu saya telah menggunakan properti WeakReference pada anak untuk merujuk kembali ke orang tuanya, tapi saya merasa itu menambah overhead yang mengganggu, tapi mungkin itu hanya cara terbaik untuk melakukannya.

Apakah ini hanya ide yang buruk? Bagaimana Anda menerapkan kemampuan ini secara berbeda?

Pembaruan 1: Menambahkan lebih banyak konteks. Ini adalah sistem render sehingga wadah induk adalah daftar jendela yang dikelompokkan bersama. Item anak (jendela) yang mengatakan "Aku yang paling penting!" ingin dasarnya diberikan di bagian atas sisa jendela.

Orang tua hanyalah wadah logis untuk mengelompokkan anak-anak ini bersama-sama. Saya bisa melihat di mana menambahkan acara untuk memberi sinyal permintaan berada di atas adalah ide bagus. Namun implementasi (apa yang ingin dilakukan anak dengan orang tua), mengapa Anda tidak ingin memiliki tautan anak->? Daftar tertaut ganda melakukan hal ini sehingga orang dapat melintasi ke dan dari sesuatu.

Thraka
sumber
3
Anda tidak perlu WeakReference. Pengumpul sampah .net dapat menangani siklus. Jika anak tidak lagi digunakan (orang tua tidak menunjuk ke sana), itu akan dikumpulkan meskipun berisi referensi ke orang tua.
dbkk
Apa yang terjadi jika 2 anak berpikir bahwa mereka ingin menjadi anak yang paling penting?
btilly
@ btilly Anak yang paling penting sebenarnya hanya mengatur ulangnya ke atas tumpukan di daftar anak orang tua. Jadi siapa pun yang melakukannya, menjadi yang paling penting. Dalam skenario saya, Anda tidak akan pernah mengalami konflik yang paling penting.
Thraka

Jawaban:

18

Apakah ini hanya ide yang buruk?

Sering.

  • Ini memecah enkapsulasi orang tua.
  • Ini meningkatkan kopling di keduanya.
  • Ini berfungsi sebagai titik pelarian bagi anak untuk mencapai sisa sistem, meningkatkan penggabungan dengan sesuatu yang samar-samar di dekatnya (karena orang akan menyalahgunakan referensi itu)
  • Ini membatasi desain Anda jika Anda menginginkan anak tanpa orang tua.

Bagaimana melakukannya dengan lebih baik? Anak itu seharusnya tidak tahu atau peduli bahwa itu ada dalam koleksi. Alih-alih menganggap dirinya penting, itu harus menandakan bahwa beberapa peristiwa yang diketahuinya telah terjadi sehingga siapa pun yang peduli (orang tua) dapat meningkatkan prioritasnya (atau apa pun aturan untuk konteks tempat tinggal anak itu). Saya tidak senang dengan hal itu, dan mungkin lebih suka pemisahan yang lebih baik antara model anak dan perilaku penting, tetapi tidak bisa diuraikan tanpa lebih banyak konteks.

[sunting]

Ya, sistem rendering adalah satu kasus di mana kepemilikan orang tua ... yah saya tidak ingin mengatakan itu masuk akal, tapi itu satu kasus di mana telah dilakukan dan bukan akhir dari dunia. Untuk memberikan fokus kontrol, saya masih lebih suka desain di mana pengendali input (atau apa pun) berjalan pohon dan tahu koleksi mana yang harus dipesan ulang daripada menemukan anak, memanggil sesuatu di atasnya yang tahu harus pergi ke induknya.

Telastyn
sumber
1
Ini adalah jawaban yang baik dan Anda mungkin harus mempertimbangkan semua poin yang diajukan olehnya dan melihat apakah mereka berlaku untuk masalah Anda. Karena itu meskipun saya tidak berpikir itu adalah akhir dunia jika Anda mulai dengan referensi sebagai implementasi sederhana dan refactor keluar ketika / jika semuanya tidak terkendali.
rperetti
Jawabannya benar. Tetapi jika menghubungkan anak ke orang tua adalah ide yang buruk, maka pemrograman berorientasi objek tidak lagi berhubungan dengan objek kehidupan nyata. Apakah tidak ada cara untuk menjadikan ini hal yang baik?
Manoj R
Terima kasih atas jawaban ini sejauh ini. Saya telah menambahkan lebih banyak konteks dalam pertanyaan awal saya.
Thraka
1
@ ManojR - pemrograman berorientasi objek tidak pernah berhubungan dengan objek kehidupan nyata.
Telastyn
Hasil edit Anda membuat saya berpikir tentang VisualTreeHelper di WPF \ Silverlight. Ini memungkinkan Anda untuk menanyakan tentang hubungan kontrol saat ini dengan seluruh kontrol sistem UI. Saya kira saya bisa mengimplementasikan sesuatu seperti ini karena saya juga memiliki kontrol root yang akan menampung semua yang lain. Terima kasih!!
Thraka
0

Bagaimana eksekusi sampai pada titik di mana anak memutuskan ingin menjadi yang paling penting? Apakah itu sampai di sana melalui orangtua? Jika ya, Anda dapat mengirim referensi ke induk ke metode itu.

misalnya. jika semua node memiliki semacam metode pembaruan () yang melakukan sesuatu seperti

void update() {
    doSomething()
    for(Node n:childs){
        //do something
        n.update();
    }
}

Anda bisa mengubahnya menjadi

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}
pengguna470365
sumber
Ya ini cara yang bagus untuk melakukannya. Namun, dalam situasi saya, mungkin saja kode logika klien tidak diinisiasi oleh loop induk.
Thraka
0

Saya tidak berpikir itu ide yang buruk. Anda dapat menyelesaikan ini dengan menambahkan nilai urutan pesanan ke setiap anak. Saya membayangkan sesuatu seperti "z-index" yang digunakan untuk menampilkan objek di atas atau di belakang satu sama lain di halaman web.

Saya tidak yakin bagaimana Anda akan membuat kode seperti ini, tetapi konsepnya terdengar masuk akal.

Michael Riley - AKA Gunny
sumber
Dengan solusi ini, masalahnya tetap ada. Ini hanya menggantikan konsep order-in-the-array dengan z-index. Saya masih harus memiliki sistem komunikasi dari anak-ke-orangtua. Terima kasih :)
Thraka