Древовидная структура на основе дочерних или родительских элементов

Я разрабатываю класс, который будет использоваться для создания древовидной структуры. Каждый узел дерева должен знать, кто его родитель и кто его дети. Поля, используемые для отслеживания каждого родительского и дочернего узла, недоступны за пределами базового класса узла.

Прямо сейчас у меня есть методы для AddChild и Remove child. Что, следовательно, также устанавливает родительские поля связанных экземпляров.

Теперь мне интересно, будет ли лучше или хуже переключить этот метод и методы настройки, при которых пользователь класса должен вместо этого вызывать методы Node.SetParent (Node parentNode) и Node.ClearParent (Node oldParentNode).

Если вы отслеживаете и родительские, и дочерние отношения, почему вы решили установить дочерние отношения выше родителей или наоборот, или это вообще имеет значение?


person Eric Anastas    schedule 09.06.2009    source источник


Ответы (3)


В любом случае, когда вы присоединяете узел к дереву, вам понадобится ссылка как на родительский, так и на дочерний узел, о котором идет речь, поэтому я не вижу, как это будет иметь значение, поскольку любой способ будет одинаково возможен в все ситуации.

Я бы посоветовал выяснить, в каком направлении ваша логика будет иметь наибольший смысл (то есть легче думать о построении дерева от листьев вверх или от корня вниз) и пойти с этим.

person Sean    schedule 09.06.2009

Подобные решения обычно зависят от того, как будет использоваться класс. Если в типичном сценарии дерево строится от родительского узла вниз, то лучше всего использовать метод AddChild. Если ваши пользователи строят их наоборот, укажите метод SetParent. Если есть необходимость в обоих, реализуйте оба, при условии, что соответствующая бухгалтерия ведется внутри класса.

(примечание: я обычно строю деревья от родителя вниз)

person James Conigliaro    schedule 09.06.2009

Думаю, вам понадобятся все три метода. При построении дерева метод AddChild казался бы более естественным. Есть две причины удалить узел. Один - избавиться от него, а другой - реорганизовать дерево (переместить поддерево в другую ветвь). При удалении RemoveChild работает хорошо. Но при реорганизации можно использовать метод SetParent, чтобы избежать двух вызовов. SetParent также может стать своего рода транзакцией.

person Willem    schedule 09.06.2009