フレームワークとライブラリの違いは何ですか?[閉まっている]


865

フレームワークライブラリの違いは何ですか?

私は常に、ライブラリーを、特定の問題またはアプリケーション開発の特定の領域(データベースアクセスなど)の解決に焦点を合わせたオブジェクトと関数のセットと考えていました。一方、フレームワークは、特定の方法論(つまりMVC)を中心とし、アプリケーション開発のすべての領域をカバーするライブラリーのコレクションです。


18
@ vba4all:最初に要求されたときに、これをどのように複製できますか?
Noob Saibot、2015

5
最初に作成されたからといって、それが重複ではないという意味ではありません;)重複/非常に類似した質問を特定し、リソース/回答が共有されていることを確認することです(そして最もアクティブ/最も回答された質問が開かれています)
GrayedFox


3
@tuple_cat実際にはあなたのリンクは重複しているようです:このリンクの後に尋ねられました
chharvey

1
いくつかの機能が必要です。ライブラリと呼びます。私たちはフレームワークとフレームワークの助けとなるいくつかの機能が必要です(例:UIKit)。
Kamleshwar

回答:


350

実際、これらの用語は、それらが使用されるコンテキストに応じて、さまざまなことを意味します。

たとえば、Mac OS Xでは、フレームワークは単なるライブラリであり、バンドルにパックされています。バンドル内には、実際の動的ライブラリー(libWhatever.dylib)があります。ベアライブラリとMacのフレームワークの違いは、フレームワークに複数の異なるバージョンのライブラリを含めることができることです。追加のリソース(画像、ローカライズされた文字列、XMLデータファイル、UIオブジェクトなど)を含めることができ、フレームワークが公開されない限り、通常、ライブラリを使用するために必要な.hファイルが含まれます。

したがって、アプリケーションのライブラリを使用するために必要なすべてのものが1つのパッケージ内にあります(.hファイルのないC / C ++ / Objective-Cライブラリは、ライブラリのドキュメントに従って自分で記述しない限り、ほとんど役に立ちません)。移動するファイルの束(MacバンドルはUnixレベルの単なるディレクトリですが、UIはそれを単一のファイルのように扱います。JavaにJARファイルがあるのと同じように、クリックしても通常は表示されません。コンテンツを表示することを明示的に選択しない限り、中身は何ですか)。

ウィキペディアはフレームワークを「流行語」と呼んでいます。ソフトウェアフレームワークを次のように定義します。

ソフトウェアフレームワークは、ソフトウェアシステム(またはサブシステム)の再利用可能な設計です。ソフトウェアフレームワークには、サポートプロジェクト、コードライブラリ、スクリプト言語、またはソフトウェアプロジェクトのさまざまなコンポーネントの開発と接着を支援するその他のソフトウェアが含まれる場合があります。フレームワークのさまざまな部分がAPIを通じて公開される場合があります。

だから私は図書館とはまさに「図書館」だと思います。これは、オブジェクト/関数/メソッド(言語によって異なります)のコレクションであり、アプリケーションはそれに「リンク」しているため、オブジェクト/関数/メソッドを使用できます。これは基本的に、通常複数のアプリケーションで共有できる再利用可能なコードを含むファイルです(同じコードを何度も何度も書く必要はありません)。

フレームワークは、アプリケーション開発で使用するすべてのものにすることができます。ライブラリ、多数のライブラリのコレクション、スクリプトのコレクション、またはアプリケーションを作成するために必要なソフトウェアの一部を使用できます。フレームワークは非常にあいまいな用語です。

これは、「ライブラリ対フレームワーク」というトピックに関するある人に関する記事です。私は個人的にこの記事は非常に議論の余地があると思います。彼がそこで言っていることは間違いではありませんが、彼はフレームワークの複数の定義の1つを選び、それをライブラリの古典的な定義と比較しているだけです。たとえば、サブクラス化のためのフレームワークが必要だと彼は言います。本当に?ライブラリでオブジェクトを定義したり、オブジェクトをリンクしたり、コードでサブクラス化したりできます。そのための「フレームワーク」がどのように必要かはわかりません。ある意味で、彼はむしろフレームワークという用語が今日どのように使用されているかを説明しています。前に言ったように、それは単なる誇大宣伝の言葉です。一部の企業は、通常のライブラリ(クラシックライブラリの任意の意味で)のみをリリースし、それを「フレームワーク」と呼んでいます。


