Лучшая практика: Добавление дочернего узла к родителю в дочернем конструкторе или нет?

Большая часть вопроса не связана с siteflags .

См. « Написание дополнительных представлений », чтобы получить пример urls.py . Например, это может выглядеть как

path('videos//', views.user_bookmarked_video, name='videos_bookmarked'),

Однако ваш bookmark_id вводит в заблуждение, поскольку это идентификатор видео, а не идентификатор закладки. Более того, ваш вид называется user_bookmarked_video () , но это не то, что он делает - он просто устанавливает флаг (закладку) для некоторого видеообъекта.

Если вы планируете использовать это представление просто для установки закладки, лучше назвать ее как set_video_bookmark () и перенаправить в конце функции вместо рендеринга html.

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

Ваш html может выглядеть так, как вы хотите, в зависимости от того, что вы хотите увидеть. Например:

{{ video.name }}

7
задан Hilbrand Bouwkamp 10 March 2009 в 12:34
поделиться

8 ответов

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

11
ответ дан 6 December 2019 в 12:55
поделиться

Я думаю, что обе реализации в порядке.

Вопрос состоит больше в том, как Вы будете использовать этот класс: Вы создадите список узлов сначала и затем начнете добавлять их отношения, или Вы сделаете это организованным способом, как в Вашем примере?

Второе решение предлагает больше гибкости, также если Вы когда-нибудь хотите использовать Node1 в качестве суперкласса, Вы не связываетесь с подписью конструктора.

1
ответ дан 6 December 2019 в 12:55
поделиться

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

2
ответ дан 6 December 2019 в 12:55
поделиться

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

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

Node2 child = parent.add(new Node2());
1
ответ дан 6 December 2019 в 12:55
поделиться

Я не вижу оснований, почему не объединить два подхода для удобства:

class Node1 {
  public Node1(String name, Node1 parent = null) {
    this.name = name;
    // etc., do initialization

    if(parent != null)
      parent.add(this);
  }

  private void add(Node1 child) {
    child.setParent(this);
    children.add(child);
  }
}

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

1
ответ дан 6 December 2019 в 12:55
поделиться

При получении Узла из класса TreeNode затем, Вы автоматически получаете 2-ю вашу реализацию. Можно добавить "пользовательский" treenode к регулярному классу Treeview.

0
ответ дан 6 December 2019 в 12:55
поделиться

Во-первых плохое в Вашем первом образце: если (родитель! = пустой указатель) {эта проверка необходима, потому что у Вас должен быть шанс создать корень дерева, но параметр с двумя состояниями выглядит ужасным.

Также сначала Ваш образец, не хороший, потому что, делая неявные действия (добавляющий ребенка к переданному родителю).

0
ответ дан 6 December 2019 в 12:55
поделиться

Я предпочел бы реализацию № 1 только, когда абсолютно необходимо иметь родительский узел с дочерним узлом. В этом случае для клиентского кода довольно возможно опустить вызов к Node1.add (ребенок Node1) ведущий к ошибкам позже.

Я предпочел бы реализацию № 2 иначе, потому что это более ясно иметь использование как

Node1 parent = new Node1();
Node1 child = new Node1();
parent.add(child);
0
ответ дан 6 December 2019 в 12:55
поделиться