囲みコラム

抽象化と再利用


前の章のサンプルでは、ビュークラスのインスタンス、つまりビューオブジェクトを生成するのはウィンドウクラスの役割でした。それに対し、ここではその役割をアプリケーションクラスに移しているのですが、これには大きな理由があります。何だと思いますか?「ウィンドウクラスを再利用するためだ」と思った人は正解です。ウィンドウクラスにビューオブジェクトを生成させようとすると、そこに依存関係が生じます。つまり、生成するビューのクラスが何であるかにウィンドウクラスが依存し、違うビュークラスを使おうとすると、ウィンドウのクラスも一緒に変更する必要が出てしまうのです。

実は、この章で紹介する四つのアプリケーションは、すべて同じウィンドウクラスを利用しています。すなわち、リスト6.3~6.4に示したSingleWindowのソースコードは、四つのアプリケーションを通じて再利用されているのです。それぞれのアプリケーションでは、マウスクリックに応答する処理をビュークラスによって行っており、それぞれ異なるビュークラスを使っています。そのため、ウィンドウクラスにビューオブジェクトを生成させたのでは、再利用できなくなってしまうのです。

SingleWindowクラスのソースを見ると、InitContent()メソッドの引数としてBViewクラス型へのポインタを受け取ります。つまり、実際に受け取るビューオブジェクトのクラスが何であるかを関知せず、それらの基底クラス(親クラス)であるBViewクラスの情報しか持ちません。言い換えると、ビューオブジェクトのクラスに関して、SingleWindowクラスは必要最小源の情報だけを持っています。ソフトウェア工学の用語では、このように必要最小限の情報だけを抜き出すことを抽象化(abstraction)と呼びます。

適切な抽象化を行うことは、プログラムの再利用において重要なポイントの一つです。C++などのオブジェクト指向言語は、Cなどの手続き指向言語に比べてプログラムの再利用が簡単だと言われます。これは、上の例で見たように、基底クラスを利用することで自然に抽象化を行えるからなのです。


Art of BeOS Programming
koga@stprec.co.jp