2
興味深いことに、2008年のウィキペディアの記事では、「フレームワーク」を「流行語」として説明しています。
ゼブラフィッシュ2018年

2
IMO、フレームワークは「空白」のプロジェクト環境です。
Kulvar

514

ライブラリーを行い、特定の、明確に定義された操作。

フレームワークは、アプリケーションの骨格を記入して操作の「肉」を定義するスケルトンです。スケルトンにはパーツをリンクするコードがまだありますが、最も重要な作業はアプリケーションによって行われます。

ライブラリの例:ネットワークプロトコル、圧縮、画像操作、文字列ユーティリティ、正規表現評価、数学。操作は自己完結型です。

フレームワークの例: Webアプリケーションシステム、プラグインマネージャー、GUIシステム。フレームワークは概念を定義しますが、アプリケーションはエンドユーザーが気にする基本的な機能を定義します。


10
実際の例では+1。ところで、「ウェブアプリケーションシステム」とはどういう意味ですか?
Pacerier 2014

3
@PacerierはおそらくRails for RubyやSails for Node.jsのような完全なWebアプリケーションを作成できるものでしょう。
gustavohenke 2014

いい答えだ。iOSフレームワークとライブラリに関連するいくつかの例を挙げていただけますか?
NSPratik 2015年

または、締め切りのある完璧主義者のためのWebフレームワーク、Django。
2016年

2
スケルトンに「肉」ではなく「筋肉」を記入することを考えます。「筋肉」が骨格を動かしているので、より正確な類推だと思います。
altgov3en

290

主な違いは、フレームワークが「ハリウッドの原則」に従うということだと思います。つまり、「私たちを呼ばないでください。私たちはあなたを呼びます」

よると、Martin Fowler氏

ライブラリは、基本的にあなたが呼び出すことができるという機能のセットで、これらの日は、通常のクラスに編成します。各呼び出しはいくつかの作業を行い、クライアントに制御を返します。

フレームワークは、内蔵のより行動で、いくつかの抽象的デザインを具現化している。それを使用するためには、サブクラス化するか、独自のクラスに差し込むことにより、いずれかの枠組みの中でのさまざまな場所にあなたの行動を挿入する必要があります。フレームワークのコードは、これらのポイントでコードを呼び出します。


2
@Panos説明ありがとうございます。詳しく説明してください。たとえば、私はFacebookSDKフレームワークを使用しており、このフレームワークからクラスメソッドを呼び出しています。FacebookSDKフレームワークは私のコードで何も呼び出していません。これはあなたの定義の反対です。
Charles Robertson

4
@CharlesRobertson AFAIK FacebookSDKはクライアントライブラリです。フレームワークとして分類することはできず、理由は明らかです(既に気づいたように):FacebookSDKはクライアントコードで何も呼び出していません。さらに、Facebook SDKを次のように定義しています。「ソーシャルプラグイン、Facebookログイン、グラフAPI呼び出しを追加するためのクライアント側の機能の豊富なセット。」フレームワークは表示されません...
Panos

1
@Panosありがとう。FacebookSDKを表すスーツケースのアイコンは、少し誤解を招くと思います。そして「FacebookSDK.framework」という名前。Facebookは「FacebookSDK.dylib」のような名前に変更する必要がありますか?しかし、これを明らかにしてくれてありがとう。正しい定義が何であるかを知るのは良いことです...
Charles Robertson、

それは興味深い定義です。私は最近d3.jsの使用を開始しましたが、一般にフレームワークと見なされていることに気付きました。しかし、私が書いたd3コードは通常のJavaScriptコード内にあるため、この定義をd3に拡張することはできません。
Dileep Kumar Patchigolla

1
@Dileep d3.jsホームページの最初の文には、「D3.jsは、データに基づいてドキュメントを操作するためのJavaScriptライブラリです」と記載されています。フレームワークと考えるのは間違っていると思います。
Panos

