Сигналы вместо исключений
Давайте предположим, что мы разрабатываем магазин, и, в зависимости от состояния сеанса, пользователю разрешено делать разные вещи. Например, предположим, что виджет должен быть заблокирован в течение некоторого времени в определенный момент, потому что некоторые конкретные действия пользователя, и пользователь пытается снова.
Конечно, наиболее очевидной реализацией будет запуск исключения в соответствующей функции (конкретном обработчике событий), чтобы сказать, что действие в данный момент заблокировано. Это похоже на конкретную мою проблему. В этом случае для меня было удобнее вместо того, чтобы выдавать исключение, сделать функцию "безоперационной", но с 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++, они могут даже выполняться параллельно на сервере, если в пуле потоков достаточно потоков,