Frage

Ich bin ziemlich neu in dem OO-Design-Prozess, so bitte Geduld mit mir ....

Ich habe zwei Entitäten, die ich als Klassen zu modellieren benötigen, rufen sie Eltern und Kind (es ist nahe genug, um die eigentliche Problem-Domäne). Ein Elternteil wird ein oder mehr Kinder hat. - Ich habe kein Interesse, in dieser Anwendung in kinderlos Eltern

Wo ist mein Gehirn Ausgeht Mittagessen ist auf der Tatsache, dass ich entweder von dem anderen finden zu können. In meiner Datenbank kann ich dies mit einer normalen Fremdschlüsselbeziehung implementieren, und die Set-basierte Art von SQL macht es einfach, alle Kinder für einen bestimmten Elternteil, oder die Eltern für ein bestimmtes Kind zu finden. Aber als Objekte ...?

I denken , dass die Eltern eine Sammlung tragen sollte (Liste, was auch immer) der Kinder. Ich denke auch, dass jedes Kind, das einen Hinweis auf ihre Eltern tragen soll. Die kreisförmige Natur der Referenzen, jedoch macht mein Kopf weh tun.

Am I:

  • Auf dem richtigen Weg?
  • Völlig off base? Wenn ja, was soll ich anders machen?

Dies wird mit ziemlicher Sicherheit in VB.NET implementiert werden, aber ich bin ein weiter Weg vom Schneiden Code noch.

Bearbeiten nach 8 Antworten:

Vielen Dank an Alle. Es war schwer, nur eine Antwort holen zu übernehmen.

ein paar Dinge zu klären, die in den Antworten befragt wurden:

  • Eltern und Kind sind sehr unterschiedlich Einheiten - es gibt keine Vererbung Beziehung überhaupt. Ich entschied mich für die Namen, die ich tat, weil sie wirklich sehr nah an der realen Welt Problembereich, und jetzt sehen, dass es eine Quelle der Verwirrung von einem OO Perspektive.
  • Die Hierarchie ist nur eine Ebene tiefer - Kinder werden nie haben Kinder innerhalb der Anwendung.

Vielen Dank noch einmal.

War es hilfreich?

Lösung

Die zirkulären Referenzen sind in Ordnung und absolut Standard, wenn eine Baumstruktur zu schaffen. HTML Document Object Model (DOM), zum Beispiel, hat die Eltern-Kind-Eigenschaften auf jedem Knoten in einem DOM-Baum:

interface Node {
    // ...
    readonly attribute Node     parentNode;
    readonly attribute NodeList childNodes;
    // ...
}

Andere Tipps

Klingt wie Sie auf dem richtigen Weg zu mir sind. Wie pro Ihre Domain-Modell haben die Eltern die Kinder und Kinder Eltern haben. Sie müssen jeweils von dem anderen verweisen.

Es ist nichts falsch mit zirkulären Referenzen, man muss nur vorsichtig sein, was man mit ihnen machen. Probleme wo es laufen in ist Ihre Einheiten auf der Serverseite in einer automatisierten Weise verwalten, wenn man sie aus der Datenbank laden. Zum Beispiel, holen Sie ein Child-Objekt aus der Datenbank mit einer Abfrage. Haben Sie sind neben der Mutter Informationen? Haben Sie gehören die Kinder der Eltern?

ORM-Tools wie Light oder Microsoft Entity Framework im Allgemeinen mit diesen mit "lazy loading" Richtlinien befassen. Sie werden holen, was Sie zuerst müssen (so, wenn Sie ein Kind holen, es wird nur die Kinder Eigenschaften und die ID des Eltern). Wenn später Sie dereferenzieren der Eltern, geht er hin und holt die Muttereigenschaften und instanziiert das übergeordnete Objekt. Wenn später noch, greifen Sie es Kinder Sammlung ist, geht es dann und holt das entsprechende Kind Informationen und schafft Kind für die Sammlung Objekte. Bis Sie sie allerdings brauchen, ist es nicht es füllen.

Ich denke, es ist vernünftig zu können, will die Objektgraphen auf diese Weise zu durchqueren. Es ist schwer zu wissen, ob Sie einen berechtigten Grund dafür aus Ihrem Post, aber ich glaube nicht, die Referenzen an und für sich ein schlechtes Design unter Beweis stellen.

