【定義】フレームワークとは何か

## はじめに
本記事の主題であるフレームワーク定義の部分は**記事の後半部**にありますので、前半部は読み飛ばしていただいても問題ありません。


## フレームワークを調べるに至るまでの変遷
venvとは何かを調べていたところ、「[PyCharmでVenvをGitで共有するときにすること](https://hiropon-progra.com/?p=82)」というサイトを教えてもらったのですが、冒頭の導入部分にこんなことが書いてありました。

> 今回友達とpythonのDjangoで何かサービスを開発しようということになり、環境はVirtualEnv環境（以降venv）を使おうという話になりました！
> 

venvとは、Djangoを使うときに使えるのか…

いやまず、Djangoってなんだ？
[Wikipedia](https://ja.wikipedia.org/wiki/Django)にはこう書かれていました。

> Django（ジャンゴ）は、Pythonで実装された**Webアプリケーションフレームワーク**。
> 

あれ、ウェブアプリケーションフレームワークってなんか聞いたことあるぞ。なんだっけ…
Flaskを[Wikipedia](https://ja.wikipedia.org/wiki/Flask)で調べてみるとこう書かれていました。

> Flask（フラスク）は、プログラミング言語Python用の、軽量な**ウェブアプリケーションフレームワーク**である。標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる。
> 

そうだ！Flaskもウェブアプリケーションフレームワークなんだ！

flaskってどんな使い方をするんだっけ…
例えば…

```python:main.py
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](https://ja.wikipedia.org/wiki/Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF)を開きました。

>Web アプリケーションフレームワーク（ウェブアプリケーションフレームワーク、英: Web Application Framework）は、動的な ウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計された**アプリケーションフレームワーク**である。

アプリケーションフレームワーク…？
とりあえず続きを読む。

>  フレームワークの目的は、Web開発で用いられる**共通した作業に伴う労力を軽減**することである。たとえば、多数のフレームワークがデータベースへのアクセスのための**ライブラリ**や、**テンプレートエンジン**（→Webテンプレート）、**セッション管理**を提供し、コードの再利用を促進させるものもある。
>

やっぱりライブラリでもあるんだけど、それだけじゃないみたいだ。

## アプリケーションフレームワーク（or フレームワーク）
とりあえずアプリケーションフレームワークとは何か、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF)を読む。

>アプリケーションフレームワーク (英: application framework) とは、プログラミングにおいて、アプリケーションソフトウェアの標準構造を実装するのに使われる**ライブラリ（サブルーチンやクラスなど）の集まり**である。単に**フレームワーク**とも呼ぶ。
>

やっぱりライブラリのことなんだ！
じゃあ、なんでフレームワークなんて言い方をするんだろう…？

## 「ライブラリ」と「フレームワーク」は何が違うのか [本題]
以上がフレームワークとは何かを調べるに至った経緯です。フレームワークとは何かという質問に答えるならば、上記の通り、**「誰かが書いたコードの集まり、すなわちライブラリみたいなものと認識しておけば十分」**だと思われます。

しかし、このように言葉が分けられているということは、そこに違いがあると考えるのが普通ですよね。[こちらの記事](https://qiita.com/baby-degu/items/7dc4548bf7befc2671f4)によりますと、実は、ライブラリとフレームワークにおける技術的な違いは**「制御の反転の有無」**という用語に集約されます。これは主導権が「我々」にあるのか、「クラスやサブルーチンの集まり」にあるのかということです。

すなわち、ライブラリを使うときには、ライブラリの機能を使うタイミングは我々が決定するのに対し、フレームワークを使うときには、その機能を使うタイミングをフレームワーク自身が決定するのです。つまり、フレームワークを使う際には、プログラムの制御をするのが使っている人間ではなくそのプログラム自身になってしまうという「制御の反転」ということが起こってくるのです。

ここでもう一度ウェブアプリケーションフレームワークのWikipediaの記事を読んでみると、

>  フレームワークの目的は、Web開発で用いられる**共通した作業に伴う労力を軽減**することである。たとえば、多数のフレームワークがデータベースへのアクセスのための**ライブラリ**や、**テンプレートエンジン**（→Webテンプレート）、**セッション管理**を提供し、コードの再利用を促進させるものもある。
>  

とありますね。つまり、ライブラリの提供に加えて、**テンプレートエンジン**(テンプレートエンジンはテンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力するソフトウェアまたはソフトウェアコンポーネント(Wikipediaより))や**セッション管理**の提供がなされるとところがよりフレームワーク-likeな部分だと思います。

より詳しい具体例については[こちらの記事](https://qiita.com/baby-degu/items/7dc4548bf7befc2671f4)を参照してください。

## たとえ話
最後に、[引用](https://qiita.com/baby-degu/items/7dc4548bf7befc2671f4)になりますが、ライブラリとフレームワークの違いのわかりやすいたとえです。

>私はよくWeb開発における概念のメタファーとして、**家**を使います。

>例えばライブラリは**IKEAに行くようなもの**です。あなたはすでに自分の家を持っていますが、家具が少し足りないとします。ですが、テーブルを一から作る気にはなれません。そんな時、IKEAに行けば数ある選択肢の中から気に入ったものを持ち帰ることができます。それを選ぶのはあくまでも、あなたです。

>一方、フレームワークは**モデルハウスを建築するようなもの**です。いくつかのテンプレートの中から、限られたアーキテクチャとデザインを選ぶことができます。あなたが基本的に選べるのは請負業者とテンプレートのみ。あとはその業者がピンポイントであなたが介入できるところを教えてくれます。