2010-12-07 7 views
2

Si j'ai deux classes avec une relation un-à-un, c'est le bon moment pour utiliser le mapping.Mappage vs composition

class A { ... } 
class B { ... } 
class C { 
    Map<A,B> a2b; 
} 

Et quand est-il temps d'utiliser la composition?

class A { 
    B myB; 
} 
class B { ... } 

La réponse changerait-elle si la relation était un-à-plusieurs et plusieurs-à-plusieurs?

Répondre

1

Cela dépend de l'étendue de cette relation A à B utilisée tout au long du projet.

Si beaucoup de différentes zones du projet devront connaître le B associé à A, alors il est préférable que ce soit simplement une partie de l'objet A. D'autre part, si cette association n'est utilisée que dans une partie du projet, vous devez créer le HashMap dans cette partie du projet pour stocker la relation.

Cette réponse ne change pas s'il s'agit d'une relation un-à-plusieurs ou plusieurs-à-plusieurs.

+0

+1 Clair et concis, merci! Et si à l'avenir cette relation pouvait être supprimée, alors la cartographie serait peut-être préférable? – Russell

+0

Si vous savez maintenant que la relation n'est que temporaire, ce serait une bonne raison de pencher vers la solution de cartographie. –

1

L'utilisation d'un Map augmentera la complexité de l'ensemble.

Ceci parce que dans votre exemple une des deux classes (A) possède l'autre, cela est vrai, soit pour la composition (puisque vous avez besoin du A pour récupérer son B) soit pour la cartographie (depuis que vous avez besoin de la clé A pour la valeur B). Donc, s'il n'y a pas de besoin explicite d'utiliser une carte, évitez simplement cela. Pour les cas 1: N, M: N, vous devriez toujours considérer le type d'opérations que vous devrez effectuer sur les objets, car avoir un troisième objet qui gère juste le mappage entre les A et B n'est pas vraiment Solution OO, vous pouvez utiliser la composition. Un-à-plusieurs peut être modélisé avec List<B> à l'intérieur de A alors que plusieurs-à-plusieurs est le seul cas dans lequel un mappage peut être bon, sinon vous devrez explorer les deux objets pour comprendre leurs correspondances.

Peu de temps: si vous accéder aux données à partir d'un point de vue A (AB est propriétaire) alors vous n'avez pas besoin d'avoir une cartographie externe, sinon vous, mais il devrait être bidirectionnel (deux hashmaps).

+0

A possède B dans l'exemple de composition, mais pas la cartographie. La carte n'augmente pas la complexité si la solution l'exige. Il n'y a rien à dire non plus que le troisième objet gère seulement le mapping. C'est une question de conception générale - ne regardez pas trop dans les détails des exemples, qui sont assez généraux pour commencer. Un mappage bidirectionnel ne doit être utilisé que si la conception l'exige. –

+0

C'est ce que j'ai dit, il ajoute une complexité inutile si vous n'avez pas vraiment besoin de l'utiliser, cela dépend de la conception du problème spécifique impliqué. Dans tous les cas A possède également B dans l'exemple de mapping, puisque vous ne pouvez pas récupérer un objet A avec son objet B associé, vous aurez besoin de 2 maps pour gérer les deux directions ('Map a2b' et' Map b2a' selon les opérations) – Jack

+0

Votre commentaire suppose une approche plus axée sur la base de données qu'une approche OO. Un objet de cartographie spécifique doit être utilisé juste quand c'est vraiment nécessaire, sinon c'est juste un gaspillage d'allocations et de temps, vous pouvez sûrement éviter de l'utiliser 90% du temps. – Jack

0

La carte est bonne pour relations plusieurs-à-plusieurs (comme les tables jointes dans la conception de base de données). Tant que votre un-à-un ou relation un-à-plusieurs n'a pas besoin d'attributs spéciaux, il n'est pas nécessaire d'utiliser une troisième classe (cette troisième classe modéliserait la relation elle-même).

Faire une association, peut-être un bi-directionnel, si vous avez besoin regard des deux directions:


public class A { 
    private B b; 
    public A(B b){ 
    this.b = b; 
    b.setA(this); // for bi-directional association 
    } 
} 

public class B { 
    private A a; 
    public B(){}; 
    public void setA(A a) { 
    this.a=a; 
    } 
} 
+0

Il était une fois nous avons laissé des notes/commentaires expliquant les raisons d'une downvote ... –

+0

Je veux savoir pourquoi aussi. – Russell

+0

Ce n'est pas un modèle que j'utilise souvent avec une association bidirectionnelle. En fait, j'essaie de l'éviter autant que possible. J'aime que mes cours soient de nature hiérarchique, de sorte que si une classe en connaît une autre, cette classe ne connaît pas la première. J'ai trouvé très peu d'exemples où je dois violer ceci. –