Verknüpfung von Kind zu Eltern - schlechte Idee?

15

Ich habe eine Situation, in der meine Eltern wissen, dass es ein Kind ist (duh), aber ich möchte, dass das Kind auf die Eltern verweisen kann. Der Grund dafür ist, dass ich möchte, dass das Kind die Fähigkeit hat, sich selbst als am wichtigsten oder am wenigsten wichtig zu bezeichnen, wenn es sich danach anfühlt. Wenn das Kind dies tut, verschiebt es es an den oberen oder unteren Rand der Kinder des Elternteils.

In der Vergangenheit habe ich eine WeakReference-Eigenschaft für das Kind verwendet, um es an die Eltern weiterzuleiten, aber ich bin der Meinung, dass dies einen ärgerlichen Aufwand mit sich bringt, aber vielleicht ist es nur der beste Weg, dies zu tun.

Ist das nur eine schlechte Idee? Wie würden Sie diese Fähigkeit anders einsetzen?

Update 1: Hinzufügen von mehr Kontext. Dies ist ein Rendering-System, sodass der übergeordnete Container eine Liste von Fenstern ist, die zu Gruppen zusammengefasst sind. Das untergeordnete Element (Fenster) mit der Aufschrift "Ich bin am wichtigsten!" will im Grunde auf dem Rest der Fenster gerendert werden.

Das übergeordnete Element ist nur ein logischer Container zum Gruppieren dieser untergeordneten Elemente. Ich kann sehen, wo es eine gute Idee ist, ein Ereignis hinzuzufügen, um die Anfrage zu signalisieren, ganz oben zu stehen. Aber abgesehen von der Implementierung (was das Kind mit dem Elternteil tun möchte), warum möchten Sie nicht, dass das Kind mit dem Elternteil verknüpft wird? Dies geschieht durch doppelt verknüpfte Listen, damit Personen von und zu etwas gelangen können.

Thraka
quelle
3
Du brauchst kein WeakReference. Der .net-Garbage-Collector kann Zyklen verarbeiten. Wenn das Kind nicht mehr verwendet wird (der Elternteil zeigt nicht darauf), wird es trotz eines Verweises auf den Elternteil gesammelt.
dbkk
Was passiert, wenn 2 Kinder beide denken, dass sie die wichtigsten Kinder sein wollen?
btilly
@btilly Wichtigstes Kind ordnet es einfach an den Anfang des Stapels in der Kinderliste des Elternteils. Also, wer es zuletzt tut, wird am wichtigsten. In meinem Szenario hätten Sie nie den wichtigsten Konflikt.
Thraka

Antworten:

18

Ist das nur eine schlechte Idee?

Oft.

  • Es bricht die Kapselung des Elternteils.
  • Es erhöht die Kopplung in beiden.
  • Es dient als Breakout - Punkt für das Kind auf den Rest des Systems zu bekommen, zunehmende Kopplung mit etwas vage in deren Nähe (weil die Menschen werden , dass der Bezug missbrauchen)
  • Es schränkt Ihr Design ein, wenn Sie jemals Kinder ohne Eltern wollen.

Wie machst du es besser? Das Kind sollte nicht wissen oder sich darum kümmern, dass es sich in einer Sammlung befindet. Anstatt sich selbst für wichtig zu halten, sollte es signalisieren, dass ein Ereignis stattgefunden hat, von dem es weiß, dass es passiert ist, damit jeder (der Elternteil) seine Priorität erhöhen kann (oder was auch immer die Regeln für den Kontext sind, in dem das Kind lebt). Ich bin davon nicht begeistert und würde es vielleicht vorziehen, die Bedenken zwischen dem Modell des Kindes und dem Wichtigkeitsverhalten besser zu trennen, kann aber nicht ohne weiteren Kontext näher darauf eingehen.

[bearbeiten:]

Ja, Rendering-Systeme sind ein Fall, in dem das Eigentum der Eltern einen Sinn ergibt, aber es ist ein Fall, in dem dies getan wurde und nicht das Ende der Welt ist. Um einen Steuerungsfokus zu erhalten, würde ich immer noch das Design bevorzugen, bei dem der Eingabehandler (oder was auch immer) den Baum abwickelt und weiß, welche Sammlung neu angeordnet werden soll, anstatt das Kind zu finden, und etwas darauf aufzurufen, das weiß, dass es an sein Elternteil geht.

Telastyn
quelle
1
Dies ist eine gute Antwort, und Sie sollten wahrscheinlich alle darin angesprochenen Punkte berücksichtigen und prüfen, ob sie auf Ihr Problem zutreffen. Allerdings denke ich nicht, dass es das Ende der Welt ist, wenn Sie mit der Referenz als einfacher Implementierung beginnen und sie neu fokussieren, wenn die Dinge außer Kontrolle geraten.
Rperetti
Die Antwort ist richtig. Wenn die Verknüpfung von Kind zu Eltern jedoch eine schlechte Idee ist, ist die objektorientierte Programmierung nicht mehr mit Objekten des realen Lebens verbunden. Gibt es keine Möglichkeit, dies zu einer guten Sache zu machen?
Manoj R
Vielen Dank für diese Antwort. Ich habe meiner ursprünglichen Frage mehr Kontext hinzugefügt.
Thraka
1
@ManojR - Objektorientierte Programmierung war nie mit Objekten des realen Lebens verbunden.
Telastyn
Ihre Bearbeitung lässt mich über den VisualTreeHelper in WPF \ Silverlight nachdenken. Auf diese Weise können Sie die Beziehung des aktuellen Steuerelements zu den übrigen Steuerelementen des UI-Systems abfragen. Ich denke, ich könnte so etwas implementieren, weil ich auch ein Root-Steuerelement habe, das alles andere hostet. Vielen Dank!!
Thraka
0

Wie kam die Hinrichtung zu dem Punkt, an dem das Kind entscheidet, dass es am wichtigsten sein möchte? Ist es dort durch die Eltern angekommen? Wenn ja, können Sie einen Verweis auf das übergeordnete Element an diese Methode senden.

z.B. Wenn alle Knoten eine Art update () -Methode haben, die so etwas wie macht

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

Sie könnten es ändern

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}
user470365
quelle
Ja, das ist eine großartige Möglichkeit. In meiner Situation ist es jedoch möglich, dass der Client-Logikcode nicht von der übergeordneten Schleife initiiert wird.
Thraka
0

Ich denke nicht, dass es eine schlechte Idee ist. Sie können dieses Problem lösen, indem Sie jedem untergeordneten Element einen Sortierreihenfolgewert hinzufügen. Ich stelle mir so etwas wie einen "Z-Index" vor, mit dem Objekte auf Webseiten übereinander oder hintereinander angezeigt werden.

Ich bin nicht sicher, wie Sie so etwas codieren würden, aber das Konzept klingt machbar.

Michael Riley - AKA Gunny
quelle
Bei dieser Lösung besteht das Problem jedoch weiterhin. Dies ersetzt nur das Konzept der Reihenfolge im Array durch den Z-Index. Ich müsste immer noch ein Kommunikationssystem von Kind zu Eltern haben. Vielen Dank :)
Thraka