Lien enfant-parent - mauvaise idée?

15

J'ai une situation où mon parent connaît son enfant (duh) mais je veux que l'enfant puisse faire référence au parent. La raison en est que je veux que l'enfant ait la capacité de se désigner comme le plus important ou le moins important quand il en a envie. Lorsque l'enfant fait cela, il le déplace vers le haut ou le bas des enfants du parent.

Dans le passé, j'ai utilisé une propriété WeakReference sur l'enfant pour renvoyer à son parent, mais je pense que cela ajoute une surcharge ennuyeuse, mais c'est peut-être juste la meilleure façon de le faire.

Est-ce juste une mauvaise idée? Comment mettriez-vous en œuvre cette capacité différemment?

Mise à jour 1: ajout de plus de contexte. Il s'agit d'un système de rendu, le conteneur parent est donc une liste de fenêtres regroupées. L'élément enfant (fenêtre) qui dit "Je suis le plus important!" veut essentiellement être affiché en haut du reste des fenêtres.

Le parent est juste un conteneur logique pour regrouper ces enfants. Je peux voir où l'ajout d'un événement pour signaler la demande d'être au sommet est une bonne idée. Mais la mise en œuvre (ce que l'enfant veut faire avec le parent) à part, pourquoi ne voudriez-vous pas que le lien enfant-> parent soit établi? Les listes doublement liées le font pour que les gens puissent aller vers et depuis quelque chose.

Thraka
la source
3
Vous n'en avez pas besoin WeakReference. Le garbage collector .net peut gérer les cycles. Si l'enfant n'est plus utilisé (le parent ne le pointe pas), il sera collecté malgré le fait qu'il contienne une référence au parent.
dbkk
Que se passe-t-il si 2 enfants pensent tous deux qu'ils veulent être les enfants les plus importants?
btilly
@btilly L'enfant le plus important le réorganise juste en haut de la pile dans la liste des enfants des parents. Celui qui le fait en dernier devient donc le plus important. Dans mon scénario, vous n'auriez jamais de conflit du plus important.
Thraka

Réponses:

18

Est-ce juste une mauvaise idée?

Souvent.

  • Il rompt l'encapsulation du parent.
  • Il augmente le couplage dans les deux.
  • Elle sert de point de petits groupes pour l'enfant d'obtenir au reste du système, ce qui augmente le couplage avec quoi que ce soit vaguement près de lui (parce que les gens vont abuser de cette référence)
  • Cela limite votre conception si vous voulez des enfants sans parents.

Comment faire mieux? L'enfant ne doit pas savoir ou se soucier qu'il se trouve dans une collection. Au lieu de se considérer comme important, cela devrait signaler qu'un événement dont il a connaissance s'est produit afin que quiconque s'en soucie (le parent) puisse augmenter sa priorité (ou quelles que soient les règles du contexte dans lequel l'enfant vit). Je ne suis pas ravi de cela et préférerais peut-être une meilleure séparation des préoccupations entre le modèle de l'enfant et le comportement important, mais je ne peux pas élaborer sans plus de contexte.

[Éditer:]

Oui, les systèmes de rendu sont un cas où la propriété parentale ... eh bien je ne veux pas dire est logique, mais c'est un cas où cela a été fait et n'est pas la fin du monde. Pour donner un focus de contrôle, je préférerais toujours la conception où le gestionnaire d'entrée (ou autre) parcourt l'arbre et sait quelle collection réorganiser plutôt que de trouver l'enfant, appelant quelque chose dessus qui sait aller à son parent.

Telastyn
la source
1
C'est une bonne réponse et vous devriez probablement considérer tous les points qu'elle soulève et voir s'ils s'appliquent à votre problème. Cela dit, bien que je ne pense pas que ce soit la fin du monde si vous commencez avec la référence comme une simple mise en œuvre et la remodelez quand / si les choses deviennent incontrôlables.
rperetti
La réponse est juste. Mais si la liaison enfant-parent est une mauvaise idée, la programmation orientée objet n'est plus liée aux objets de la vie réelle. N'y a-t-il aucun moyen d'en faire une bonne chose?
Manoj R
Merci pour cette réponse jusqu'à présent. J'ai ajouté plus de contexte dans ma question d'origine.
Thraka
1
@ManojR - la programmation orientée objet n'a jamais été liée aux objets de la vie réelle.
Telastyn
Votre modification me fait penser au VisualTreeHelper dans WPF \ Silverlight. Cela vous a permis d'interroger sur la relation entre le contrôle actuel et les autres contrôles des systèmes d'interface utilisateur. Je suppose que je pourrais implémenter quelque chose comme ça parce que j'ai aussi un contrôle racine qui hébergera tout le reste. Merci!!
Thraka
0

Comment l'exécution est-elle arrivée au point où l'enfant décide qu'il veut être le plus important? Est-il arrivé par le parent? Si oui, vous pouvez envoyer une référence au parent de cette méthode.

par exemple. si tous les nœuds ont une sorte de méthode update () qui fait quelque chose comme

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

vous pouvez le changer en

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}
user470365
la source
Oui, c'est une excellente façon de le faire. Cependant, dans ma situation, il pourrait être possible que le code logique client ne soit pas initié par la boucle du parent.
Thraka
0

Je ne pense pas que ce soit une mauvaise idée. Vous pouvez résoudre ce problème en ajoutant une valeur d'ordre de tri à chaque enfant. J'imagine quelque chose comme "z-index" utilisé pour afficher des objets l'un sur l'autre ou derrière les autres dans les pages Web.

Je ne sais pas comment vous coderiez quelque chose comme ça, mais le concept semble réalisable.

Michael Riley - AKA Gunny
la source
Avec cette solution, le problème persiste cependant. Cela ne remplace que le concept d'ordre dans le tableau par z-index. Je devrais encore avoir un système de communication de l'enfant au parent. Merci bien :)
Thraka