Quelle est la meilleure façon de modéliser de nombreuses relations? P>
permet de dire que nous avons deux classes, J'aime appeler des méthodes comme p>
(ou avoir une autre façon de le faire efficacement) p>
Je peux penser à deux façons de faire cela, mais ils ne ressentent tout simplement pas comme de bonnes patentes de OOP.
Pouvez-vous penser à de bonnes voies, peut-être une patten de design? p>
playex.getteamlist () code> Pour obtenir la liste de toutes les Strong> Équipe Strong> S Il / elle est dans li>
Teamy.getPlayerList () Code> Pour obtenir la liste de tous les lecteurs Strong> S dans l'équipe LI>
ul>
7 Réponses :
C'est bien, lecteur code> a une collection de équipe code> et équipe code> a la collection de lecteur code>. Vous devez faire attention à l'intégrité dans Ajouter / Supprimer des opérations, car ils ne sont pas "atomiques" p>
public class Player
{
public Team[] Teams {get;set;}
}
public class Team
{
public Player[] Players {get;set;}
}
Perfectly reasonable.
Vous négligez le problème réel, qui est la nécessité de garder leur contenu en synchronisation. Une façon de garantir cela est de mettre en œuvre une en termes d'autre.
@rein qui dit que c'est le "vrai problème"? Nous ne pouvons pas dire quel est le problème que si nous savons comment sa demande est écrite. Il ne précisait pas s'ils sont des modèles (drones sans logique bourrés de données et envoyés sur leur chemin) ou des entités (classes qui ont des cadres riches qui supportent le chargement paresseux et d'autres paradigmes de stockage) ou autre chose. Le modèle le plus simple est que ces types soient instanciés par un référentiel ou une couche de stockage de quelque sorte qui est responsable de toutes les opérations qui affectent les équipes et les joueurs.
Il vaut la peine de distinguer la sensation de l'API de la mise en œuvre réelle. p>
Bien que cela ait logique que les deux classes exposent une telle collection (E.G. Get * List ()), ils ne doivent pas nécessairement contenir l'instance de la collection. P>
Je vous suggère de créer une catégorie code> de la ligue code> ou quelque chose de même, qui détient une sorte de dictionnaire de mappages d'équipe de joueurs privés. Ajout de ces «collections» en détail l'instance de l'équipe / du joueur doit appeler des méthodes internes sur l'instance code> de ligue code> pour mettre à jour les mappages. De cette façon, vous gardez des mises à jour Atomic (comme andrey suggérées) et sans erreur. P>
IMHO Ce que vous décrivez est la voie "naturelle" pour OO. Votre xxx.getxxxlist () est l'interface avec vos classes. Et pour un nombre limite de classes qui seraient la bonne façon. p>
Considérez que 1000 classes peuvent être «interconnectées». Il est peut-être intéressant d'avoir une certaine quantité de MANAGEMANAGER à déposer dans un objet, ajoutez un autre objet aux objets associés d'un objet et récupérer la liste de tous les objets relatiqués à un autre. Ce serait une sorte de délégation vs mise en œuvre. p>
Shure Si vous déléguez votre nombre de plusieurs à plusieurs dans un autre exemple, votre modèle d'objet ne reflète plus la relation à plusieurs à plusieurs. P>
La réponse de la volonté est correcte. Cependant, pour traiter de la synchronisation, je commencerais probablement avec Observablecollection . Avoir un côté de la relation soit le "maître" qui garde une trace d'ajouts / supprime de l'autre côté et traite de la synchronisation. P>
Cependant, soyez conscient que si un objet est souscrit à des événements de l'autre qu'il s'agit d'une référence forte qui empêchera la collecte des ordures. Très probablement, ils quitteront la portée en même temps, il s'agit donc d'une non-question, mais c'est quelque chose à conscience de. P>
Hmm ... où avons-nous vu ce problème avant :)
relation entre les joueurs et les équipes forment graphique bipartite strong> .
En attendant des commentaires (et des bowvotes?)! Je suis ood noob.
Vous avez votre -1. C'est vraiment une programmation fonctionnelle masquée comme OOP. Je ne suis pas sûr que le graphique bipartite est même un modèle de conception.
diviser la relation multicolore à deux en deux un à plusieurs. Rend tout beaucoup plus simple. P>