243

ライブラリを呼び出します。

フレームワークはあなたを呼び出します。


図書館助け
足場が痛い多く
の涙


12
これを俳句としてリファクタリングできますか?
Derek Tomes

18
@DerekTomes BTW:俳句を追加しました。
Ian Boyd

56
あなたの答えはMETAで議論されています。俳句を翻訳していただけませんか?Googleの翻訳者が非常に愛情を込めて書いているので、ライブラリのサポート、足場の痛み、多くの涙が本当に意味するのかと思っている人はかなり多いと思います:)
Bugs

27
modが最初の2つのコメントを元に戻したことを確認してください。なぜ日本語のテキストが追加されたのか(冗談として要求された)、それは単なる翻訳の試みであり、実際に人気のある日本の詩ではなかったのは理にかなっています。
Zanon 2017年

9
ソビエトロシアでは、枠組みがあなたを呼びます。
ロバートムーア

242

図書館:

これは、単なるルーチン(関数型プログラミング)またはクラス定義(オブジェクト指向プログラミング)のコレクションです。背後にある理由は、単にコードを再利用することです。つまり、他の開発者がすでに作成したコードを取得します。クラスまたはルーチンは、通常、ドメイン固有の領域で特定の操作を定義します。たとえば、アルゴリズムの機能の実装をやり直すことなく、開発者が関数を呼び出すだけの数学ライブラリがあります。

フレームワーク:

フレームワークでは、すべての制御フローがすでに存在しており、コードで記入する必要のある定義済みの白いスポットたくさんあります。フレームワークは通常、より複雑です。これは、スケルトンを定義するアプリケーションが独自の機能を定義するスケルトンを定義します。このようにして、適切なときにフレームワークによってコードが呼び出されます。利点は、開発者がデザインの良し悪しを気にする必要がなく、ドメイン固有の機能を実装することだけです。

ライブラリ、フレームワーク、およびコードイメージ表現:

ライブラリ、フレームワーク、およびコード画像の関係

KeyDifference:

ライブラリとフレームワークの主な違いは、「制御の反転」です。ライブラリからメソッドを呼び出すときは、自分で制御できます。しかし、フレームワークでは、コントロールが逆になりますフレームワークはあなたを呼び出しますソース。

関係:

どちらもプログラマーが使用するAPIを定義しています。これらをまとめると、ライブラリはアプリケーションの特定の機能、フレームワークはアプリケーションのスケルトンと考えることができます。APIはそれらをまとめるためのコネクタです。典型的な開発プロセスは通常、フレームワークから始まり、APIを通じてライブラリで定義された関数に入力します。


14
コントロールの反転 すばらしい詳細な説明!
パトリシア

3
図のように、それをうまくまとめると、フレームワークがライブラリもバンドルすることが多いため、なぜ混乱するのかを示しています。
Didier A.

1
@didibus回答が適切な説明であると思われる場合は、回答を賛成投票して、投稿の閲覧者が実りある回答を簡単に見つけられるようにすることができます。
Durai Amuthan.H 2014

FFmpeg(プログラムではなく、主にプロジェクトのLibAVUtil)はフレームワークであり、libavcodecなどはライブラリですか?
MarcusJ 2014

1
@MarcusJ-LibAVUtilとlibavcodecはどちらもライブラリです
Durai Amuthan.H

110

私はいつもそれを説明したので:

ライブラリはツールです。

フレームワークは生き方です。

どんな小さなパーツでも役立つライブラリを使用できます。プロジェクト全体をコミットする必要があるフレームワーク。


9
この答えは、両方の用語を完全に理解すると、はるかに意味があります。
別の

45

Web開発者の観点から:

  1. ライブラリは別のライブラリと簡単に交換できます。しかし、フレームワークはできません。

    jquery日付ピッカーライブラリが気に入らない場合は、ブートストラップ日付ピッカーやpickadateなどの他の日付ピッカーに置き換えることができます。

    製品を構築したAngularJSが気に入らない場合は、他のフレームワークに置き換えることはできません。コードベース全体を書き直す必要があります。

  2. ほとんどの場合、ライブラリはフレームワークに比べて学習曲線が非常に短くなります。例:underscore.jsはライブラリ、Ember.jsはフレームワークです。


