🙌

今更聞けない?「フレームワーク」と「ライブラリ」

2025/02/03に公開

ソフトウェア開発の現場では、「フレームワーク」と「ライブラリ」という言葉が頻繁に登場しますよね。どちらも再利用可能なコードの集合体として、開発効率を高めるために欠かせない存在ですが、利用方法や制御の流れなど、根本的な性質には違いがあります。私自身、先日弊社の技術責任者からこの違いについて問い直され、改めて自分の理解を整理します。

フレームワークとライブラリの定義

ライブラリ

ライブラリは、特定の機能や処理をまとめた再利用可能なコードの集まりです。
利用方法の基本は、開発者自身が必要なタイミングで呼び出して使うという点にあります。
例:
数学関数ライブラリ(Python の math モジュールなど)
ユーティリティライブラリ(JavaScript の jQuery や Lodash など)

サンプルコード(Python: math モジュールの場合)

import math

result = math.sqrt(16)  # 4.0
print(result)

このコードでは、開発者が明示的に math.sqrt 関数を呼び出して機能を利用しています。

フレームワーク

フレームワークは、アプリケーション全体の構造や制御の流れを定義する土台です。

ここで出てくるのが、「制御の反転 (Inversion of Control, IoC)」 という考え方です。
https://qiita.com/jumperson/items/b75158f65ae0b4b32dcb
http://www.laputan.org/drc/drc.html
「制御の反転」(Inversion of Control, IoC)を簡単に説明すると、通常のプログラムの流れでは、あなたが書いたコードがライブラリの関数を必要なタイミングで呼び出して処理を進めます。これは、例えば計算をするために math.sqrt() を自分で呼び出すような感じです。

しかし、フレームワークを使う場合は話が変わります。ここでは、フレームワークがプログラム全体の流れを管理し、必要になったときにあなたが用意したコードを呼び出す仕組みになっています。つまり、あなたのコードは「いつ呼ばれるか」を自分で決めるのではなく、フレームワークに呼び出される形になるわけです。たとえば、ウェブアプリケーションのフレームワークでは、リクエストが来たときに自動的にあなたの書いた処理が実行されるため、アプリケーションの全体的な制御はフレームワーク側が担当します。これが「制御の反転」であり、フレームワークの本質とも言える仕組みです。

例:
ウェブアプリケーションフレームワーク(Django、Flask、Ruby on Rails など)
フロントエンドフレームワーク(Angular など)

サンプルコード(Python: Flask の場合)

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    # Flask が内部でリクエストの受け付けやルーティングなどの処理を行い、
    # 必要に応じて hello() 関数を呼び出します。
    app.run()

この例では、Flask フレームワークがアプリケーションの起動、リクエストの受け付け、ルーティングの管理などを行い、開発者はルート(/)に対応する処理として hello 関数を定義するだけです。
つまり、「Don't call us, we'll call you(呼ばれる側になる)」 という原則が働いています。
https://plainprogram.com/dont-call-us-we-ll-call-you/

制御の反転(Inversion of Control: IoC)の重要性

フレームワークとライブラリの大きな違いは、どちらが処理の制御権を持つかにあります。

ライブラリの場合:

開発者が自分のコードの中で必要なライブラリの関数を呼び出すため、処理の流れは 開発者が決定します。

フレームワークの場合:

フレームワークがアプリケーション全体の流れを管理し、必要に応じて開発者のコードを呼び出すため、制御の流れはフレームワークに委ねられることになります。

この「制御の反転」により、フレームワークはプロジェクト全体の設計や構造を統一しやすくし、開発効率や保守性の向上に寄与します。一方で、フレームワークに沿った設計になるため、柔軟性が制限される場合もあります。

どちらを選ぶべきか

ライブラリ:特定の機能を補完するために使いたい場合や、アプリケーションの制御を自分で細かく管理したい場合に適しています。
例: 数学計算、文字列操作、HTTPリクエストの処理(例: Python の requests ライブラリなど)

フレームワーク:アプリケーション全体の骨組みや設計方針を統一し、効率的に開発を進めたい場合に有効です。
例: ウェブアプリケーション開発における Django や Flask、フロントエンド開発における Angular など

まとめ

ライブラリ:

利用方法: 開発者が必要に応じて関数やメソッドを呼び出す
制御: 開発者が管理する
用途: 特定の機能の補完

フレームワーク:

利用方法: アプリケーション全体の骨組みを提供し、内部で開発者のコードを呼び出す(制御の反転)
制御: フレームワークが管理する
用途: アプリケーション全体の構造や設計の統一

なお、実際の現場ではライブラリとフレームワークの境界は必ずしも厳密に区別できるものではなく、どちらとも言えるケースや両者の機能が混在している場合もあります。たとえば、一部のライブラリはフック(callback)を提供することで、制御の反転のような動作を実現している場合もありますし、フレームワーク内にライブラリ的なコンポーネントが含まれていることもあるため、あくまで参考として捉えていただければと思います。

整理してみると、ライブラリとフレームワークの基本的な違いは理解しやすいものの、実際に自分で整理しながら考えると「意外と難しいな」と感じる部分もありました。実際の開発現場では、両者が混在していたり、用途によって使い分ける必要があるため、この基本概念をしっかり押さえておくことが、プロジェクト設計や選定時に役立つのかなと思いました。

参考にしたサイト

制御の逆転:https://bliki-ja.github.io/InversionOfControl
ソフトウエアのフレームワークとはなにか:https://xtech.nikkei.com/it/article/lecture/20070205/260697/

Discussion