so-5-5 icon indicating copy to clipboard operation
so-5-5 copied to clipboard

[en/ru] Event-handlers formats for SObjectizer-5.6

Open eao197 opened this issue 6 years ago • 8 comments

There is a topic in development of SObjectizer-5.6 where some feedback from SObjectizer's users (or just watchers) are required. I described this topic in a post in SObjectizer's Google group: Event-handler formats in SObjectizer-5.6. Please share you option if you have a time/desire. As reply in the Google group or even here.


При разработке SObjectizer-5.6 возникла тема, по которой хотелось бы получить обратную связь от пользователей SObjectizer-а или просто интересующихся. Тема описана в SObjectizer-овской Google-группе: Форматы обработчиков сообщений в SObjectizer-5.6. Пожалуйста, поделитесь своими соображениями, если у вас найдется время и желание. В виде ответа в Google-группе или прямо здесь.

eao197 avatar Feb 12 '19 13:02 eao197

Я хоть и не давно испольюзую (точнее пытаюсь использовать) для side-projects, но по-мне так оба варианта равнозначны:

(1)
ret_value handler(mhood_t<Msg_Type>);
ret_value handler(const mhood_t<Msg_Type>&);

(2)
ret_value handler(Msg_Type);
ret_value handler(const Msg_Type &); 

Вариант (1), правда, выглядет более общим для будущего расширения, в том смысле, что ещё можно SO-специфичную (или даже app-специфичную) служебную информацию прикрутить, например, конверт (Envelope), дату отправления/отправителя и т.п. Поэтому голосую за 1-й вариант.

basiliscos avatar Apr 02 '19 18:04 basiliscos

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

Удален только такой вариант:

ret_code handler();

который в SO-5.5 используется для обработчиков сигналов.

eao197 avatar Apr 02 '19 19:04 eao197

Понимаю, что это немного "некропостинг", но все же интересно, а какой тогда вообще смысл в сигналах? Если их использование теперь ничем не отличается от использования сообщений.

zumm avatar Jun 19 '20 14:06 zumm

Отсылка сигналов "дешевле", т.к. в случае отсылки сообщения пользовательского типа, который не наследуется от message_t, все равно под капотом создается динамический объект, который все-таки производен от message_t. Даже если пользовательский тип пустой.

А вот при отсылке сигнала ничего подобного нет, в SObjectizer-е вместо сигналов идет доставка nullptr-а.

Поскольку динамическая аллокация -- это дорогая операция, то когда данные переноситься не должны, то дешевле отсылать сигналы.

PS. Хорошие вопросы не могут быть некропостингом :)

eao197 avatar Jun 19 '20 15:06 eao197

Правильно я понимаю, что метод, подписанный на сигнал, получит экземпляр mhood_t "внутри" которого nullptr?

До этого, активно используя синтаксис void handler();, я не задумывался об этом, считая, что при сигналах никакого mhood_t не существует.

zumm avatar Jun 19 '20 15:06 zumm

В случае сигнала будет mhood_t внутри которого вообще ничего нет: https://github.com/Stiffstream/sobjectizer/blob/v.5.7.0.1/dev/so_5/mhood.hpp#L223-L231

eao197 avatar Jun 19 '20 16:06 eao197

Выходит именно этим обусловлена невозможность использовать короткую запись (ret_value handler(const Msg_Type &)) для сигналов.

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

Спасибо за ответы!

zumm avatar Jun 19 '20 16:06 zumm

Скорее это последствия эволюции SObjectizer-а. Начиная с 2002-го года :)

Первоначально все event-handler-ы принимали сообщения по указателю. И эти указатели могли быть нулевыми.

Затем захотелось упросить ситуации, когда указатель в принципе не должен был быть нулевым. Так появились обработчики, которые принимали сообщение по ссылке. Это все еще в SO-4 происходило.

Потом этот опыт перешел в SO-5. Но когда в SO-5 появились сигналы, то пришлось вводить дополнительные форматы обработчиков (т.е. ret_value handler()).

Но потом выяснилось, что обработчики такого формата не очень дружат с шаблонами. И появился mhood_t.

А потом пришел дворник и всех разогнал :) Т.е. стало понятно, что форматов ну очень уж много. И от обработчиков вида ret_value handler() отказались. Еще и потому, что после удаления синхронного взаимодействия из ядра SObjectizer-а в качестве ret_value мог быть только void.

eao197 avatar Jun 19 '20 17:06 eao197