ベストアンサー。シンプル、直接、そして明確。
フェリペサンティアゴ

41

私はコーエンスの答えが好きですが、より技術的な定義は次のとおりです。コードがライブラリを呼び出します。フレームワークがコードを呼び出します。たとえば、GUIフレームワークは、イベントハンドラーを介してコードを呼び出します。Webフレームワークは、いくつかの要求応答モデルを通じてコードを呼び出します。

これは、制御の逆転とも呼ばれます。突然、フレームワークは、ライブラリの場合とは逆に、コードを実行するタイミングと方法を決定します。つまり、フレームワークは、コードの構造化方法にも大きな影響を与えます。


30

この定義を見た場所を忘れてしまいましたが、とてもいいと思います。

ライブラリはコードから呼び出すモジュールであり、フレームワークはコードを呼び出すモジュールです。


6
ただし、libcには、コードを呼び出すqsort()が含まれています。libcがフレームワークになるとは思いません。
マークベイカー

モジュールとはどういう意味ですか?
NattyC

18

フレームワークは、さまざまなライブラリから作成できます。例を見てみましょう。

魚のカレーを作りたいとしましょう。次に、スパイス、その他の成分が必要ですユーティリティの。また、料理を作るためのベースとなるも必要です(これはアプリケーションのデータです)。フレームワークと呼ばれるすべての成分。次に、これらを1つずつまたは組み合わせて使用​​して、最終製品であるフィッシュカレーを作ります。これを、underscore.jsbootstrap.cssbootstrap.jsfontawesomeAngularJSなどで作成されたWebフレームワークと比較してください。例として、 TwitterのブートストラップV.35

今、あなたが言うように1つの成分だけを考えれば、オイル。それはあなたの魚(データ)を台無しにするので、あなたはあなたが望むどんな油も使うことができません。オリーブオイルのみ使用できます。それをunderscore.jsと比較してください。使用したいオイルのブランドはあなた次第です。アメリカのオリーブオイル(underscore.js)またはインドのオリーブオイル(lodash.js)で作られた料理がいくつかあります。これはあなたのアプリケーションの味を変えるだけです。それらはほとんど同じ目的を果たすので、それらの使用は開発者の好みに依存し、簡単に交換できます。

ここに画像の説明を入力してください


フレームワーク:アプリケーションに固有のプロパティと動作を提供するライブラリのコレクション。(全成分)

ライブラリ:データに固有のプロパティと動作を提供する明確に定義された一連の命令。(魚の油)

プラグイン:ライブラリー(ui-router-> AngularJS)または多くのライブラリーの組み合わせ(date-picker-> bootstrap.css + jQuery)用のユーティリティビルド。プラグインなしでは、プラグインは期待どおりに機能しない可能性があります。


PS AngularJSはMVCフレームワークですが、JavaScriptライブラリです。ライブラリはネイティブテクノロジー(この場合はJavaScript)のデフォルトの動作を拡張していると思います。


素敵な説明:)
真野

14

これは私がそれをどう思うか(そして他の人たちによって合理化されているのを見てきました):

ライブラリは、コード内に含まれるものです。また、フレームワークはアプリケーションのコンテナです。



8

ライブラリは、狭い範囲の目的で機能を実装しますが、フレームワークは、幅広い機能をサポートするライブラリのコレクションである傾向があります。たとえば、ライブラリSystem.Drawing.dllは描画機能を処理しますが、.NETフレームワーク全体の一部にすぎません。


3
良い点は、フレームワークがライブラリを含むことができるということです。つまり、最初のフレームワークと2番目のインスタンスのライブラリの両方にすることができます。これは、Apache Wicketなどの多くのWebフレームワークに当てはまるため、処理サイクルを定義するだけでなく、具象UIコンポーネントを実装するクラスの大きなセットも提供します。
OneWorld

