Qual è la differenza tra un framework e una libreria?


865

Qual è la differenza tra un framework e una libreria ?

Ho sempre pensato a una biblioteca come a un insieme di oggetti e funzioni che si concentra sulla risoluzione di un problema particolare o di un'area specifica di sviluppo dell'applicazione (ovvero l'accesso al database); e un framework d'altra parte come una raccolta di librerie incentrate su una particolare metodologia (ad esempio MVC) e che copre tutte le aree di sviluppo delle applicazioni.


18
@ vba4all: come può essere un duplicato quando è stato chiesto per primo?
Noob Saibot,

5
Solo perché è stato creato per primo non significa che non è un duplicato;) si tratta solo di identificare domande duplicate / molto simili e garantire che le risorse / risposte siano condivise (e che sia aperta la domanda più attiva / con la migliore risposta)
GrayedFox

2
Possibile duplicato di Framework vs. Toolkit vs. Library
emlai

3
@tuple_cat in realtà il tuo link sembra essere il duplicato: è stato chiesto dopo questo
chharvey,

1
Abbiamo bisogno di alcune funzionalità, chiamiamo Library. Abbiamo bisogno di alcune funzionalità di cui ci occuperemo per framework e Framework chiama il nostro codice (ad esempio UIKit).
Kamleshwar,

Risposte:


350

In realtà questi termini possono significare molte cose diverse a seconda del contesto in cui vengono utilizzate.

Ad esempio, su Mac OS X i framework sono solo librerie, raggruppate in un pacchetto. All'interno del bundle troverai una vera libreria dinamica (libWhatever.dylib). La differenza tra una libreria vuota e il framework su Mac è che un framework può contenere più versioni diverse della libreria. Può contenere risorse extra (immagini, stringhe localizzate, file di dati XML, oggetti UI, ecc.) E, a meno che il framework non sia reso pubblico, di solito contiene i file .h necessari per usare la libreria.

Quindi hai tutto in un unico pacchetto di cui hai bisogno per usare la libreria nella tua applicazione (una libreria C / C ++ / Objective-C senza file .h è piuttosto inutile, a meno che tu non li scriva tu stesso secondo una documentazione della libreria), invece di un un mucchio di file da spostare (un bundle Mac è solo una directory a livello Unix, ma l'interfaccia utente lo tratta come un singolo file, praticamente come se avessi file JAR in Java e quando fai clic su di esso, di solito non vedi cosa c'è dentro, a meno che tu non scelga esplicitamente di mostrare il contenuto).

Wikipedia chiama framework una "parola d'ordine". Definisce un framework software come

Un framework software è un progetto riutilizzabile per un sistema software (o sottosistema). Un framework software può includere programmi di supporto, librerie di codici, un linguaggio di scripting o altri software per aiutare a sviluppare e incollare i diversi componenti di un progetto software. Varie parti del framework possono essere esposte tramite un'API.

Quindi direi che una biblioteca è proprio questa, "una biblioteca". È una raccolta di oggetti / funzioni / metodi (a seconda della lingua) e dell'applicazione "collegamenti" contro di essa e quindi può utilizzare oggetti / funzioni / metodi. È fondamentalmente un file contenente codice riutilizzabile che di solito può essere condiviso tra più applicazioni (non è necessario scrivere più volte lo stesso codice).

Un framework può essere tutto ciò che usi nello sviluppo di applicazioni. Può essere una libreria, una raccolta di molte librerie, una raccolta di script o qualsiasi componente software necessario per creare l'applicazione. Framework è solo un termine molto vago.

Ecco un articolo su un ragazzo riguardante l'argomento " Library vs. Framework ". Personalmente penso che questo articolo sia altamente discutibile. Non è sbagliato quello che sta dicendo lì, tuttavia, sta solo scegliendo una delle molteplici definizioni di framework e la confronta con la classica definizione di libreria. Ad esempio, dice che hai bisogno di un framework per la sottoclasse. Veramente? Posso avere un oggetto definito in una libreria, posso collegarmi contro di esso e sottoclassarlo nel mio codice. Non vedo come ho bisogno di un "framework" per quello. In qualche modo spiega piuttosto come viene usato il termine framework al giorno d'oggi. È solo una parola in voga, come ho detto prima. Alcune aziende rilasciano solo una normale libreria (in qualche senso di una libreria classica) e la definiscono un "framework" perché suona più elegante.


