GUIプログラミングの信号+スロットモデルの実用的な代替手段はありますか?


9

今日のGUIツールキットの大部分は、Signals + Slotsモデルを使用しています。それを開拓したのは、QtとGTK +でした。

ご存知のように、ウィジェットまたはグラフィカルオブジェクト(場合によっては表示されないものも)がメインループハンドラーに信号を送信します。次に、メインループハンドラーは、そのウィジェット/グラフィカルオブジェクトに割り当てられたイベントコールバック、またはスロットを呼び出します。通常、virtualすべての事前定義された信号を処理するために、ツールキットによってすでに提供されているデフォルト(およびほとんどの場合)のイベントハンドラーがあります。そのため、開発者がすべてのメッセージに対してメインループ全体とハンドラー全体を記述する必要がありました。 (WINAPIを考えてください)、開発者は新機能を実装するために必要な信号についてのみ心配する必要があります。

現在、私が知る限り、このデザインはほとんどの最新のツールキットで使用されています。Qt、GTK +、FLTKなどがあります。JavaSwingがあります。C#には言語機能(イベントとデリゲート)さえあり、Windowsフォームはこの設計で開発されました。実際、過去10年間で、このGUIプログラミングの設計は、一種の未記述の標準になりました。それは生産性を高め、より優れた抽象化を提供するためです。

しかし、私の質問は:

現代のGUIプログラミングにとって並列または実用的な代替設計はありますか?

つまり、Signals + Slotsデザインは、町で唯一の実用的なデザインですか?他のデザインでGUIプログラミングを実行することは可能ですか?代替設計に基づいて構築された最新の(できれば成功し、人気のある)GUIツールキットはありますか?


Windows APIにあるメッセージキューパラダイム、イベントやデリゲートとは異なります。デリゲートは、非同期シグナルstd::functionはなく、のように同期してすぐに呼び出されます。さらに、WinAPI DefWindowProc、デフォルトの実装としてWindowsメッセージを処理する機能を提供します。だから私はあなたの質問が欠陥のあるロジックに基づいていると仮定します。
DeadMG

2
QTとGTK +は、イベントドリブンアプローチを使用していた最初のGUIフレームワークとはほど遠いものです。コンセプトはSmalltalk-80(en.wikipedia.org/wiki/Smalltalk)にまで及びます。
Doc Brown

興味深い質問ですが、このモデルがマルチタッチインターフェイスで大きく変わるかどうか知りたいです。
Ben DeMott

私は寛大で、彼がPostMessageだけでなく、同期しているSendMessageを知っていると思います。ただし、すべてのメッセージに対してメッセージ処理ループ全体を記述する必要がなかったという点で、彼はまだ間違っています。
gbjbaanb

JavaFxは、バインディングAPIを通じて同様のメカニズムを提供します。
Eng.Fouad 2016年

回答:



5

これは私のお気に入りのテーマであり、約10年間(70年代から86年間)、イベントに応答するオブジェクトで構成されるGUIを持つことは、それを行うための正しい方法だと思いました。

それから私はここ説明されているそれを行う別の方法に出くわしました、そしてここに sourceforgeプロジェクトがありました

簡単に言えば、オブジェクトの問題はオブジェクトが存続することであり、オブジェクトを作成するコードを作成する場合、変更が必要な場合にオブジェクトを段階的に変更するコードを作成し、何らかの方法でオブジェクトとの間でメッセージを取得する必要があります。必要なものだけをペイントし、別のものが必要な場合は再ペイントでき、以前のオブジェクトの永続性について心配する必要がないとしたら、すばらしいと思いませんか。メッセージ処理のためのコードを記述する必要がまったくなかったとしたら、それはすべて内部で行われるので、すばらしいことではないでしょうか。

それがそのパッケージが行うことです。単純なダイアログの場合、コードを大幅に節約できます。動的に変化する複雑なダイアログの場合、それが可能になります。

PS私はこれをデスクトップUIとリモートターミナルUIに対してのみ行っており、WebブラウザーUIに対しては行っていません。それは可能だと確信していますが、試す機会がありませんでした。


+1、しかし、ユーザー定義の入力などの追加機能を実現するにはどうすればよいですか?
ApprenticeHacker 2012

@IntermediateHacker:ユーザー定義の入力の意味がわかりません。フォームデザイナーアプリを持っているということですか?
Mike Dunlavey、2012

2

これには2つの方法があります。

  1. すべてのウィジェットがきめ細かいサブスクライブメカニズム(シグナル/スロット、オブザーバー/オブザーバブル、イベント/デリゲート)を公開し、クライアントコードがサブスクライブしてそれに応じてアクションを実行するようにします。
  2. ウィジェットが提示するデータの抽象化に対してウィジェットを構築し、クライアントコードにその抽象化を実装させます。

2番目のアプローチの例を次に示します。

interface Action {
     void execute();
     Bool isEnabled();
     Null<String> description();//used for tooltip
}
interface LabledAction extends Action {
     String getName();
}

そして今、あなたはLabelButtonに対してを構築できLabledAction、クライアントコードはそれを実装するか、利用可能で適切であれば、いくつかの一般的なデフォルト実装を使用できます。

ある意味で、2番目のアプローチは柔軟性が低く、より厳格です。どういうわけか、比較的アトミックな方法でビューとモデルを結び付けるだけではありません。要件に基づいて適切なGUIを設計し、そのGUIとドメイン/アプリケーションロジックの間にアダプターを実装します。


モデル/ビュー/コントローラーは優れていますが、コントローラーパーツはウィジェットのオブザーバーであり、モデルパーツではウィジェットはモデルのオブザーバーであるため、それは他の方法でも同じメカニズムです。 。
Jan Hudec、2012

1

いくつかのコントロールタイプシステムはデータベースアプローチを使用しています。各GUIコントロールはデータベースに保存されているファイルにリンクされているため、Guiは常にデータベースの状態を反映しています。DBフックは、値が変更されたときに関数をトリガーするために使用されます。


4
これはまだ追加のDBレイヤーがあるだけの信号スロットではありませんか?
ラチェットフリーク、

最終的には、すべての割り込みまたはコールバックの下にあります-それらは唯一の低レベルの非同期操作です
Martin Beckett
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.