Рейтинг:6

Является ли плохой практикой использовать один и тот же хук дважды?

флаг jp

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

  • Плохая ли производительность, если этот хук вызывается несколько раз из разных модулей?
  • Поскольку такой способ работы увеличивает количество пользовательских модулей, влияет ли количество модулей на производительность сайта или только код внутри может вызывать проблемы с производительностью?
Рейтинг:4
флаг cn

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

Влияние вызова хука на производительность минимально; большее влияние на производительность будет иметь любой код, который запускает хук.

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

Доказательства: при переходе от Drupal 7 к Drupal 8/9 многие основные модули Drupal перешли от «минимизации количества модулей» к «предоставлению гораздо большего количества модулей, специфичных для функций, которые можно активировать по мере необходимости»:

  • AdvAgg
  • коммерция
  • Метатег
  • Веб-форма

TLDR: Фактический код, который вы запускаете в хуках/модулях, намного важнее для производительности, чем тот факт, что вы вызываете хуки несколько раз в модулях.

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

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

Joost avatar
флаг jp
Спасибо за развернутый ответ, очень понятно и полезно
Рейтинг:3
флаг us

Количество установленных модулей может влиять на производительность. Вот почему, например, ядро ​​Drupal хранит в кеше названия реализованных хуков.
Учитывая то, что делает ядро ​​Drupal, увеличение количества установленных модулей окажет меньшее влияние на производительность.

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

Для примера вместо Узел и Пользователь модули, может быть один модуль (называемый, например, Базовый контент). Поскольку эти модули обычно требуются из профиля установки, это уменьшит количество установленных модулей. Это также может уменьшить количество реализованных хуков, поскольку (например) node_user_predelete() может быть объединен с методом класса или другой функцией.
В любом случае, при этом два модуля с разными целями будут объединены; хуков можно было бы уменьшить, но в некоторых случаях теперь код должен сначала проверять выполнение некоторых условий; вероятно, больше сервисов должно быть лениво загружено, что означает, что будет два класса вместо одного (прокси-класс и класс, реализующий сервис). Эти классы должны быть синхронизированы друг с другом: любое изменение в классе обслуживания должно быть сделано и в прокси-классе. (Для этого есть скрипт, но он работает только с установленными модулями, а это значит, что разработчику понадобится локальный сервер с Drupal, и он не забудет запустить скрипт для каждой лениво загруженной службы.)

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

Ответить или комментировать

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