Qtのメタオブジェクトシステム(メタオブジェクト)モック用(III)、なぜQtのシグナルとスロット

なぜQtのシグナルとスロットのためMOCでしょうか?

  テンプレートは、コンパイラは、渡されたパラメータの種類に応じて、動的にコードを生成することを可能にするC ++機構に内蔵されています。したがって、テンプレートのフレームワークを作成するために人々のために私たちはQtのの多くの部分で高度なテンプレートを使用し、非常に興味深いです。あなたは簡単に特定のコンテンツを表現するために、テンプレートを使用することができますが、一部のコンテンツは、テンプレートで表現することはできません。しかし、そこにいくつかの制限があります。ジェネリックコンテナクラスベクトルは、ポインタ型部分的な特殊化を必要としても、容易に表され、文字列の所与のXMLベースのグラフィカルユーザーインターフェース提供される機能の説明は、テンプレートを表すために使用することができません。そして、それらの間のグレーゾーンインチ あなたは、コードサイズ、読みやすさ、移植性、可用性、拡張性、堅牢性、および最終的なデザイン美学を犠牲にして、当然のことながら、いくつかのことを変更するために、テンプレートを使用することができます。テンプレートとCプリプロセッサは、信じられないほどの知性と信じられないほどのものを達成するために拡張することができます。これらの事を行うことができるだけので、しかし、それは必ずしも彼らが正しい設計上の選択であるという意味ではありません。残念ながら、コードが本に出版されるべきではなく、本当のコンパイラを使用することは、現実世界のオペレーティングシステム上でコンパイルします。
ここではQtのMOCを使用するには、いくつかの理由があります:

文法の重要性

  文法はただお菓子ではありません。私たちのアルゴリズムを表現するために使用される構文は大幅にコードの可読性と保守性に影響を与えることができます。Qtのシグナルとスロットのための構文は、実際には非常に成功を収めました。、直感的な使いやすく、読みやすい構文。Qtの研究では、それらを助ける人々は構文を理解し、シグナルとスロットを使用することがわかった - それは抽象化と一般性の高いレベルを持っているにもかかわらず。これは、最初から、プログラマでもデザインパターンを考慮せずに、どのように設計するかを知っているのに役立ちます。

グッド使用コードジェネレータ

  QtのMOC(MOC)は、言語能力を超越コンパイルする簡単な方法を提供します。これは、C ++コンパイラによって追加のC ++コードをコンパイルされた基準を生成することによって達成することができます。MOCは、C ++ソースファイルを読み込みます。それはクラス宣言を含む1つのまたは複数のマクロQ_OBJECTを見つけた場合、それは、クラスのメタオブジェクトコードを含む別のC ++ソースファイルを生成します。MOC C ++のソースファイルによって生成されたがコンパイルされたクラスの実現とリンク(あるいは、それは、クラスのソースファイルをインクルードすることができる)する必要があります。通常、手動で呼び出すよりもMOCが、プログラマは余分な作業を必要としないので、ビルドシステムによって自動的に呼び出さ。
  MOCは、コードジェネレータのQtの使用のみではありません。もう一つの顕著な例は、UIC(UIコンパイラ)です。それに格納されたXMLユーザインタフェース記述情報を受け付け、インターフェイスを設定するC ++コードを作成します。また、Qtのでは、コードジェネレータも共通しています。RPCとIDLの例と、それはプログラムやオブジェクト、プロセスまたはマシンの境界を介して通信することができます。lexとyaccのは、最もよく知られている特徴のスキャナとパーサジェネレータのか、様々な。彼らは、状態マシンの入力と生成コードとして仕様を構文。あるいは、コード生成器は、一方向ダイアログまたはウィザード、ウィザードダイアログボックスまたは設計時ではなく、コンパイルされたコードを含むコンパイラ、独自のプログラミング言語またはグラフィカルツールは、ぼやけてハッキングされます。当社の顧客は、独自のC ++コンパイラまたは特定の統合開発環境でロックされませんが、彼らは好みのツールを使用することを可能にします。UNIXの精神に沿って、より多くの、より明確に、より安全な:私たちは、むしろ生成されたソースコードリポジトリにコーディングするプログラマを強制するよりも、私たちのツールで自分のビルドシステムに追加することを奨励します。

