Вам, на рассмотрение, предлагаю две конфигурации: !TestHooker c классом-перехватчиком (в двух вариантах: сам по себе и базовый-наследник), который сам управляет передачей событий другим классам-перехватчикам и !TestHookerПодписка с подпиской на события.
Предупреждаю сразу: классы с подпиской даны не в полном объеме и не со всеми возможностями, а только как пример, для понимания процесса подписки.
Сравниваем классы (варианты перехвата):
1) класс-перехватчик, который сам передает события другим перехватчикам (далее
Одиночка: почему так назвал - не знаю) посредством Перехватчик.ВыполнитьСобытиеГК(ПредПерехватчик, ГрупповойКонтекст, ИмяСобытия, <параметры>) и на его плечи ложиться забота о всех событиях, которые могут возникнуть на форме;
2) базовый класс (далее
БазовыйПерехватчик), который работает аналогично Одиночке, но от него плодим Наследников (далее
НаследникПерехватчик), которые не заботятся о передаче событий другим классам-перехватчикам, т.е. упрощается реализация класса;
3) вариант подписки: создаем глобальный класс перехвата ГМ (далее
ПерехватчикГМ), который создает один класс-перехватчик на форму (далее
ПодпискаБазовый) или наследника от него (далее
ПодпискаНаследник), а другие классы, создаваемые в этой форме подписываются на события формы с помощью глобальной процедуры (для примера класса-подписчика использовал
КлассПодписчикБезПрехватчика).
По, мной проведенным тестам, привожу на ваш суд статистику с комментариями. Тест проводился на релизах 1срр:
2.5.0.5, 2.5.0.6, 3.0.1.12; 1С
27-й релиз; создавалось
300 классов (т.к. классы пустые и выполняются быстро, и оценивается их работа, а не содержание, то пришлось давить количеством).НЕ УТВЕРЖДАЮ, что абсолютно прав (в написанном коде), но, с моими познаниями программирования
, могу объективно сказать следующее.
Скорость (пункт - это, соответственно, место; первое - самый быстрый вариант):
1) Одиночка: 6-7 мс
2) ПодпискаНаследник: 8-9 мс (странно, но ПодпискаБазовый: 11-12 мс! это вопрос тебе, Артур)
3) НаследникПерехватчик: 15-18 мс
Инициализация (создание классов, желающих получать события формы):
точного замера не делал, но визуально видно
1) КлассПодписчикБезПрехватчика с последующей подпиской - доля секунды
2) Одиночка и НаследникПерехватчик - около секунды
Память (в смысле первое место - меньше памяти):
1) КлассПодписчикБезПрехватчика
2) Одиночка и НаследникПерехватчик
Использование (в смысле, читабельность и, соответственно, повторяемость кода):
1) КлассПодписчикБезПрехватчика (с подпиской): не заботимся об описании всех событий формы, не вызываем базовый класс или пред.перехватчик - только код реализации. И еще быстрый выход из цепочки обработки события, т.е., например, если класс обрабатывает определенный реквизит формы, то после того, как он сделал свое дело, возвращает 0 и вся цепочка события завершает свою работу, а не идет по стеку через все перехватчики формы (я понятно изложил?).
2) НаследникПерехватчик: не заботимся об описании всех событий формы, но не забываем о вызове базового класса (если необходимо)
3) Одиночка: заботимся об описании всех событий формы, вызываем пред.перехватчик
Обратная совместимость:
(Артур, не кричи - ну помешан я на обратной совместимости (о чем аргументированно ответил раньше)!)1) Подписка: работает на всех релизах 1срр, где есть Перехватчик, и со всеми классами, т.е. сам класс перехватывает форму (релизы где-то после 05.06.08) или подписывается на них
2) НаследникПерехватчик и Одиночка: только на релизах, где-то после 05.06.08
Из всего вышесказанного могу, для себя, сделать вывод, что Подписка рулит практически по всем пунктам (кроме скорости
)!
Одно из главных преимуществ - читабельность кода. Мои классы, после переделки на подписку, "усохли" в 3-10 раз, а понимание кода, особенно давно сделанного и уже забытого, стало выше, чем когда писал раньше (нашел кучу тараканов
). Лично я, буду пользоваться только подпиской, чего и вам желаю.
На втором месте НаследникПерехватчик, но не работает на ранних релизах.
Ну и в конце паровоза: Одиночка - лёгенький гемор.
Выводов (для тех, кто считает не в пользу подписки) делать не буду, дабы не обидеть программеров и не наступить на больной мозоль
Решайте сами, тесты прилагаются, думайте. Может найдете в моем коде о-о-очень большую ошибку - критика приветствуется, и даже очень!
Еще раз повторюсь: классы с подпиской даны не в полном объеме и не со всеми возможностями, а только как пример, для понимания процесса подписки.
Прав некто (не буду говорить кто), когда кричит: "Тест давай!" (ленивый, наверное, сам писать
), но благодаря написанию этих кратких конфигураций нашел еще несколько подводных камней, в плане скорости и использования памяти.
Поэтому полный код подписки выкладывать сейчас не хочу, пока не найду всех тараканов и не проверю в боевых условиях.
Всем удачи, жду вопросов/критики/отзывов (только не плеваться, а аргументированно)