четверг, 21 июля 2016 г.

[prog.thoughts] ...такое впечатление, что асинхронность на коллбэках может быть сильно разной...

Рассказывая на публике об акторах вообще и о SObjectizer в частности, довольно часто сталкиваешься со мнением, что асинхронность на коллбэках -- это не есть хорошо. Мол, код быстро превращается в лапшу, разобраться в которой бывает непросто. Это меня всегда несколько удивляло, т.к. события у SObjectizer-овских агентов -- это те самые асинхронные коллбэки, но особых проблем с превращением агентов в лапшеподобный код не замечалось.

А вот сейчас плотно столкнулся с Asio и, похоже, стал понимать, о чем именно речь. Когда дергаешь async_connect и вешаешь на него один коллбэк, затем из этого коллбэка дергаешь async_write со вторым коллбэком, из которого дергается async_read с третьим коллбэк-ом... И все эти взаимосвязи можно проследить только в местах вызова async_* методов... Да, становится понятно о какой лапше из коллбэков говорят люди.

Видимо, мы в SObjectizer-е с такими вещами особо не сталкиваемся, т.к. операция подписки агента, как правило, выполняется всего в одном месте (либо в конструкторе агента, либо в методе so_define_agent). Из-за чего разобраться во взаимосвязях событий и сообщений оказываться проще, чем в случае с разбросанным по всему коду вызовами async_*. Да и привязка событий к состояниям так же улучшает восприятие логики работы агента.

Вроде мелочь, а приятно. Впрочем, поработаю с Asio еще, посмотрю, не поменяется ли мнение :)

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