2010-09-27 8 views
1

Je ne sais pas comment décrire cela. Alors prenez cet exemple.Boucles de référence

var a = { 
    x: 1, 
    y: 2 }; 

var b = { 
    z: 3, 
    refA = a }; 

a.refB = b; 

J'ai une préférence que ce genre de comportement est moche. Donc, au mieux, j'ai un désaccord personnel avec ce genre de codage. Vous ne devriez pas avoir besoin de ces types de références, et cela conduit à un code difficile à comprendre.

Cependant, est-ce que quelqu'un voit une pénalité technique pour faire ce genre de références?

+0

Vous n'avez pas décrit ce que cela tente d'atteindre, il est donc difficile de donner une opinion. – Oded

+1

Je ne vois rien de mal avec une telle configuration. Toutes les relations d'entités ne peuvent pas être commodément modélisées comme des graphes acycliques. – Pointy

Répondre

2

Des références mutuelles (que vous appelez des boucles de référence) sont nécessaires pour certaines structures de données. Beaucoup d'arbres ont des liens pointant de parent à enfant et vice-versa; les listes à lien double ont un pointeur prev et next.

Y at-il une raison particulière pour laquelle vous n'aimez pas cela?

+0

La raison pour laquelle je n'aime pas ça, c'est que les méthodes dans A commencent à appeler des structures de données à partir de B et vice versa. Ainsi, au lieu que A se manipule et que B se gère, vous vous utilisez l'un l'autre pour faire des choses. Cela rend extrêmement difficile de savoir qui fait quoi. – Drew

+0

Pas nécessairement. Si vous utilisez des accesseurs et des mutateurs (getters & setters), vous pouvez centraliser l'accès aux données de A à A et B à B. Vous pouvez également effectuer des vérifications dans les setters pour vous assurer que les données sont cohérentes. C'est une manière extrêmement courante de faire les choses; Si vous ne l'aimez pas ou ne le trouvez pas laid, vous ne serez pas heureux en tant que programmeur. –

+0

Oui, je le fais beaucoup, mais le code que je regarde ne le fait pas. A est en train de muter B et B est en train de muter A et donc d'appeler des fonctions pour muter B. Mes pratiques normales de parent> enfant sans enfant faisant des choses à parent empêche ce code spaghetti. – Drew

1

Javascript est une langue dynamique. Ce que vous décrivez, en ajoutant une propriété à l'exécution, est une fonctionnalité dans ce cas.

0

Ce sont des références circulaires qui sont nécessaires ou inévitables. Le meilleur exemple est un dictionnaire régulier - où vous expliquez la signification d'un mot avec d'autres mots. Ou des listes liées. Donc, en dépenant de votre cas d'utilisation, il peut être bon ou mauvais.

1

Je ne pense pas qu'il devrait y avoir de pénalité pour la boucle de référence. Dans certains cas, cela est également nécessaire. Par exemple objet client et compte. Dans l'objet du compte, vous aurez une référence au client (un ou plusieurs) et dans le client vous avez besoin de référence au compte (encore une fois peut être plus d'un)

0

Il n'y a aucune pénalité de performance. Les références circulaires sont juste des pointeurs les uns aux autres, pas des copies. Comme quelqu'un d'autre mentionné, parfois il est nécessaire d'avoir des références circulaires. La plupart des structures heirchiques utilisent des références circulaires pour représenter les relations parents/enfants. Parfois, l'enfant a besoin de connaître le parent et le parent a besoin de connaître l'enfant. Il est facile de monter et descendre l'échelle hiérarchique pour ainsi dire.