フレームワーク(Framework)とライブラリ(Library)の違い

フレームワークとライブラリは混同して使われることが多いが、明確に異なる意味を持つ。

まず、それぞれの意味を見てみよう。

フレームワーク(Framework)

フレームワークは文字どおり骨組み、つまりプログラム実装において大きな構造を決め、流れを制御する役割を持つ。開発者はその上でコードを記述し、フレームワークは開発者が記述したコードを流れに合わせて実行する。代表的なフレームワークにはSpring framework、.NET frameworkなどがある。

マイクロソフトウェア 2006年8月号 130ページ「フレームワーク活用戦略」より

GoFのデザインパターンで有名なRalph Johnson教授は、フレームワークを「ソフトウェアの具体的な部分に該当する設計と実装を再利用できるよう、一連の協調された形でクラスを提供するもの」と定義した。フレームワークはライブラリとは異なり、アプリケーションの枠組みと構造を決めるだけでなく、その上で開発された開発者のコードを制御する。フレームワークは具体的で拡張可能な基盤コードを持ち、設計者が意図する複数のデザインパターンの集合で構成されている。

ライブラリ(Library)

ライブラリは、よく使われるロジックの集まり、または束と言える。よく使うメソッドや関数をあらかじめ実装しておき、プログラムに追加して使用する形になる。開発者は事前に作られた機能を便利に使い、開発を素早く進められる。代表的なライブラリにはjQuery、Apache Commons Libraryなどがある。

フレームワークとライブラリの違い

フレームワークとライブラリの大きな違いは、制御フローの主導権がどこにあるかである。

フレームワークは全体の流れを制御しており、開発者はその中に必要なコードを入れる。一方、ライブラリは開発者が全体の流れを作り、その中でライブラリを使用するものだと言える。

比喩的に言えば、自動車がフレームワークなら、そこに属する車輪やハンドルなどはライブラリと言える。

このように、すでに実装されたプログラムでライブラリを置き換えることは比較的容易な場合があるが、フレームワークを変更することは基盤全体を揺るがす作業になってしまう。

『TobyのSpring 3』1章 オブジェクトと依存関係 p.95より

フレームワークも制御の反転概念が適用された代表的な技術である。 フレームワークはライブラリの別名ではない。 フレームワークは、あらかじめ作られた半製品や、拡張して使えるよう準備された抽象ライブラリの集合ではない。 フレームワークが何かを理解するには、ライブラリとフレームワークがどのように違うのかを知る必要がある。 ライブラリを使用するアプリケーションコードは、アプリケーションの流れを直接制御する。 ただし動作中に必要な機能があるとき、能動的にライブラリを使用するだけである。 一方、フレームワークでは逆にアプリケーションコードがフレームワークによって使用される。 通常、フレームワーク上で開発したクラスを登録しておき、フレームワークが流れを主導する中で、開発者が作ったアプリケーションコードを使用する方式である。 最近はツールキット、エンジン、ライブラリなども流行に合わせてむやみにフレームワークと呼ばれることがあるが、これは誤りである。 フレームワークには明確な制御の反転概念が適用されていなければならない。 アプリケーションコードは、フレームワークが用意した枠の中で受動的に動作しなければならない。

参考