2010-11-12 14 views
3

Si j'ai deux entités, Parent et Child, Parent a besoin de connaître tous ses Child enfants, et tous les Child exemple a besoin de connaître son instance parent Parent, comment dois-je faire cela correctement (en termes de DDD etc.)?Comment créer correctement deux entités avec une dépendance cyclique?

La façon simple serait de faire parent.addChild(new Child(parent)), mais cela semble laid - ainsi que:

parent.addChild(new Child()); // Then call some setParent method on child, which needs to be public 

Ai-je besoin d'utiliser ici une usine? Et si oui, comment?

Merci

Répondre

2

Une option serait d'avoir une méthode d'instance pertinente sur la classe parente. Une Usine statique n'est probablement pas nécessaire ici puisque vous travaillez sur des objets existants et que vous devez simplement connecter un objet avec un autre.

public class Parent { 

    // ... 

    public Child createChild() { 
     Child c = new Child(this); 
     this.addChild(c); 
     return c; 
    } 

    protected void addChild(c) { 
     // ... 
    } 

    // ... 

} 

public class Child { 

    public Child(Parent p) { 
     // ... 
     this.addParent(p); 
    } 

    protected addParent(Parent p) { 
     // ... 
    } 
} 

Si le constructeur de l'enfant a besoin d'arguments, vous pouvez passer ceux à la méthode createChild.

+0

Oui, mais cela exposerait toujours le "parent setter" à d'autres objets qui voudraient créer un enfant. Mon point est que seul un parent devrait être en mesure de définir le parent d'un enfant. Est-ce une exigence déraisonnable? Ou cela ajouterait-il trop de frais généraux/de complexité? –

+0

@Piotr: C'est le moment où vous devez faire en sorte que le parent et l'enfant soient plus conscients l'un de l'autre. En Java, vous le feriez en les mettant dans le même paquet. En C++, ils auraient un accès entre amis uniquement. (Je sais qu'il doit y avoir un équivalent en C# mais je ne le sais pas.) –

+0

Si votre but est de cacher l'accesseur parent, vous pouvez opter pour une création enfant basée sur un constructeur de type SWT. – Vladimir

2

Vous n'êtes pas limité à une seule approche. Vous devriez utiliser l'approche qui vous convient.

En SWT l'enfant est lié à la société mère dans le constructeur:

new Label(parentComposite, SWT.NONE); 

Après que parentComposite connaît son enfant.

Remarque: SWT requiert un parent à la création, ce qui limite certaines fonctionnalités. Vous ne pouvez pas créer d'enfant sans spécifier un enfant. C'est la limitation du SWT.

Dans Swing, vous pouvez créer un widget enfant, puis l'ajouter au parent.

Ceux ci-dessus juste les exemples. Votre solution personnelle sera basée sur vos besoins.

Je considérerais d'utiliser des méthodes moins, plus de cohérence (ne laissez pas votre enfant dissociées de parent)

En parlant de code, je voudrais utiliser la méthode suivante:

Parent { 
addChild(Child child) { 
    children.add(child); 
    child.setParent(this); 
} 
} 

espoir qui aide. Bonne conception!

+0

je vous remercie pour votre réponse, pouvez-vous s'il vous plaît vérifier réponse Sauls et mon commentaire à ce sujet et commenter? –

2

Que diriez-vous de faire quelque chose comme ceci:

public class Child { 
    Child (Parent parent) { 
     ... 
     this.parent = parent; 
     parent.addChild(this); 
    } 
} 

Vous pouvez définir des parents à l'enfant que pendant la création de l'enfant.