пятница, 29 мая 2015 г.

[prog.c++11] Пример уменьшения многословности в SObjectizer-5

Одной из главных претензий к SObjectizer всегда была его многословность. Посему в каждом релизе SO-5 этому аспекту мы старались уделять внимание. Продвижение вперед в этом направлении было постоянно, но каких-то кардинальных улучшений никогда не происходило. Была такая тихая ползучая эволюция...

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

Вот пример кода из презентации "What is SObjectizer-5.5" от февраля 2015, как раз после релиза версии 5.5.3:

virtual void so_evt_start() {
   // Child cooperation will use active_obj dispatcher.
   // So pinger and ponger will work on the different
   // working threads.
   so_environment().add_dispatcher_if_not_exists( "active_obj",
      &so_5::disp::active_obj::create_disp );

   // Creation of child cooperation with pinger and ponger.
   auto coop = so_5::rt::create_child_coop(*this"pinger_ponger",
      // active_obj dispatcher will be used as a primary dispatcher
      // for that cooperation.
      so_5::disp::active_obj::create_disp_binder("active_obj") );

   // Filling the child cooperation.
   auto a_pinger = coop->add_agent( new pinger( so_environment(), so_direct_mbox() ) );
   auto a_ponger = coop->add_agent( new ponger( so_environment(), so_direct_mbox() ) );
   a_pinger->set_ponger_mbox( a_ponger->so_direct_mbox() );
   a_ponger->set_pinger_mbox( a_pinger->so_direct_mbox() );

   // Cooperation registration.
   so_environment().register_coop( std::move( coop ) );
   // Limit the pinger/ponger exchange time.
   so_5::send_delayed_to_agent< stop >( *this, std::chrono::seconds( 1 ) );
}

А вот тоже самое, но уже с помощью версии 5.5.5, май 2015:

virtual void so_evt_start() {
   // Creation of child cooperation with pinger and ponger.
   // Child cooperation will use active_obj dispatcher.
   // So pinger and ponger will work on the different
   // working threads.
   so_5::rt::introduce_child_coop( *this"pinger_ponger",
      // active_obj dispatcher will be used as a primary dispatcher
      // for that cooperation.
      so_5::disp::active_obj::create_private_disp()->binder(),
      [=]( so_5::rt::agent_coop_t & coop ) {
         // Filling the child cooperation.
         auto a_pinger = coop.make_agent< pinger >( so_direct_mbox() );
         auto a_ponger = coop.make_agent< ponger >( so_direct_mbox() );
         a_pinger->set_ponger_mbox( a_ponger->so_direct_mbox() );
         a_ponger->set_pinger_mbox( a_pinger->so_direct_mbox() );
      } );

   // Limit the pinger/ponger exchange time.
   so_5::send_delayed_to_agent< stop >( *this, std::chrono::seconds( 1 ) );
}

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

PS. К упрекам в многословности я все еще отношусь довольно болезненно. Хотя уже и начинаю привыкать к ситуации, когда пытаешься выяснить у собеседника, а как бы он видел себе тот или иной фрагмент, но никакого вразумительного ответа не получаешь. Приходится крутить самому :) Пока, вроде бы, получается. Как будет дальше -- посмотрим :)

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