2
Interessante che nel 2008 l'articolo di Wikipedia descrivesse "framework" come una "parola d'ordine".
Zebrafish

2
IMO, un framework è l'ambiente del progetto "vuoto".
Kulvar,

514

Una libreria esegue operazioni specifiche e ben definite.

Un framework è uno scheletro in cui l'applicazione definisce la "carne" dell'operazione compilando lo scheletro. Lo scheletro ha ancora il codice per collegare le parti, ma il lavoro più importante viene svolto dall'applicazione.

Esempi di librerie: protocolli di rete, compressione, manipolazione delle immagini, utilità delle stringhe, valutazione delle espressioni regolari, matematica. Le operazioni sono autonome.

Esempi di framework: sistema di applicazioni Web, gestore plug-in, sistema di interfaccia grafica. Il framework definisce il concetto, ma l'applicazione definisce le funzionalità fondamentali che interessano gli utenti finali.


10
+1 per esempi reali. A proposito, ti dispiace chiarire cosa intendi per "sistema di applicazioni web"?
Pacerier,

3
@Pacerier probabilmente qualcosa che ti consente di creare un'applicazione web completa, come Rails for Ruby o Sails for Node.js.
Gustavohenke,

Bella risposta. Puoi fornire altri esempi relativi ai framework e alle librerie iOS?
NSPratik,

o Django, il framework web per perfezionisti con scadenze.
attacco aereo

2
Penserei di riempire lo scheletro con "muscoli" piuttosto che "carne". Penso che sia un'analogia più accurata perché i "muscoli" stanno mettendo in moto lo scheletro.
altgov3

290

Penso che la differenza principale sia che i quadri seguono il " principio di Hollywood ", cioè "non chiamarci, ti chiameremo".

Secondo Martin Fowler :

Una biblioteca è essenzialmente un insieme di funzioni che puoi chiamare, oggigiorno di solito organizzate in classi. Ogni chiamata fa un po 'di lavoro e restituisce il controllo al client.

Un framework incarna un disegno astratto, con più comportamenti incorporati. Per usarlo è necessario inserire il proprio comportamento in vari punti del framework effettuando la sottoclasse o collegando le proprie classi. Il codice del framework chiama quindi il tuo codice in questi punti.


2
@Panos Grazie per la spiegazione, ma puoi elaborare. Ad esempio, sto usando il framework FacebookSDK e sto chiamando i metodi di classe da questo framework. Il framework FacebookSDK non chiama nulla nel mio codice, che è l'opposto della tua definizione, cioè "non chiamarci, ti chiameremo".
Charles Robertson,

4
@CharlesRobertson AFAIK FacebookSDK è una libreria client. Non può essere classificato come un framework e il motivo è ovvio (come hai già notato): FacebookSDK non chiama nulla nel codice client. Inoltre, Facebook definisce l'SDK come segue: "Un ricco set di funzionalità lato client per l'aggiunta di plugin social, accesso a Facebook e chiamate API Graph". Nessuna indicazione per il framework ...
Panos,

1
@Panos Grazie. Immagino che l'icona della valigia che rappresenta FacebookSDK sia un po 'fuorviante allora. E il nome "FacebookSDK.framework". Facebook dovrebbe rinominarlo in qualcosa come 'FacebookSDK.dylib'? Ma grazie per aver chiarito questo. È bello sapere qual è la definizione corretta ...
Charles Robertson,

Questa è una definizione interessante. Di recente ho iniziato a utilizzare d3.js e ho osservato che è generalmente considerato un framework. Ma qualunque codice d3 abbia scritto è all'interno di un normale codice javascript, quindi non sono in grado di estendere questa definizione a d3.
Dileep Kumar Patchigolla,

1
@Dileep La homepage di d3.js afferma nella prima frase: "D3.js è una libreria JavaScript per la manipolazione di documenti basata sui dati". Penso che sia sbagliato essere considerati come un quadro.
Panos,

243

Tu chiami Biblioteca.

Framework ti chiama.


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


12
Potresti refactificare questo come haiku?
Derek Tomes,