Ich glaube, Sie auf dem richtigen Weg sind. Warum ist die kreisförmige Art der Referenzen zu machen Sie Ihren Kopf verletzt? Was ist das grundlegende Problem Sie mit einem Parent mit Hinweis auf ihre Kinder zu haben, und ein Child einen Verweis auf seine Eltern zu haben?

Sprechen Sie über eine Klassenhierarchie, wobei die übergeordnete Klasse über seine untergeordneten Klassen kennt?

Sie sollten dies unter allen Umständen vermeiden.

Standardmäßig wird ein Kind Klasse weiß alles über eine übergeordnete Klasse, , weil es eine Instanz der übergeordneten Klasse ist . Aber um eine Elternklasse über seine untergeordneten Klassen weiß, hat es erforderlich, dass das Kind Klasse auch alles über jede andere Kind-Klasse kennen. Dadurch entsteht eine Abhängigkeit zwischen einem Kind und jedem weiteren Kind dieser Klasse. Dies ist ein Szenario, das wartbaren wird Probleme in der Zukunft führen - wenn Sie können es sogar zu kompilieren oder ausführen bekommen, die in vielen Sprachen wird nicht der Fall sein.

Das heißt, es klingt für mich wie Sie nicht versuchen, sind eine Klassenhierarchie zu tun, aber eine Sammlung Hierarchie, das heißt einen Baum. In diesem Fall ja, du bist auf dem richtigen Weg; es ist ein gemeinsames Paradigma. Der übergeordnete Knoten hat eine Sammlung von untergeordneten Knoten, und der Kindknoten hat einen Verweis auf den übergeordneten Knoten.

Die Sache ist? Sie sind alle die gleiche Klasse ! Hier ist ein sehr einfaches Beispiel in C #:

public class Node
{
  public readonly Node Parent; // null Parent indicates root node
  public readonly List<Node> Children = new List<Node>();
  public Node(Node parent)
  {
     Parent = parent;
  }
  public Node()
  {
     parent = null;
  }
  public void AddChild(Node node)
  {
     Children.Add(node);
  }
}

Ich habe das Gefühl, das ist, was Sie wirklich nach sind. Mit diesem Paradigma, würden Sie dann Knoten Unterklasse für was auch immer schändliche Zwecke Sie haben könnten.

Wenn ich verstehe, dass Objekte von P ein Array von Objekten enthalten P-> c [] für Kinder. Und jeder Knoten P ohne Kinder ist ein Blatt ... mit jedem P enthält P-> P‘(die Eltern).

Die Lösung, die Sie angeben, als Kind Verweise auf Kinder und umgekehrt enthält, entfällt die Notwendigkeit, den Baum zu durchqueren Abstammung eines bestimmten Kindes und Kinder eines Knotens zu erhalten. Das ist wirklich nur ein Baum, der Sie alle Arten von Links führen auf und Algorithmen, es zu durchqueren und aufzuzählen. Welches ist in Ordnung!

Ich schlage vor, die Bäume Kapitel in The Art of Computer Programming für einen ausgezeichneten und gründlichen Blick auf Baumstrukturen und effizienten Wegen Lesen Abstammungs und Kinder aufzuzählen.

Wenn die Kinder muss haben einen Elternteil ich in der Regel nur ein Elternteil Typ-Instanz im Kindkonstruktors benötigen.

Klingt für mich wie Sie auf dem Weg zu einem schlechten Design sind. Ihre Architektur sollte nie zirkuläre Referenzen haben.

Sie sollten wahrscheinlich erneut prüfen, warum Ihre Kinder einen Verweis zurück auf die Eltern müssen und umgekehrt. Ich würde in Richtung der Eltern lehnt eine Sammlung von Kindern. Sie können dann auf den übergeordneten Funktionen hinzufügen, um zu überprüfen, um zu sehen, ob ein Kind Objekt ein Kind des Falles ist.

Eine bessere explination des Ziels könnte ein wenig hilfreicher als auch sein ...

Bearbeiten

las ich ein wenig mehr (und hörte Kommentare) ... und es stellt sich heraus, ich bin ganz im Unrecht. Zirkuläre Referenzen haben ihren Platz in der Tat so lange wie Sie mit ihnen vorsichtig sind und lassen Sie sich nicht aus der Hand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top