プログラミング応用a 第12回『継承の基礎2』12-1 フレームワーク


【12-1 フレームワーク】

・オブジェクト指向の考え方を理解していると,比較的簡単にソフトウェアの作成ができるようになる。

  再利用しやすい便利なクラスを集めたものを「クラスライブラリ」と呼ぶ。クラスライブラリは単体のパッケージの場合もあれば,複数のパッケージからなるものもある。
 世の中には多くのクラスライブラリが売られていたり,無償で公開されている。
  ここで,よく設計されたスーパークラス群と,それらのスーパークラスを使って全体の大部分を記述されたプログラムがクラスライブラリとして用意されていると考えてみよう。
 つまり,このプログラムは,ほぼ完成している
 後は,いくつかの適切なサブクラスを開発者が追加してやればプログラムが完成する,という仕組みである。

ここで,書類ベースのアプリケーションの作成を考えてみよう。
『書類ベースのアプリケーション(document based application)』とは,
 ・書類を開いて表示する
 ・書類を新規に作成して表示する
 ・書類を 編集する
 ・書類を印刷する
 ・書類を保存する
といった機能を持っているソフトウェアで,Microsoft Office のアプリケーション (Excel, Word, PowerPoint) など,
多くのアプリケーションがこのタイプのソフトウェアである。

ここでは,
 機能1 「書類を開いて表示する」
だけを持っている場合を考えてみよう。また,
 機能2「 複数の書類を同時に開いておける」
ようにしてみる。

【ステップ1】
書類にも
  「テキスト書類」「ワープロ書類」「グラフィック書類」「表計算書類」
といった様々な書類があるが,それらをひっくるめて,書類一般を表すスーパークラス Document を考える。

先ほどの機能1,機能2にしぼって作成した Document クラスが下の List 3 (Document.java)である。

List 3
 

【解説】
 ●staticフィールド numOfDoc は現在開いている書類の数を記録する変数(①)。
 ●書類オブジェクトが生成されるごとに1増える様にしたいので,コンストラクタで1増やすようにしている(②)。

 ●getNumOfDoc( ) はフィールド numOfDoc のゲッタ(③)。

 ●readDataFromFile( ) と drawDataOnWindow( ) が書類を開く際に必要に
  なるであろう処理で,それぞれ 次の様に動作する。

   ・ readDataFromFile( ) は,ファイルから書類のデータを読み込む(④)。
   ・drawDataOnWindow( ) は,書類データの中身をウィンドウに表示する((⑤)。

  両メソッドともに,具体的な動作は定義されていない。(具体的な動作は
  後ほど,サブクラスでオーバライドしてやればよい。 )



【ステップ2】
次にアプリケーション本体を表すクラス  DocumentBasedApp を,先ほど決めておいた
 機能1 「書類を開いて表示する」
 機能2「 複数の書類を同時に開いておける」
だけにしぼって考えたのが,下中央の図(List 4)である。
下図左端は,『書類を開く』処理の流れを表しており,実際には DocumentBasedApp クラスの openDocument( )メソッドとして定義されている。

List 3, List 4,  画像をクリックするとDocumentオブジェクトを配列に登録する処理の説明表示と交互に切り替わります。

上図中央の DocumentBasedApp クラスは,
 ・ 『書類データをファイルから読み込む』
 ・ 『書類データの内容をウィンドウに表示する』
といった,書類のデータ内容に係わる処理に関しては,すべて上図右端の Document型オブジェクトのメソッドにお任せしている。
これは,『書類に関する動作について知っているのは書類を表すオブジェクト自身である』という考え方である。
オブジェクト指向では,このような『餅は餅屋』,つまり『仕事は専門家自身に任せるのが一番』という考え方でソフトウェアを設計する。

そして,Documentクラスでは,書類に関する処理をメソッド readDataFromFile( ) と drawDataOnWindow( ) として定義している。
しかし,Documentクラスはあくまで書類一般を表すクラスで,これらのメソッドの具体的な内容は定義されていない(各メソッドの { } の中に何も処理が書かれていない)。

そこで,実際に書類ベースのアプリケーションを作成する際には,Documentクラスのサブクラスを作成し,各メソッドをオーバライドしてやれば良い

以下は,『テキスト書類』を表すサブクラス TextDocument『グラフィック書類』を表すサブクラス GraphicDocument を作成した例である。

List 3, List 5


動作テスト用のクラスの例を以下に挙げる。

List 6


以上のクラスの関係をまとめると下図のようになる。

List 3, List 4, List 5, List 6


上図に書いてあるように,書類ベースアプリケーションの処理のほとんどが,この部分ですでに作成済みである。

このように,ソフトウェアのほとんどの部分を記述済みのクラスライブラリを,
 
 フレームワーク(framework)

と呼ぶ。フレームワークは,
 ・良く設計されたスーパークラス
を提供し,そのスーパークラス群を使って記述される。

フレームワークは市販されているものや,開発環境に元から付属しているものなどもあり,それらを利用することで
手軽にソフトウェアを開発できるようになっている。