はじめに
本記事の主題であるフレームワーク定義の部分は記事の後半部にありますので、前半部は読み飛ばしていただいても問題ありません。
フレームワークを調べるに至るまでの変遷
venvとは何かを調べていたところ、「PyCharmでVenvをGitで共有するときにすること」というサイトを教えてもらったのですが、冒頭の導入部分にこんなことが書いてありました。
今回友達とpythonのDjangoで何かサービスを開発しようということになり、環境はVirtualEnv環境(以降venv)を使おうという話になりました!
venvとは、Djangoを使うときに使えるのか…
いやまず、Djangoってなんだ?
Wikipediaにはこう書かれていました。
Django(ジャンゴ)は、Pythonで実装されたWebアプリケーションフレームワーク。
あれ、ウェブアプリケーションフレームワークってなんか聞いたことあるぞ。なんだっけ…
FlaskをWikipediaで調べてみるとこう書かれていました。
Flask(フラスク)は、プログラミング言語Python用の、軽量なウェブアプリケーションフレームワークである。標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる。
そうだ!Flaskもウェブアプリケーションフレームワークなんだ!
flaskってどんな使い方をするんだっけ…
例えば…
from flask import Flask
app = Flask(__name__, static_folder='.', static_url_path='')
@app.route('/')
def index():
return app.send_static_file('index.html')
app.run(port=8000, debug=True)
あれ?つまり、ウェブアプリケーションフレームワークというのはライブラリのことなのか…?
ウェブアプリケーションフレームワーク
じゃあ、ウェブアプリケーションフレームワークって何なんだろう。例によってWikipediaを開きました。
Web アプリケーションフレームワーク(ウェブアプリケーションフレームワーク、英: Web Application Framework)は、動的な ウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計されたアプリケーションフレームワークである。
アプリケーションフレームワーク…?
とりあえず続きを読む。
フレームワークの目的は、Web開発で用いられる共通した作業に伴う労力を軽減することである。たとえば、多数のフレームワークがデータベースへのアクセスのためのライブラリや、テンプレートエンジン(→Webテンプレート)、セッション管理を提供し、コードの再利用を促進させるものもある。
やっぱりライブラリでもあるんだけど、それだけじゃないみたいだ。
アプリケーションフレームワーク(or フレームワーク)
とりあえずアプリケーションフレームワークとは何か、Wikipediaを読む。
アプリケーションフレームワーク (英: application framework) とは、プログラミングにおいて、アプリケーションソフトウェアの標準構造を実装するのに使われるライブラリ(サブルーチンやクラスなど)の集まりである。単にフレームワークとも呼ぶ。
やっぱりライブラリのことなんだ!
じゃあ、なんでフレームワークなんて言い方をするんだろう…?
「ライブラリ」と「フレームワーク」は何が違うのか [本題]
以上がフレームワークとは何かを調べるに至った経緯です。フレームワークとは何かという質問に答えるならば、上記の通り、**「誰かが書いたコードの集まり、すなわちライブラリみたいなものと認識しておけば十分」**だと思われます。
しかし、このように言葉が分けられているということは、そこに違いがあると考えるのが普通ですよね。こちらの記事によりますと、実は、ライブラリとフレームワークにおける技術的な違いは**「制御の反転の有無」**という用語に集約されます。これは主導権が「我々」にあるのか、「クラスやサブルーチンの集まり」にあるのかということです。
すなわち、ライブラリを使うときには、ライブラリの機能を使うタイミングは我々が決定するのに対し、フレームワークを使うときには、その機能を使うタイミングをフレームワーク自身が決定するのです。つまり、フレームワークを使う際には、プログラムの制御をするのが使っている人間ではなくそのプログラム自身になってしまうという「制御の反転」ということが起こってくるのです。
ここでもう一度ウェブアプリケーションフレームワークのWikipediaの記事を読んでみると、
フレームワークの目的は、Web開発で用いられる共通した作業に伴う労力を軽減することである。たとえば、多数のフレームワークがデータベースへのアクセスのためのライブラリや、テンプレートエンジン(→Webテンプレート)、セッション管理を提供し、コードの再利用を促進させるものもある。
とありますね。つまり、ライブラリの提供に加えて、テンプレートエンジン(テンプレートエンジンはテンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力するソフトウェアまたはソフトウェアコンポーネント(Wikipediaより))やセッション管理の提供がなされるとところがよりフレームワーク-likeな部分だと思います。
より詳しい具体例についてはこちらの記事を参照してください。
たとえ話
最後に、引用になりますが、ライブラリとフレームワークの違いのわかりやすいたとえです。
私はよくWeb開発における概念のメタファーとして、家を使います。
例えばライブラリはIKEAに行くようなものです。あなたはすでに自分の家を持っていますが、家具が少し足りないとします。ですが、テーブルを一から作る気にはなれません。そんな時、IKEAに行けば数ある選択肢の中から気に入ったものを持ち帰ることができます。それを選ぶのはあくまでも、あなたです。
一方、フレームワークはモデルハウスを建築するようなものです。いくつかのテンプレートの中から、限られたアーキテクチャとデザインを選ぶことができます。あなたが基本的に選べるのは請負業者とテンプレートのみ。あとはその業者がピンポイントであなたが介入できるところを教えてくれます。