среда, 9 сентября 2015 г.

[prog.sobjectizer] Маленькая, но очень большая фича: сообщения произвольных пользовательских типов

С момента рождения SO-5 и до вчерашнего дня все отсылаемые в SObjectizer-5 сообщения должны были быть наследниками специального базового класса message_t. Даже если в сообщении нужно было передать всего один int, все равно нужно было делать наследника message_t, например, my_int_msg, и передавать этот int внутри экземпляра my_int_msg.

Около года назад, при очередном анонсе SO-5 на каком-то из профильных форумов был большой наезд на нас: мол, что за фигня? В CAF вообще все что угодно пересылать можно, а у вас такие жесткие ограничения. Полагаю, тогда я так и не смог объяснить необходимость наследования от message_t. И, возможно, это требование отвернуло от SO-5 кого-то из потенциальных пользователей. Но все течет, все изменяется...

В разработке сейчас находится версия 5.5.9, в которой со вчерашнего дня стало возможно отсылать в качестве сообщения объект любого типа. Хоть int, хоть std::string, хоть std::vector<std::map<std::string,std::string>> ;)

Честно скажу, никогда не думал, что в SO-5 можно будет писать вот так:

so_5::send_to_agent< int >( *this1 );
so_5::send_to_agent< std::string >( *this"Hello" );

и вот так:

so_default_state()
   .event( [&]( const int & evt ) { ...  } )
   .event( [&]( const std::string & evt ) { ... } );

А вот теперь можно :) Не прошло и года, как говорится. А может и прошло, но это уже неважно.

Фича маленькая, а вот последствия могут оказаться очень серьезными. Есть даже соблазн выкатить версию 5.5.9 с этой фичей прям на этой неделе. Но, думаю, что не нужно частить с релизами. Да и слишком частое общение с неадекватами на профильных форумах есть хорошо :). Имеет смысл набраться терпения, воплотить в жизнь еще несколько хотелок и выпустить 5.5.9 где-то в конце октября.


Немного технических деталей.

Сам message_t никуда не исчез. По-прежнему, пересылать можно только экземпляры message_t. Но появился шаблон user_type_message_t<T>, внутри которого и передается объект пользовательского типа.

Так что принцип работы остался прежним, но за счет небольшой шаблонной магии теперь пользователь может вызвать send<T>(), а SO-5 сам сконструирует и отошлет экземпляр user_type_message_t<T>. Аналогично при обработки сообщения: из очереди извлекается экземпляр user_type_message_t<T>, но той же самой шаблонной магией выполняется вызов обработчика формата event_handler(const T&).

Нельзя только обрабатывать сообщения пользовательских типов обработчиками формата event_handler(const event_data_t<T>&). Зато можно сделать вот так:

void evt_one( const so_5::rt::event_data_t< so_5::rt::user_type_message_t< std::string > > & evt )
{
   m_m2->deliver_message( evt.make_reference() );
}

В общем, прогресс не стоит на месте. Работа с SO-5 становится все удобнее и удобнее и мы не собираемся останавливаться на достигнутом ;)

PS. C++11 реально рулит и бибикает. Совсем другой язык. Совсем другие возможности и ощущения.

Комментариев нет: