clock2015.10.05 07:02
SERVICE
home

フレームワークとは?~自作のプログラムを「呼び出してくれる」共通プログラム~

AUTHOR :  岩谷 和男

「フレームワーク」は「共通プログラムの種類」の一つ

こんにちは。技術チームの岩谷です。「フレームワークって何?」この質問は私がこれまでいただいた質問の中でも比較的多い質問でした。現在世の中にはいろいろなフレームワークもあり思想やスタンス・機能においても多岐にわたるのですが、本日はこのフレームワークについての基本的な考え方を説明したいと思います。

システムは「あるプログラムが他のプログラムを呼び出す」事の「連鎖」で成り立っている

おそらく、これついて疑問を抱かれるかたはいらっしゃらないでしょう。今日の複雑なプログラム開発においては機能を構成する全てのプログラミングを自分で行う事は現実的ではありません。我々がプログラム作成する際には大なり小なり「他のプログラム」を呼び出している事が今日一般的でありプログラムの集合体であるシステムはさらにそれが連続して行われていると表現する事が出来ます。

img20150929_8

「自作アプリ」の「立ち位置」を意識しよう

ここで、みなさんに意識していただきたいのは「今、自分が開発しているプログラム」が「上の図のどこに位置しているか?」という「立ち位置」です。これからの説明でこの「今、自分が開発しているプログラム」を「自作アプリ」と呼ぶことにします。

フレームワークは、自作アプリを呼び出す共通プログラム

ここで、「フレームワーク」と「自作アプリ」の関係を上で説明した呼び出しの連鎖に当てはめてみます。

img20150929_9

フレームワークを名乗るには主に二つの機能が必要とされます。改めて申し上げますと、

1.自作アプリを「呼び出す」能力を持っている

当然ながらプログラムは外部から命令されることで実行を開始するのですが、ここには「命令を受けて最初に実行されるプログラム部位」があるはずです。この部位が「自作アプリ」にあるのではなく「上位アプリ」にある場合、すなわち上位アプリが自作アプリを呼び出す機能を持っている場合、その「上位アプリ」はフレームワークとしての要素を持っていることになります。

2.共通プログラムとしての汎用性を持っている

プログラムには使用用途があります。例えば「売上金額の計算」であるとか「顧客の住所変更」といった用途です。ここで、ある種類プログラムには使用用途が幅広い(≒細かく限定されていない)ものが存在します。例えば「生年月日から年齢の算出を行うプログラム」は、そのプログラムがどのようなシステムで使用されるのかという使用用途は特に限定していません。このようなプログラムは「共通プログラム」と呼ばれています。フレームワークにもこの種の性格が求められています。たとえばWebシステム用のフレームワークとして有名な「Struts」は、そのWebシステムが「買い物サイトの用途で作られた」「ホテル予約サイトの用途でつくられた」というシステムの用途を特に限定しない汎用性を持っています。同じくビッグデータ処理用のフレームワークである「Hadoop」も、そのビッグデータ処理用途が「POSデータの集計」や「Webサイトのアクセスログの集計」などといった具体的な使用用途を限定していません。このような共通プログラムとしての汎用性もフレームワークに必要な要素の一つです。

上記の要素を整理して表にまとめると、以下のようになります。img20150929_10

フレームワークの役割は「自作アプリの目的」以外の処理を共通プログラムにまかせて開発を楽にすること

ここで、フレームワークの目的と具体的な処理の一部を、Webシステムのフレームワークとして有名な「Struts」を例として説明します。ホテルのWeb予約サイトがあったとしましょう。ここにはたぶん「予約キャンセル」という機能があるはずですが、この機能は以下のような処理の流れで成り立っています。

  1. システムは利用者からの要求を特定のURLで受信する。
  2. システムはURLの文字列を解析して、次に呼び出す「自作アプリ」を決定する。
  3. システムは「自作アプリ」を実行する。(このケースではURLが「予約キャンセルのURL」でるので「予約キャンセル用の自作アプリ」を実行する。)
  4. システムは「予約キャンセル」の処理を行う。
  5. システムは「自作アプリ」の処理結果を判断して利用者に見せる画面を作成する
  6. システムは作成した画面を利用者へ送信する。

ここでみなさんにクイズなのですが、上記の流れが「予約キャンセル処理」から「新規予約処理」になった場合、どの場所が変更となるでしょうか?またこのシステムがホテルの予約システムではなく買い物システムになった場合はどうなるでしょうか?

実は、変更箇所は上記dだけなのです。他は全て共通的な処理なのです。これは上記d以外の処理に関しては共通プログラムが欲しくなりますよね?Strutsフレームワークはまさにこの部分の機能を共通的に提供する事によってシステム全体の開発生産性を向上させることを目的としているのです。

フレームワークはオブジェクト指向プログラミング(OOP)と密接につながっている

私は以前からオブジェクト指向プログラミング(OOP)についての連載を執筆させていただいています。ここで最後にフレームワークとOOPについての関係を簡単に説明させてください。

フレームワークは自作アプリを呼び出す機能をもっていますが、ここで意識していただきたいことがあります。それは、例えばStrutsフレームワークは自分自身が開発された(Strutsが生まれた)時点では、

  • フレームワークが実行する自作アプリの名前を知らない
  • そもそもその時点では、自作アプリはまだこの世に存在しない

という事です。これはつまり「Strutsフレームワークは未来に開発されるであろう未知の自作アプリをURLの文字列を手がかりに実行するプログラムである。」という事を意味しているのです。そしてこれはOOPにおける「インターフェース」「リフレクション」が実現してくれる機能なのです。OOPはシステム開発における生産性の向上を目的とした考え方です。そしてフレームワークの存在目的もまったくもって生産性の向上にほかなりません。この意味でフレームワークは、まさにOOPの思想に則って作られているソフトウェアであるといえるのです。

SERVICE