18
@DerekTomes BTW: ho aggiunto il modulo haiku .
Ian Boyd,

56
La tua risposta è in discussione in META . Ti andrebbe di tradurre l'haiku? Penso che molti di noi si stiano chiedendo se ciò significhi davvero Aiutare la biblioteca, il ponteggio fa male, molte lacrime come dice con affetto il traduttore di Google :)
Bug

27
Bello vedere che una mod ha annullato i primi due commenti. Ora ha senso il motivo per cui è stato aggiunto il testo giapponese (è stato richiesto come uno scherzo) e che era solo un tentativo di traduzione, e non una vera poesia giapponese popolare.
Zanon

9
Nella Russia sovietica, il framework ti chiama.
Robert Moore,

242

Biblioteca:

È solo una raccolta di routine (programmazione funzionale) o definizioni di classe (programmazione orientata agli oggetti). Il motivo dietro è semplicemente il riutilizzo del codice , cioè ottenere il codice che è già stato scritto da altri sviluppatori. Le classi o le routine normalmente definiscono operazioni specifiche in un'area specifica del dominio . Ad esempio, ci sono alcune librerie di matematica che possono consentire allo sviluppatore di chiamare semplicemente la funzione senza ripetere l'implementazione di come funziona un algoritmo.

Struttura:

Nel framework, tutto il flusso di controllo è già lì e ci sono un sacco di punti bianchi predefiniti che dovremmo compilare con il nostro codice . Un framework è normalmente più complesso. Si definisce uno scheletro in cui l'applicazione definisce le proprie caratteristiche per riempire lo scheletro. In questo modo, il tuo codice verrà chiamato dal framework quando appropriato. Il vantaggio è che gli sviluppatori non devono preoccuparsi se un progetto è valido o meno, ma solo sull'implementazione di funzioni specifiche del dominio.

Libreria, Framework e rappresentazione dell'immagine del codice:

Libreria, Framework e la tua relazione di immagine del codice

KeyDifference:

La differenza chiave tra una libreria e un framework è "Inversion of Control" . Quando chiami un metodo da una libreria, hai il controllo. Ma con un framework, il controllo è invertito: il framework ti chiama . Fonte.

Relazione:

Entrambi hanno definito l'API, che viene utilizzata dai programmatori. Per metterli insieme, possiamo pensare a una libreria come una certa funzione di un'applicazione, un framework come lo scheletro dell'applicazione e un'API è un connettore per metterli insieme. Un tipico processo di sviluppo inizia normalmente con un framework e compila le funzioni definite nelle librerie tramite API.


14
Inversione del controllo Grande spiegazione approfondita!
Patricia,

3
Come l'immagine, la riassume bene e mostra anche perché a volte le persone si confondono, perché i framework spesso raggruppano anche le librerie.
Didier A.

1
@didibus Se ritieni che la risposta fornisca una buona spiegazione, potresti votare la risposta in modo che gli spettatori di post possano facilmente trovare la risposta fruttuosa.
Durai Amuthan,

Quindi FFmpeg (non il programma, ma principalmente LibAVUtil dal progetto) è un framework, e libavcodec, ecc. Sono librerie?
MarcusJ,

1
@MarcusJ - Sia LibAVUtil che libavcodec sono librerie
Durai Amuthan.H

110

Come l'ho sempre descritto:

Una libreria è uno strumento.

Un quadro è un modo di vivere.

Una libreria che puoi usare qualunque piccola parte ti aiuti. Un framework a cui devi impegnare l'intero progetto.


9
Questa risposta ha molto più senso dopo aver compreso completamente entrambi i termini.
un altro

45

Dal punto di vista dello sviluppatore Web:

  1. La libreria può essere facilmente sostituibile da un'altra libreria. Ma il quadro non può.

    Se non ti piace la libreria di selezione della data jquery, puoi sostituirla con un'altra selezione della data come la selezione della data di bootstrap o il pickadate.

    Se non ti piace AngularJS su cui hai costruito il tuo prodotto, non puoi semplicemente sostituirlo con altri framework. Devi riscrivere l'intera base di codice.

  2. Per lo più la biblioteca richiede una curva di apprendimento molto inferiore rispetto a Frameworks. Ad esempio: underscore.js è una libreria, Ember.js è un framework.


