ストアを開発しているとしましょう。セッションの状態に応じて、ユーザーはさまざまなことを行うことができます。たとえば、ある特定の瞬間にウィジェットをブロックする必要があるとします。これは、特定のユーザー アクションが原因で、ユーザーが再試行したためです。
もちろん、最も明白な実装は、アクションが現在ブロックされていることを示すために、対応する関数 (特定のイベント ハンドラー) で例外を起動することです。それは私の具体的な問題に似ています。その場合、例外をスローする代わりに、関数を「ノーオペレーション」にして、 のシグナルを発行する方が便利でしたboost::signal2
。GUI は、彼がやりたいこと、ユーザーに通知することなど何でも行います。しかし、おそらく GUI はユーザーに 1 回だけ通知する必要があるため、最初の呼び出しの後でシグナルを切断するだけです。
そして、私はそれが好きでした。それは非常に美しくエレガントです: 操作を行わずにシグナルを発することです。スタックの巻き戻しはありません。関数は noexcept としてマークできます。その結果、より多くの最適化を有効にし、必要な場合にのみ例外的なケースに対処し、必要に応じてシグナルに接続および切断します。
ここで、各例外をシグナルに置き換えてメソッドを一般化したい場合はどうすればよいでしょうか? 非 GUI アプリケーションでも?
その場合、boost::signals2
例外より非効率ですか?try/catch ブロック、no-noexcept 関数、およびスタックの巻き戻しがオーバーヘッドを引き起こし、コンパイラが可能な多くの最適化を回避するというのはよく耳にすることです。一方、boost::signals2
はスレッドセーフであるため、余分なオーバーヘッドが発生します。
私の考えはまったく悪い考えですか?
結局のところ、設計(および最適化)の問題であるため、私の質問が「広すぎる」または「意見に基づく」ものではないことを願っています。あまり具体的ではありませんが、認めざるを得ません。
ノート:GUI は Web サイトです。問題は、ウィジェットとシグナルの階層を HTML/Javascript/Ajax に変換する C++ で Web サイトを作成するためのライブラリである Wt を使用していることです。私の長期的なプロジェクトは、両方で GUI を作成するためのスイートを作成することです。デスクトップ/モバイル (Qt) および Web (Javascript) を、独自の C++ バックエンドを備えた共通のインフラストラクチャから。wt は、同じイベントの C++/Javascript スロット間のマッピングを可能にします。たとえば、クリック: Javascript または Ajax が使用できない場合、イベントがサーバーに送信され、C++ スロットが呼び出されます。利用可能な場合、イベントは Javascript バージョンを使用してクライアントで実行されます。同じ (GUI) イベントに複数のスロットがある場合、スロットの実行順序は指定されず、両方のスロットが C++ 呼び出しである場合、スレッド プールに十分なスレッドがあれば、サーバー上で並列に実行することさえできます。 .