|
|
|
1-2-8. コンポーネント化コンポーネント化すると、機能の再利用が容易になります。また処理を隠蔽できますので、使用者は考慮する点が減り大変利用しやすくなります。機能とそれを実現するための方法だけ、規定しておけば、自由に誰でもその機能を自分のアプリケーションに組み込むことができます。そんな技術がコンポーネント化です。ただし良い所ばかりでもありません。コンポーネント化は、コードの再利用が目的ですので、仕事は省力化できますが、パフォーマンスの点では、やや劣ります。考えてみてください。機能が必要かどうかは、利用者が決めますが、コンポーネント化では、不必要な機能まで盛り込むことになります。結果コードサイズが膨らみます。個人が自分のためだけに作成するのなら、何とかなりますが、多数の用途に必要と思われる機能を多く提供すると、必然的に無駄が多く発生します。特にC++のクラスの代表のMFCは、非常にコードサイズが膨らみます。 Windowsには、以下のコンポーネント化の技術が最初から用意されています。またプログラミング言語で実現できることもあります。
ウィンドウクラス コントロールは、ウィンドウクラスで実現したコンポーネントです。このクラスでは、以下の技法で制御します。
サブクラス サブクラスは、コントロールなどの機能拡張に良く使用されます。ウィンドウの本来のプロシージャにフックを掛け、別のユーザが作成した関数に飛ばします。そしてその関数では、メッセージを追加や横取りして、機能を拡張または、統合して目的に添った改変を行ないます。サブクラスは、ウィンドウごとに管理しているプロシージャアドレスを変更します。よって対象のウィンドウしかその機能は搭載されません。以下の方法でサブクラス化を行ないます。
ウィンドウズフック 一般のフックと、Windowsが用意しているフックシステムとは、やや意味が異なります。フックとは、途中でプロシージャを横取りする技術ですが、Windowsは、特定のメッセージの流れを故意に変更するための機構を用意しています。それがここで言うウィンドウズフックです。
DLL技術 DLLは、ダイナミックリンクライブラリの意味で、利用者の処理で、メモリ上にロードして実行できるライブラリです。作成したAPIや各種のプロシージャなどを複数のアプリケーションで使用するときは、DLL化して同じコードがメモリで複数展開されることを防ぎます。またDLL化することで、アプリケーションの拡張性が高まります。つまりインターフェースを共通化して、複数のDLLでいろいろな形式をサポートできます。またそのインターフェースを公開すれば、パブリックの開かれたシステムになります。例えば、ファイルのアーカイブソフトで、UNLHA.DLLやUNARC.DLLやUNCAB.DLLなどを使用します。これらは、インターフェースが共通で、いろいろな形式の圧縮解凍を行ないます。 インターフェース ここで言うインターフェースとは、OLEやCOMで使用されている、C++のクラスに似たシステムコールの手段です。
|