Migliore risposta. Semplice, diretto e chiaro.
Felipe Santiago,

41

Mi piace la risposta di Cohens, ma una definizione più tecnica è: il tuo codice chiama una libreria. Un framework chiama il tuo codice . Ad esempio un framework GUI chiama il tuo codice tramite i gestori di eventi. Un web framework chiama il tuo codice attraverso un modello di richiesta-risposta.

Questo è anche chiamato inversione di controllo - improvvisamente il framework decide quando e come eseguire il codice anziché viceversa come con le librerie. Ciò significa che un framework ha anche un impatto molto maggiore su come strutturare il codice.


30

Dimentico dove ho visto questa definizione, ma penso che sia abbastanza carino.

Una libreria è un modulo che chiami dal tuo codice e un framework è un modulo che chiama il tuo codice.


6
Ma libc include qsort (), che chiama il tuo codice. Non penso che questo renda un libc un framework.
Mark Baker,

Cosa si intende per modulo?
NattyC,

18

Un framework può essere creato da diverse librerie. Facciamo un esempio.

Diciamo che vuoi cucinare un curry di pesce. Quindi hai bisogno di ingredienti come olio , spezie e altre utilità . Hai anche bisogno di pesce su cui preparare il tuo piatto (Questi sono i dati della tua applicazione). tutti gli ingredienti insieme hanno chiamato un quadro . Ora li userai uno per uno o in combinazione per rendere il tuo pesce al curry che è il tuo prodotto finale . Confrontalo con un framework Web composto da underscore.js , bootstrap.css , bootstrap.js , fontawesome , AngularJS ecc. Ad esempio, Twitter Bootstrap v.35.

Ora, se consideri solo un ingrediente, come ad esempio l' olio . Non puoi usare l'olio che vuoi perché rovinerebbe i tuoi pesci (dati). Puoi usare solo olio d'oliva . Confrontalo con underscore.js . Ora quale marca di olio vuoi usare dipende da te. Alcuni piatti sono stati realizzati con olio d'oliva americano (underscore.js) o olio d'oliva indiano (lodash.js). Questo cambierà solo il gusto della tua applicazione. Poiché hanno quasi lo stesso scopo, il loro utilizzo dipende dalle preferenze dello sviluppatore e sono facilmente sostituibili.

inserisci qui la descrizione dell'immagine


Framework : una raccolta di librerie che forniscono proprietà e comportamenti unici alla tua applicazione. (Tutti gli ingredienti)

Libreria : una serie ben definita di istruzioni che forniscono proprietà e comportamenti unici ai tuoi dati. (Olio su pesce)

Plugin : una build di utilità per una libreria (ui-router -> AngularJS) o molte librerie in combinazione (selettore della data -> bootstrap.css + jQuery) senza le quali il plug-in ora potrebbe funzionare come previsto.


PS AngularJS è un framework MVC ma una libreria JavaScript. Perché credo che Library estenda il comportamento predefinito della tecnologia nativa (JavaScript in questo caso).


Bella spiegazione :)
Mano

14