.NETは非常に大きなライブラリだと思います。ライブラリと呼ぶには大きすぎるライブラリですが、まだライブラリです。フレームワークは特定の設計を実施し、いじくり回す余地なく制御フローなどを決定します。.NET自体はそれを行いません。ASP.NET MVCはフレームワークであるのに対し、.NETはライブラリであると思います。しかし、MSは市場に出すには良い言葉を必要とします。
nawfal 2014年

6

ライブラリ-クライアントが特定のタスクを実行するのに適していると見なすときに使用できるクラスまたはコンポーネントのセット。
フレームワーク-あなたよりも大きな何かに「プラグイン」するための特定のガイドラインを義務付けます。「フレームワークがあなたの人生を楽にすることができるように」、あなたはアプリケーション/要件に固有の部分を公開された必要な方法で提供するだけです


6

ライブラリは、使いやすさと効率性を目的としています。たとえば、Zendライブラリは、明確に定義されたクラスと関数を使用してさまざまなタスクを実行するのに役立ちます。フレームワークは、通常、MVC(Model -view-controller)(リファレンス)。MVCのようにタスクを分散するための明確に定義されたシステムです。モデルにはデータベース側が含まれ、ビューはUIインターフェース用、コントローラーはビジネスロジック用です。


5

あなたの解釈は私にはかなりいいですね... ライブラリは、他のコードで再利用するためにコンパイルされて自己完結しているものであれば何でも構いません。その内容には文字通りの制限はありません。

フレームワーク一方では、ちょうどあなたの例では、MVCのように、アプリケーション開発のいくつかの特定の分野での使用のための施設の範囲を持つことが期待されています。


5

フレームワークは私たちの作業を行うフレームを提供します...どういうわけか、それは単純なライブラリーよりも「制約的」です。
フレームワークは、一連のライブラリに一貫性を追加することも想定されています。


5

ライブラリは、目標を達成するためのユーティリティのセット(たとえば、ソケット、暗号化など)だと思います。フレームワークはライブラリ+ランタイムEINVIRONNEMENTです。たとえば、ASP.NETはフレームワークです。HTTPリクエストを受け入れ、ページオブジェクトを作成し、lyfe cicleイベントを呼び出します。フレームワークはすべてこれを行います。あなたは、現在のリクエスト!

とにかく、非常に興味深い質問です!


5

この回答の出所は覚えていません(インターネットの.pptで見つけたと思います)が、答えは非常に簡単です。

ライブラリとフレームワークは、アプリケーションで使用でき、特定の「問題」を解決するのに役立つクラス、モジュール、コード(プログラミング言語に依存)のセットです。

その問題は、アプリケーションのログまたはデバッグ情報、グラフの描画、特定のファイル形式(html、pdf、xls)の作成、データベースへの接続、アプリケーションの一部または完全なアプリケーションの作成、またはデザインパターン

これらのすべての問題を解決するためにフレームワークまたはライブラリを使用できますが、通常、フレームワークはより複雑なまたはより大きな問題を解決するのに役立ちますが、両方の主要な定義ではなく、それらの主な違いの継承です。

ライブラリとフレームワークの主な違いは、独自のコード間の依存関係です。つまり、フレームワークを使用するには、FWでほとんどすべてのクラス、モジュール、またはコードを使用する必要がありますが、ライブラリを使用するには、独自のアプリケーションのlib内のいくつかのクラス、モジュール、またはコード

つまり、使用する必要があるアプリでフレームワークを使用するために、フレームワークに50のクラスがある場合、たとえば、コードで10〜15以上のクラスを使用するとします。クラス(そのクラスのオブジェクト)は、フレームワークの他のクラスのメソッドの入力/パラメーターです。.NETフレームワーク、Spring、またはその他のMVCフレームワークを参照してください。

しかし、たとえばログライブラリの場合、コードでLogクラスを使用するだけで、「ログの問題」を解決するのに役立ちます。これは、ログライブラリのコード内にクラスなどのクラスがないことを意味するわけではありませんファイルを処理したり、画面出力を処理したり、データベースを処理したりすることはできますが、コード内でそのクラスに触れたり使用したりすることは決してありません。それが、フレームワークではなくライブラリである理由です。

また、フレームワークやライブラリよりも多くのカテゴリがありますが、それはトピック外です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.