2010-09-27 5 views
1

Не знаю, как лучше это описать. Итак, возьмите этот пример.Справочные петли

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

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

a.refB = b; 

У меня есть предпочтение, что подобное поведение является уродливым. Так что в лучшем случае у меня есть личное несогласие с такого рода кодированием. Вам не нужно иметь эти типы ссылок, и это приводит к тому, что код трудно понять.

Однако, кто-нибудь видит технический штраф за выполнение подобных указаний.

+0

Вы не описали, чего это пытается достичь, поэтому трудно дать какое-либо мнение. – Oded

+1

Я не вижу ничего плохого в такой настройке. Не все отношения сущностей могут быть удобно смоделированы как ациклические графы. – Pointy

ответ

2

Взаимосвязанные ссылки (то, что вы называете опорными циклами) необходимы для некоторых структур данных. У многих деревьев есть ссылки, указывающие от родителя к ребенку и наоборот; у двойных ссылок есть указатель prev и next.

Есть ли у вас конкретная причина, по которой вам это не нравится?

+0

Причина, по которой мне это не нравится, - это методы в начале вызова структур данных из B и наоборот. Таким образом, вместо того, чтобы обрабатывать сам себя и обработку B, вы каждый раз нажимаете на другого, чтобы делать что-то. Это затрудняет отслеживание того, кто что делает. – Drew

+0

Не обязательно. Если вы используете аксессоры и мутаторы (getters & seters), вы можете централизовать доступ к данным A к A и B к B. Вы также можете выполнять проверки в сеттерах, чтобы гарантировать, что данные согласованы. Это очень распространенный способ делать вещи; если вам это не нравится или нахожу это уродливым, вы не будете счастливы как программист. –

+0

Да, я делаю это много, однако код, на который я смотрю, не делает этого. A мутирует b и B мутирует A и, таким образом, вызывает функции для мутации B. Мои обычные методы родительского> дочернего без ребенка, делающего вещи родителям, предотвращают этот код спагетти. – Drew

1

Javascript - динамический язык. То, что вы описываете, добавляя свойство во время выполнения, является функцией в этом случае.

0

Это называется циркулярными ссылками, и в некотором смысле это необходимо или его нельзя избежать. Лучший пример - обычный словарь - где вы объясняете смысл слова другими словами. Или связанные списки.

Так что, основываясь на вашем прецеденте, оно может быть хорошим или злым.

1

Я не думаю, что для эталонного цикла должен быть штраф. В некоторых случаях это тоже необходимо. Напр. клиента и объекта учетной записи. В объекте счёта вы будете иметь ссылку на клиента (одного или нескольких), а у клиента вам потребуется ссылка на счет (опять может быть более одного)

0

Отсутствует штраф за исполнение. Круглые ссылки - это просто указатели друг на друга, а не копии. Как и кто-то другой, иногда необходимо иметь круглые ссылки. Большинство наследственных структур используют круговые ссылки для представления отношений между родителями и детьми. Иногда ребенку необходимо знать родителя, а родитель должен знать ребенка. Это позволяет легко ходить вверх и вниз по иерархической лестнице, так сказать.

Смежные вопросы