Я разбиваю обработчики по модулям, каждый модуль отвечает за свой state. Считаю это более практичным, нежели разбивать по веткам диалогов. Стейты меняются гораздо реже, чем кнопки и схема движения диалога, поэтому вот так. Условно, на стейте какого-нибудь
а б с т р а к т н о г оприёма данных, я размещаю обработчики, связанные с процессингом событий именно по этой ветви ожидания. То есть обработка корректного значения, некорректного значения, может быть кнопки отмены, или особое поведение для /start.
Совсем легковесный пример в моем oupensorse:
https://github.com/Abstract-X/teleclean_bot/tree/master/app/handlersНа этой неделе выходит statya, связанная с архитектурными моментами, держу в курсе