ソフトウェア工学 知能情報学部 新田直也
再利用の進化 オブジェクト指向は再利用のための技術. 構造化指向ではライブラリ単位で部品(呼び出される側)を再利用. オブジェクト指向ではフレームワーク単位で骨組み(呼び出し側)を再利用. アプリケーションA ライブラリ アプリケーションB アプリケーションA フレームワーク アプリケーションB
アプリケーションフレームワーク アプリケーションフレームワーク: 特定のドメイン(対象領域)向け. ドメイン内で共通に使える親クラス(抽象クラス)の集合. 主に呼び出し側を再利用. 多相性によってフレームワーク側からアプリケーション側が呼び出される(制御の反転). ハリウッドの原則:「俺に電話するな.必要ならこちらから電話する.」
制御の反転と多相性(1) abstract class FrameworkMain { FrameworkSub sub; void mainLoop() { // メインループ for (;;) { sub.proc(); // この呼び出しで制御が反転 } abstract class FrameworkSub { abstract void proc(); // アプリケーション毎の処理 フレームワーク側
制御の反転と多相性(2) class ApplicationMain extends FrameworkMain { void main() { sub = new ApplicationSub(); // 依存性の挿入 mainLoop(); } class ApplicationSub extends FrameworkSub { void proc() { // 制御の反転で呼び出される // アプリケーション固有の処理を行う アプリケーション側
フレームワークの例 PCアプリ スマホアプリ Webアプリ データベース ビッグデータ Swing, AWT, … Android SDK, iOS SDK, … Webアプリ Struts, Spring, Jersey, … データベース Hibernate, iBatis, … ビッグデータ Hadoop, …
Swingの場合(1) abstract class Component… { // GUI部品クラス MouseListener listener; void processMouseEvent(…) { // 共通の処理 : listener.mouseClicked(…); // 制御の反転の発生 } interface MouseListener … { // マウスイベント処理用 void mouseClicked(…); フレームワーク側
Swingの場合(2) class MyListener extends MouseListener … { void mouseClicked(…) { //制御の反転で呼び出される // アプリケーション毎のクリック時の動作 } アプリケーション側
Androidの場合 class Activity extends … { // 全アプリ共通の画面クラス void performCreate(…) { // 共通の処理 onCreate(…); // この呼び出しで制御が反転 } void onCreate(…) { class AppActivity extends Activity { // アプリ固有画面 void onCreate(…) { // 制御の反転で呼び出される // アプリ固有の画面初期化処理 } フレームワーク側 アプリケーション側
再利用の現状 フレームワークは一定の成果を生んでいる. ただし,最初から良いフレームワークを設計することは困難. たとえ良いフレームワークを開発できたとしても,開発者以外がそれをうまく再利用することは困難. 再利用の方法が複雑で開発者しかわからない. 適用可能範囲が微妙で開発者しかわからない.