Сигналы вместо исключений

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

Конечно, наиболее очевидной реализацией будет запуск исключения в соответствующей функции (конкретном обработчике событий), чтобы сказать, что действие в данный момент заблокировано. Это похоже на конкретную мою проблему. В этом случае для меня было удобнее вместо того, чтобы выдавать исключение, сделать функцию "безоперационной", но с boost::signal2сигнал. Графический интерфейс делает все, что он хочет, информировать пользователя или что-то еще. Но, возможно, графический интерфейс пользователя хочет сообщить пользователю только один раз, поэтому он просто отключается от сигнала после первого вызова.

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

Теперь возникает вопрос, что если я хочу обобщить метод, заменяющий каждое исключение для сигналов? даже для приложений без графического интерфейса?

В этом случае, являются boost::signals2 более неэффективен, чем исключения? Поскольку распространено мнение, что блоки try / catch, функции no-noexcept и разматывание стека приводят к перегрузкам и позволяют компилятору выполнять много возможных оптимизаций. С другой стороны, boost::signals2 является потокобезопасным, что вызывает дополнительные издержки.

Это моя идея плохая идея вообще?

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

Примечание. GUI - это веб-сайт. Дело в том, что я использую Wt, библиотеку для создания веб-сайтов на C++, которые переводят иерархию виджетов и сигналов в HTML/Javascript/Ajax, и мой долгосрочный проект заключается в создании пакета для создания графических интерфейсов в обоих, настольный / мобильный (Qt) и веб (Javascript) из общей инфраструктуры с уникальным бэкэндом C++. Wt позволяет отображать между слотами C++/Javascript для одного и того же события; например, щелчок: если Javascript или Ajax недоступны, событие отправляется на сервер и вызывается слот C++. Если оно доступно, событие выполняется на клиенте с использованием версии Javascript. В случае, если одно и то же событие (GUI) имеет более одного слота, порядок выполнения слотов не указан, и если оба слота являются вызовами C++, они могут даже выполняться параллельно на сервере, если в пуле потоков достаточно потоков,

0 ответов

Другие вопросы по тегам