今日のGUIツールキットの大部分は、Signals + Slotsモデルを使用しています。それを開拓したのは、QtとGTK +でした。
ご存知のとおり、ウィジェットまたはグラフィカルオブジェクト(表示されないものも含まれます)は、メインループハンドラーにsignalsを送信します。次に、メインループハンドラーは、そのウィジェット/グラフィカルオブジェクトに割り当てられたevents、callbacksまたはslotsを呼び出します。通常、既定の(そしてほとんどの場合virtual
)イベントハンドラーは、すべての事前定義された信号を処理するためにツールキットによって既に提供されています。したがって、開発者がメインループとハンドラー全体を記述しなければならなかった以前の設計とは異なります。 WINAPIなどのすべてのメッセージについて、開発者は新機能を実装するために必要な信号について心配するだけで済みます。
現在、このデザインは、私の知る限り、ほとんどの最新のツールキットで使用されています。 Qt、GTK +、FLTKなどがあります。JavaSwing。C#にも言語機能(イベントとデリゲート)があり、この設計でWindowsフォームが開発されています。実際には、過去10年間で、このGUIプログラミングの設計は、生産性を向上させ、より優れた抽象化を提供するため、一種の未記述の標準になりました。
しかし、私の質問は:
現代のGUIプログラミングにとって並列または実用的な代替設計はありますか?
つまり、Signals + Slotsデザインは、町で唯一の実用的なデザインですか? その他の設計でGUIプログラミングを実行することは可能ですか?代替設計に基づいて構築された最新の(できれば成功し、人気のある)GUIツールキットはありますか?
私はそれをすべてと呼ぶことはしませんが人気がありますが、特にGUIには 反応型プログラミング が常にあります 関数型リアクティブプログラミング 。たとえば、 。NET Rx Framework や、いくつかのツールキットによって実装されています。 reactive-banana や FrTime などの難解な言語/プラットフォーム Haskell および Racket それぞれ。
それは私のお気に入りのテーマであり、約10年間(70年代から86年間)、イベントに応答するオブジェクトで構成されるGUIを持つことは、それを行うための正しい方法だと思いました。
それから私はそれを行う別の方法につまずきました ここに説明されています とsourceforgeプロジェクト こちら 。
簡単に言えば、オブジェクトの問題はオブジェクトが存続することであり、オブジェクトを作成するためのコードを記述した場合、変更が必要な場合はオブジェクトを段階的に変更するコードを記述し、何らかの方法でオブジェクトとの間でメッセージをやり取りする必要があります。必要なものだけをペイントし、別のものが必要な場合は再ペイントでき、以前のオブジェクトの永続性について心配する必要がない場合は、すばらしいと思いませんか?メッセージ処理のコードをすべて記述する必要がなかったとしても、それはすべて内部で行われるので、すばらしいことではないでしょうか。
それがそのパッケージが行うことです。単純なダイアログの場合、コードの桁数を節約できます。動的に変化する複雑なダイアログの場合、それが可能になります。
追伸これはデスクトップUIとリモートターミナルUIに対してのみ行ったもので、WebブラウザーUIに対しては行っていません。それは可能だと確信していますが、私はそれを試す機会がありませんでした。
これには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とドメイン/アプリケーションロジックの間にアダプターを実装します。
いくつかのコントロールタイプシステムはデータベースアプローチを使用しています。各GUIコントロールはデータベースに保存されているファイルにリンクされているため、Guiは常にデータベースの状態を反映しています。 DBフックは、値が変更されたときに関数をトリガーするために使用されます。