GUIは動的です

  C ++は、標準化された強力な、よく設計された普遍的な言語です。これは、通常のデスクトップアプリケーションにオペレーティングシステム全体から様々なアプリケーションをカバーするソフトウェアプロジェクト、データベースサーバ、ハイエンドのグラフィックス・アプリケーションのような広い範囲で使用される唯一の言語です。まだANSI Cとの互換性を維持しながら、C ++言語の成功への一つの鍵は、最大のパフォーマンスと最小のメモリ消費量に焦点を当て、そのスケーラブルな設計であります
  これらの利点にもかかわらず、いくつかの欠点があります。C ++のために、目標Cの動的メッセージング方法のコンポーネントベースのプログラミングのグラフィカル・ユーザ・インターフェースに言及する場合、静的オブジェクト・モデル明らかに助長しません ハイエンド・データベース・サーバーまたはオペレーティングシステムは、必ずしも右のデザインの選択は、フロントエンドのGUI良いことではありません。MOCを使用して、我々は利点にこの欠点を持っており、必要な安全で効率的なグラフィカル・ユーザー・インターフェースのプログラミングの課題に対応するための柔軟性を増加させました。
  我々のアプローチは、はるかにあなたがテンプレートを使用して何かできることを超えました。例えば、我々は、オブジェクトのプロパティを持つことができます。我々はまた、シグナルとスロットをオーバーロードすることができ、私たちの信号は、我々はバイナリ互換性を壊すことなく、新たな信号を追加できることを意味し、ゼロバイトのサイズクラスのインスタンスに追加されます。
  もう一つの利点は、我々は、実行時のシグナルとスロットでオブジェクトを探索することができますということです。私たちは、接続されているオブジェクトの正確な型を知らなくても、接続を確立するために、名前でタイプセーフなコールを使用することができます。テンプレートベースのソリューションはできません。この実行時イントロスペクションは、このようなのQt DesignerのXML UIファイルから生成とGUI接続などの新たな可能性を、開きます。

コールのパフォーマンスがすべてではありません

  Qtのシグナルとスロットの実装はとても高速なソリューションテンプレートをベースとされていません。4つの通常の関数呼び出しのオーバーヘッドに関するコストを達成するための信号を送信するために、共通のテンプレートを使用するが、しかし、必要な作業量は10回のQtの関数呼び出しと同等です。Qtの機構が共通のハタ、イントロスペクション、異なるスレッド、ならびに最終的なスクリプト機能との間のキューイングコールを含むので、これは驚くべきことではありません。それはあまりにも多くのインライン展開、およびコードに依存し、比類のない安全性のランタイムを提供しません。Qtのイテレータは安全であり、そしてテンプレートに基づくものより高速なシステムではありません。複数の受信機に信号を送信する過程において、受信機はまた、クラッシュを引き起こすことなく安全に除去することができます。このセキュリティがなければ、アプリケーションは最終的に崩壊する、メモリの読み取りまたは書き込みエラーがデバッグが困難表示されます。
  Qtは本当にスロットのコストのほんの一部をオーバーヘッドタンクの少量を呼び出すことにより、信号のコストに追加されますが、コール全体のコストがしかし、テンプレートベースのソリューションは?シグナルとスロット行いを使用してアプリケーションのパフォーマンスを向上させることはできません。システムのQtのシグナルとスロットは、一般的にベンチマークの凹部を用います。限りスロットに(例えば、いくつかの単純な文字列操作を)いくつかの便利な操作を実行するよう、あなたはオーバーヘッドが無視できる呼び出すことができます。QTシステムは、オペレータ新を必要とする操作を最適化または削除(例えば、文字列操作またはテンプレート内のコンテナからいくつかの内容を削除/挿入)はるかに高価信号よりもなっています。
  ナレーター:あなたは、ミッションクリティカルな内部ループのパフォーマンスを信号と溝の接続をしている閉じて、あなたがボトルネックとしてこの接続を使用する場合は、むしろシグナルとスロットよりも、標準のリスナー・インターフェース・モードを使用することを検討してください。1接続:この場合は、あなただけの1が必要な場合があります。たとえば、あなたがネットワークデータオブジェクトからダウンロードした場合は、要求されたデータが到着したことを示すために信号を使用し、これは非常に巧妙なデザインです。あなたが消費者に個別に各バイトを送信する必要がある場合は、むしろシグナルとスロットよりも、リスナーインタフェースを使用しています。

制限はありません

  私たちはMOCシグナルとスロットをサポートしているので、私たちは、テンプレートをすることができないでいる、そこに他の有用なものを追加することができます。これらは、変換TRによって生成された関数()、およびプロパティシステムおよび拡張ランタイムのイントロスペクションのタイプ情報と高度を含みます。プロパティシステム自体が大きな利点です:あなたは強力かつ内省的なプロパティシステムを持っていない場合は、Qtのデザイナーのような非常に強力かつ普遍的なユーザーインターフェース設計ツールは非常に書くのは難しい(不可能ではない)になります。しかし、それはそこに終わりません。我々はまた、限定されるものではないので、RTTIシステムに依存しないダイナミックqobject_cast()メカニズムを提供します。私たちは、それが安全に動的にロードされたインタフェースコンポーネントを照会するために使用します。別の応用分野は、動的な要素オブジェクトです。例えば、我々はメタオブジェクトを作成するには、実行時に、その前後のActiveXコンポーネントを使用することができます。それとも私たちはQtのメタオブジェクトのエクスポートによりQTのActiveXコンポーネントアセンブリとしてエクスポートすることができます。あなたは、2つのことを行うために、テンプレートを使用することはできません。
  モックは、C ++、自然を使用するC ++のユニークなパフォーマンスと拡張性の利点を維持しながら、私たちのために柔軟性のObjective-CやJavaランタイム環境を提供します。それは柔軟で快適なQtは、我々が今日持っている道具になることができます。

おすすめ

転載: blog.csdn.net/a844651990/article/details/93022953