Дочерняя или родительская древовидная структура - PullRequest
2 голосов
/ 09 июня 2009

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

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

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

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

Ответы [ 3 ]

1 голос
/ 09 июня 2009

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

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

0 голосов
/ 09 июня 2009

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

0 голосов
/ 09 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...