Łączenie dzieci z rodzicami - zły pomysł?


15

Mam sytuację, w której mój rodzic wie o swoim dziecku (duh), ale chcę, aby dziecko mogło odnieść się do rodzica. Powodem tego jest to, że chcę, aby dziecko mogło określić się jako najważniejsze lub najmniej ważne, gdy ma na to ochotę. Gdy dziecko to robi, przesuwa je na górę lub dół dzieci rodzica.

W przeszłości korzystałem z właściwości WeakReference dla dziecka, aby odsyłać do rodzica, ale wydaje mi się, że to irytuje, ale może to po prostu najlepszy sposób, aby to zrobić.

Czy to tylko zły pomysł? Jak wprowadziłbyś tę umiejętność w inny sposób?

Aktualizacja 1: Dodanie więcej kontekstu. Jest to system renderowania, więc kontener nadrzędny jest listą okien zgrupowanych razem. Element podrzędny (okno) z napisem „Jestem najważniejszy!” chce być renderowane w górnej części pozostałych okien.

Rodzic jest tylko logicznym kontenerem do grupowania tych dzieci. Widzę, gdzie dodanie zdarzenia sygnalizującego prośbę o umieszczenie na szczycie jest dobrym pomysłem. Ale na bok implementacja (co dziecko chce zrobić z rodzicem), dlaczego nie chcesz mieć linkowania dziecko-> rodzic? Robią to podwójnie połączone listy, aby ludzie mogli przejść do czegoś i z czegoś.


3
Nie potrzebujesz WeakReference. Moduł śmieci .NET może obsługiwać cykle. Jeśli dziecko nie będzie już używane (rodzic nie wskazuje na niego), zostanie ono zebrane, mimo że zawiera odniesienie do rodzica.
dbkk

Co się stanie, jeśli oboje dwoje dzieci myśli, że chcą być najważniejszymi dziećmi?
btilly,

@btilly Najważniejsze dziecko właściwie po prostu zmienia kolejność na górze stosu na liście potomków rodzica. Kto więc to trwa, staje się najważniejszy. W moim scenariuszu nigdy nie miałbyś konfliktu najważniejszych.
Thraka

Odpowiedzi:


18

Czy to tylko zły pomysł?

Częstokroć.

  • Łamie enkapsulację rodzica.
  • Zwiększa sprzężenie w obu.
  • Służy jako punkt dopasowującego dla dziecka, aby uzyskać w pozostałej części systemu, zwiększając sprzężenie z niczego niejasno koło niego (bo ludzie będą nadużywać tego odniesienia)
  • Ogranicza twój projekt, jeśli kiedykolwiek chcesz dzieci bez rodziców.

Jak to zrobić lepiej? Dziecko nie powinno wiedzieć ani przejmować się, że znajduje się w kolekcji. Zamiast uważać się za ważne, powinno to sygnalizować, że wydarzyło się jakieś zdarzenie, o którym wie, aby ktokolwiek się przejmował (rodzic) mógł zwiększyć swój priorytet (lub cokolwiek to jest w kontekście kontekstu, w którym żyje dziecko). Nie jestem tym podekscytowany i być może wolałbym lepsze rozdzielenie obaw między modelem dziecka a zachowaniem istotności, ale nie mogę go rozwinąć bez większego kontekstu.

[edytować:]

Tak, systemy renderowania to jeden przypadek, w którym własność rodzica ... no cóż, nie chcę powiedzieć, że ma to sens, ale jest to jeden przypadek, w którym zostało to zrobione i nie jest końcem świata. Aby skupić się na kontroli, wolałbym projekt, w którym moduł wprowadzania danych (lub cokolwiek innego) chodzi po drzewie i wie, którą kolekcję zmienić, zamiast znajdować dziecko, wzywając coś, co wie, aby przejść do jego rodzica.


1
To dobra odpowiedź i prawdopodobnie powinieneś rozważyć wszystkie podniesione przez nią kwestie i sprawdzić, czy dotyczą one twojego problemu. Powiedziawszy to, choć nie sądzę, że to koniec świata, jeśli zaczniesz od odniesienia jako prostej implementacji i zreformujesz go, gdy / jeśli coś wymknie się spod kontroli.
rperetti

Odpowiedź jest prawidłowa. Ale jeśli łączenie dzieci z rodzicami jest złym pomysłem, wówczas programowanie obiektowe nie jest już powiązane z obiektami z prawdziwego życia. Czy nie ma sposobu, aby uczynić to dobrą rzeczą?
Manoj R

Dzięki za dotychczasową odpowiedź. Dodałem więcej kontekstu w moim pierwotnym pytaniu.
Thraka

1
@ManojR - programowanie obiektowe nigdy nie było powiązane z rzeczywistymi obiektami.
Telastyn

Twoja edycja zmusza mnie do myślenia o VisualTreeHelper w WPF \ Silverlight. To pozwoliło ci zapytać o związek bieżącej kontroli z pozostałymi kontrolkami systemów interfejsu użytkownika. Myślę, że mógłbym zaimplementować coś takiego, ponieważ mam również kontrolę root, która będzie hostować wszystko inne. Dzięki!!
Thraka

0

Jak egzekucja dotarła do punktu, w którym dziecko decyduje, że chce być najważniejsze? Czy dotarło tam przez rodzica? Jeśli tak, możesz wysłać referencję do rodzica do tej metody.

na przykład. jeśli wszystkie węzły mają jakąś metodę update (), która działa podobnie

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

możesz to zmienić na

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

Tak, to świetny sposób, aby to zrobić. Jednak w mojej sytuacji może się zdarzyć, że kod logiczny klienta nie zostanie zainicjowany przez pętlę nadrzędną.
Thraka

0

Nie sądzę, że to zły pomysł. Możesz to rozwiązać, dodając wartość porządku sortowania do każdego dziecka. Wyobrażam sobie coś w rodzaju „indeksu z” używanego do wyświetlania obiektów na stronach lub za sobą na stronach internetowych.

Nie jestem pewien, jak byś napisał coś takiego, ale koncepcja wydaje się możliwa.


Dzięki temu rozwiązaniu problem nadal istnieje. To zastępuje jedynie koncepcję uporządkowania w tablicy z-indeksem. Nadal musiałbym mieć system komunikacji od dziecka do rodzica. Dzięki jednak :)
Thraka
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.