Ecco come ci penso (e l'ho visto razionalizzato da altri):

Una libreria è qualcosa contenuta nel tuo codice. E un framework è un contenitore per la tua applicazione.



8

Una libreria implementa funzionalità per uno scopo limitato, mentre un framework tende ad essere una raccolta di librerie che fornisce supporto per una gamma più ampia di funzionalità. Ad esempio, la libreria System.Drawing.dll gestisce la funzionalità di disegno, ma è solo una parte dell'intero framework .NET.


3
Un buon punto è che un framework può contenere librerie . Quindi, può essere sia un framework nella prima che una libreria nella seconda istanza. Come nel caso di molti framework Web come Apache Wicket , che definiscono il ciclo di elaborazione ma forniscono anche un ampio insieme di classi che implementano componenti dell'interfaccia utente concreti.
OneWorld

Credo che .NET sia una libreria molto grande. Una biblioteca troppo grande per essere chiamata biblioteca, ma comunque una biblioteca. Frameworks applica un certo design, decide il flusso di controllo ecc. Con poco spazio per armeggiare. .NET in quanto tale non lo fa. Credo che .NET sia una libreria mentre ASP.NET MVC sia un framework. Ma la SM ha bisogno di buone parole sul mercato.
nawfal,

6

Libreria: qualsiasi set di classi o componenti che possono essere utilizzati come il client ritiene idonei a svolgere un determinato compito.
Framework: richiede alcune linee guida per il "plug-in" in qualcosa di più grande di te. Fornisci semplicemente i pezzi specifici per la tua applicazione / i requisiti in un modo pubblicato pubblicato, in modo che "il framwework può semplificarti la vita"


6

Le librerie sono per facilità d'uso ed efficienza. Ad esempio, puoi dire che la libreria Zend ci aiuta a svolgere diverse attività con le sue classi e funzioni ben definite. Mentre un framework è qualcosa che di solito forza un certo modo di implementare una soluzione, come MVC (Modello -view-controller) (riferimento) . È un sistema ben definito per la distribuzione di attività come in MVC. Il modello contiene il lato database, le visualizzazioni sono per l'interfaccia utente e i controller sono per la logica aziendale.


5

La tua interpretazione suona piuttosto bene per me ... Una libreria potrebbe essere qualsiasi cosa compilata e autonoma per il riutilizzo in altri codici, non c'è letteralmente alcuna restrizione sul suo contenuto.

Un framework d'altra parte dovrebbe avere una gamma di servizi da utilizzare in una specifica arena di sviluppo di applicazioni, proprio come il tuo esempio, MVC.


5

Penso che tu abbia individuato abbastanza bene la differenza: il framework fornisce un frame in cui facciamo il nostro lavoro ... In qualche modo, è più "vincolante" di una semplice libreria.
Il framework dovrebbe inoltre aggiungere coerenza a un set di librerie.


5

Penso che la biblioteca sia un insieme di utilità per raggiungere un obiettivo (ad esempio socket, crittografia, ecc.). Framework è libreria + RUNTIME EINVIRONNEMENT. Ad esempio, ASP.NET è un framework: accetta richieste HTTP, crea oggetto pagina, richiama eventi ciclica lyfe, ecc. Framework fa tutto questo, scrivi un po 'di codice che verrà eseguito in un momento specifico del ciclo di vita di richiesta corrente!

Comunque, domanda molto interessante!


5

Non ricordo la fonte di questa risposta (immagino di averla trovata in un .ppt in Internet), ma la risposta è abbastanza semplice.

Una libreria e un framework sono un insieme di classi, moduli e / o codice (a seconda del linguaggio di programmazione) che possono essere utilizzati nelle applicazioni e consentono di risolvere un "problema" specifico.

Tale problema può essere il log o il debug delle informazioni in un'applicazione, disegnare grafici, creare un formato file specifico (html, pdf, xls), connettersi a una base di dati, creare una parte di un'applicazione o un'applicazione completa o un codice applicato a un Modello di progettazione .

Puoi avere un Framework o una Libreria per risolvere tutti questi problemi e molti altri, normalmente i framework ti aiutano a risolvere problemi più complessi o più grandi, ma che una consistenza della loro differenza principale, non una definizione principale per entrambi.

La differenza principale tra una libreria e un framework è la dipendenza tra il proprio codice, in altre parole per utilizzare un framework è necessario utilizzare quasi tutte le classi, i moduli o il codice nell'FW, ma per utilizzare una libreria è possibile utilizzare uno o poche classi, moduli o codice nella lib nella propria applicazione

Ciò significa che se un Framework ha, ad esempio, 50 classi per utilizzare il framework in un'app che devi usare, diciamo, 10-15 o più classi nel tuo codice, perché è così che viene progettato un Framework, alcuni le classi (oggetti di quelle classi) sono input / parametri per metodi in altre classi nel framework. Vedere .NET framework, Spring o qualsiasi framework MVC.

Ma ad esempio una libreria di log, puoi semplicemente usare una classe Log nel tuo codice e ti aiuta a risolvere il "problema di registrazione", ciò non significa che la libreria di log non abbia più classi nel suo codice, come le classi per gestire file, gestire output dello schermo o persino basi di dati, ma non tocchi mai / usi quelle classi nel tuo codice, e questo è il motivo per cui è una libreria e non un framework.

E ci sono anche più categorie di Frameworks e Librerie, ma questo è fuori tema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.