Jaka jest różnica między frameworkiem a biblioteką? [Zamknięte]

865

Jaka jest różnica między frameworkiem a biblioteką ?

Zawsze myślałem o bibliotece jako zestawie obiektów i funkcji, które koncentrują się na rozwiązaniu określonego problemu lub określonego obszaru rozwoju aplikacji (tj. Dostępu do bazy danych); z drugiej zaś - framework jako zbiór bibliotek skoncentrowany na określonej metodologii (tj. MVC) i obejmujący wszystkie obszary rozwoju aplikacji.

anbanm
źródło
18
@ vba4all: Jak może to być duplikat, gdy najpierw go zapytano?
Noob Saibot
5
To, że zostało stworzone jako pierwsze, nie oznacza, że ​​nie jest duplikatem;) chodzi tylko o identyfikację zduplikowanych / bardzo podobnych pytań i zapewnienie dzielenia się zasobami / odpowiedziami (a najbardziej aktywne / najlepiej odpowiedziane pytanie otwarte)
GrayedFox
2
Możliwy duplikat Framework vs. Toolkit vs. Library
emlai
3
@tuple_cat faktycznie twój link wydaje się być duplikatem: został poproszony po tym
chharvey
1
Potrzebujemy trochę funkcjonalności, nazywamy bibliotekę. Potrzebujemy trochę funkcjonalności, skorzystamy z frameworka, a Framework wywołuje nasz kod (np. UIKit).
Kamleshwar,

Odpowiedzi:

350

W rzeczywistości te terminy mogą oznaczać wiele różnych rzeczy w zależności od kontekstu, w jakim są używane.

Na przykład w systemie Mac OS X frameworki to po prostu biblioteki spakowane w pakiet. W pakiecie znajdziesz rzeczywistą bibliotekę dynamiczną (libWhthing.dylib). Różnica między samą biblioteką a strukturą na komputerze Mac polega na tym, że struktura może zawierać wiele różnych wersji biblioteki. Może zawierać dodatkowe zasoby (obrazy, zlokalizowane ciągi, pliki danych XML, obiekty interfejsu użytkownika itp.). O ile framework nie zostanie udostępniony publicznie, zwykle zawiera niezbędne pliki .h potrzebne do korzystania z biblioteki.

Tak więc masz wszystko w jednym pakiecie, którego potrzebujesz do korzystania z biblioteki w swojej aplikacji (biblioteka C / C ++ / Objective-C bez plików .h jest dość bezużyteczna, chyba że napiszesz ją samodzielnie zgodnie z dokumentacją biblioteki), zamiast kilka plików do przeniesienia (pakiet Mac to tylko katalog na poziomie Unixa, ale interfejs użytkownika traktuje go jak pojedynczy plik, podobnie jak masz pliki JAR w Javie, a kiedy go klikniesz, zwykle nie widzisz co jest w środku, chyba że wyraźnie wybierzesz wyświetlanie treści).

Wikipedia nazywa framework „modnym słowem”. Definiuje strukturę oprogramowania jako

Struktura oprogramowania jest projektem wielokrotnego użytku dla systemu oprogramowania (lub podsystemu). Struktura oprogramowania może obejmować programy pomocnicze, biblioteki kodów, język skryptowy lub inne oprogramowanie, które pomagają opracowywać i sklejać różne elementy projektu oprogramowania. Różne części frameworka mogą być udostępniane za pośrednictwem interfejsu API.

Powiedziałbym więc, że biblioteka to po prostu „biblioteka”. Jest to zbiór obiektów / funkcji / metod (w zależności od języka), a twoja aplikacja „łączy” się z nim, a zatem może korzystać z obiektów / funkcji / metod. Zasadniczo jest to plik zawierający kod wielokrotnego użytku, który zwykle może być współużytkowany przez wiele aplikacji (nie musisz ciągle pisać tego samego kodu).

Framework może być wszystkim, czego używasz do tworzenia aplikacji. Może to być biblioteka, zbiór wielu bibliotek, zbiór skryptów lub dowolne oprogramowanie potrzebne do utworzenia aplikacji. Ramy są po prostu bardzo niejasnym terminem.

Oto artykuł o jakimś facecie na temat „ Biblioteka vs. środowisko ”. Osobiście uważam, że ten artykuł jest wysoce dyskusyjny. Nie jest jednak źle, co tam mówi, po prostu wybiera jedną z wielu definicji frameworka i porównuje ją z klasyczną definicją biblioteki. Np. Mówi, że potrzebujesz ram dla podklas. Naprawdę? Mogę mieć obiekt zdefiniowany w bibliotece, mogę połączyć się z nim i podklasować go w moim kodzie. Nie rozumiem, jak potrzebuję do tego „ram”. W pewien sposób wyjaśnia raczej, w jaki sposób obecnie używa się terminu „framework”. To tylko hiperboliczne słowo, jak powiedziałem wcześniej. Niektóre firmy wydają tylko zwykłą bibliotekę (w jakimkolwiek sensie klasyczną bibliotekę) i nazywają ją „strukturą”, ponieważ brzmi to bardziej fantazyjnie.

Mecki
źródło
2
Ciekawe, że w 2008 r. Artykuł Wikipedii opisał „framework” jako „modne słowo”.
Zebrafish
2
IMO, środowisko to „puste” środowisko projektu.
Kulvar
514

Biblioteka wykonuje konkretne, ściśle określone operacje.

Ramy jest szkielet, w którym aplikacja określa się „mięso” operacji wypełnić szkielet. Szkielet wciąż ma kod do łączenia części, ale najważniejsza praca jest wykonywana przez aplikację.

Przykłady bibliotek: protokoły sieciowe, kompresja, manipulacja obrazem, narzędzia łańcuchowe, ocena wyrażeń regularnych, matematyka. Operacje są samodzielne.

Przykłady ram: system aplikacji WWW, menedżer wtyczek, system GUI. Ramy definiują koncepcję, ale aplikacja określa podstawową funkcjonalność, o którą dbają użytkownicy końcowi.

Jason Cohen
źródło
10
+1 za prawdziwe przykłady. A właściwie, czy masz coś przeciwko wyjaśnieniu, co rozumiesz przez „system aplikacji internetowych”?
Pacerier
3
@Pacerier prawdopodobnie coś, co pozwala stworzyć pełną aplikację internetową, taką jak Rails for Ruby lub Sails for Node.js.
gustavohenke,
Niezła odpowiedź. Czy możesz podać więcej przykładów związanych ze strukturami i bibliotekami iOS?
NSPratik
lub Django, platforma internetowa dla perfekcjonistów z terminami.
nalot
2
Myślałem o wypełnieniu szkieletu „mięśniami”, a nie „mięsem”. Myślę, że jest to dokładniejsza analogia, ponieważ „mięśnie” wprawiają szkielet w ruch.
altgov3en
290

Myślę, że główna różnica polega na tym, że ramy są zgodne z „ zasadą Hollywood ”, tzn. „Nie dzwoń do nas, my nazywamy cię”.

Według Martina Fowlera :

Biblioteka jest w istocie zbiorem funkcji, które można nazwać, te dni zazwyczaj organizowane w klasach. Każde połączenie wykonuje pewną pracę i zwraca kontrolę klientowi.

Ramy ucieleśnia pewne streszczenie projektu, z zachowaniem większej zbudowany w. W celu wykorzystania go trzeba wstawić swoje zachowanie w różnych miejscach w ramach bądź przez instacji lub podłączając własnych klas. Kod frameworka następnie wywołuje twój kod w tych punktach.

Panos
źródło
2
@Panos Dziękuję za wyjaśnienie, ale możesz opracować. Na przykład używam frameworku FacebookSDK i z tej frakcji wywołuję metody klasowe. Struktura FacebookSDK nie wywołuje niczego w moim kodzie, co jest przeciwieństwem twojej definicji, tj. „Nie dzwoń do nas, my zadzwonimy”.
Charles Robertson,
4
@CharlesRobertson AFAIK FacebookSDK to biblioteka klienta. Nie można go zaklasyfikować jako ramy, a powód jest oczywisty (jak już zauważyłeś): FacebookSDK nie wywołuje niczego w kodzie klienta. Ponadto Facebook definiuje zestaw SDK w następujący sposób: „Bogaty zestaw funkcji po stronie klienta do dodawania wtyczek społecznościowych, logowania do Facebooka i wywołań API Graph”. Brak wskazań dla ram ...
Panos
1
@Panos Thanks. Myślę, że ikona walizki, która reprezentuje FacebookSDK, jest wtedy trochę myląca. I nazwa „FacebookSDK.framework”. Facebook powinien zmienić nazwę na coś takiego jak „FacebookSDK.dylib”? Ale dzięki za wyjaśnienie tego. Dobrze wiedzieć, jaka jest poprawna definicja ...
Charles Robertson,
To ciekawa definicja. Niedawno zacząłem używać d3.js i zauważyłem, że jest ogólnie uważany za framework. Ale dowolny kod d3, który napisałem, mieści się w zwykłym kodzie javascript, więc nie jestem w stanie rozszerzyć tej definicji na d3.
Dileep Kumar Patchigolla
1
@Dileep Strona główna d3.js stwierdza w pierwszym zdaniu: „D3.js to biblioteka JavaScript do manipulowania dokumentami na podstawie danych”. Uważam, że błędem jest uznawanie go za ramy.
Panos,
243

Dzwonisz do biblioteki.

Framework wzywa cię.


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

Ian Boyd
źródło
12
Czy mógłbyś zmienić to jako haiku?
Derek Tomes
18
@DerekTomes BTW: dodałem formularz haiku .
Ian Boyd
56
Twoja odpowiedź jest omawiana w META . Czy chciałbyś przetłumaczyć haiku? Myślę, że wielu z nas zastanawia się, czy to naprawdę oznacza Pomoc bibliotece, rusztowanie boli, wiele łez, jak to czule tłumaczy Google :)
Błędy
27
Dobrze widzieć, że mod usunął pierwsze dwa komentarze. Teraz ma sens, dlaczego dodano japoński tekst (zażądano go jako żart) i że była to tylko próba tłumaczenia, a nie prawdziwy popularny japoński wiersz.
Zanon,
9
W Rosji Radzieckiej ramy cię nazywają.
Robert Moore
242

Biblioteka:

To jest tylko zbiór z rutyny (programowanie funkcjonalne) lub definicje klas (Object Oriented Programming). Powodem jest po prostu ponowne użycie kodu , tj. Pobranie kodu, który został już napisany przez innych programistów. Klasy lub procedury zwykle definiują określone operacje w obszarze specyficznym dla domeny . Na przykład istnieją biblioteki matematyczne, które pozwalają programistom wywoływać funkcję bez ponawiania implementacji działania algorytmu.

Struktura:

W ramach całego przepływu kontroli już tam jest i istnieje kilka predefiniowanych białych plam , które powinniśmy wypełnić naszym kodem . Ramy są zwykle bardziej złożone. To definiuje szkielet gdzie aplikacja określa swoje funkcje do wypełnienia szkieletu. W ten sposób twój kod będzie wywoływany przez framework, gdy jest to odpowiednie. Korzyścią jest to, że programiści nie muszą się martwić, czy projekt jest dobry, czy nie, ale tylko o implementację funkcji specyficznych dla domeny.

Biblioteka, struktura i reprezentacja Twojego kodu:

Relacja biblioteki, frameworka i twojego kodu

KeyDifference:

Kluczową różnicą między biblioteką a szkieletem jest „Odwrócenie kontroli” . Kiedy wywołujesz metodę z biblioteki, masz kontrolę. Ale w przypadku frameworka kontrola jest odwrócona: frameworka wzywa cię . Źródło.

Relacja:

Oba zdefiniowały API, z którego mogą korzystać programiści. Podsumowując, możemy myśleć o bibliotece jako o pewnej funkcji aplikacji, frameworku jako szkielecie aplikacji, a API to konektor do ich łączenia. Typowy proces programowania zwykle rozpoczyna się od frameworka i wypełnia funkcje zdefiniowane w bibliotekach poprzez API.

Durai Amuthan.H
źródło
14
Odwrócenie kontroli Świetne szczegółowe wyjaśnienie!
Patricia
3
Podobnie jak obrazek, podsumowuje to ładnie i pokazuje również, dlaczego czasami ludzie się mylą, ponieważ frameworki często również pakują biblioteki.
Didier A.,
1
@didibus Jeśli uważasz, że odpowiedź daje dobre wyjaśnienie, możesz ją głosować, aby widzowie postów mogli łatwo znaleźć owocną odpowiedź.
Durai Amuthan.H
Więc FFmpeg (nie program, ale głównie LibAVUtil z projektu) jest strukturą, a libavcodec itp. To biblioteki?
MarcusJ
1
@MarcusJ - Zarówno LibAVUtil, jak i libavcodec są bibliotekami
Durai Amuthan.H
110

Jak zawsze to opisywałem:

Biblioteka to narzędzie.

Ramy to sposób na życie.

Biblioteka, z której możesz korzystać, co najmniej ci pomaga. Framework, do którego musisz zobowiązać cały projekt.

James Curran
źródło
9
Ta odpowiedź ma o wiele większy sens po całkowitym zrozumieniu obu terminów.
kolejne
45

Z perspektywy programisty:

  1. Biblioteka może być łatwo zastąpiona inną biblioteką. Ale ramy nie mogą.

    Jeśli nie podoba Ci się biblioteka wyboru daty jquery, możesz zastąpić ją innym wyborem, takim jak próbnik daty ładowania lub pickadate.

    Jeśli nie lubisz AngularJS, na którym zbudowałeś swój produkt, nie możesz po prostu zastąpić go innymi ramami. Musisz przepisać całą bazę kodu.

  2. Przeważnie biblioteka zajmuje znacznie mniej krzywej uczenia się w porównaniu do ram. Np .: underscore.js to biblioteka, Ember.js to framework.

Fizer Khan
źródło
Najlepsza odpowiedź. Prosty, bezpośredni i przejrzysty.
Felipe Santiago,
41

Podoba mi się odpowiedź Cohena, ale bardziej techniczną definicją jest: Twój kod wywołuje bibliotekę. Framework wywołuje twój kod . Na przykład środowisko GUI wywołuje kod za pośrednictwem procedur obsługi zdarzeń. Struktura internetowa wywołuje twój kod za pomocą jakiegoś modelu żądanie-odpowiedź.

Nazywa się to również inwersją kontroli - nagle środowisko decyduje, kiedy i jak wykonać kod, a nie odwrotnie, jak w przypadku bibliotek. Oznacza to, że framework ma również znacznie większy wpływ na sposób strukturyzacji kodu.

JacquesB
źródło
30

Zapominam, gdzie widziałem tę definicję, ale myślę, że jest całkiem niezła.

Biblioteka to moduł, który wywołujesz z kodu, a framework to moduł, który wywołuje twój kod.

Moe
źródło
6
Ale libc zawiera qsort (), która wywołuje twój kod. Nie sądzę, że to czyni z libc platformę.
Mark Baker
Co rozumie się przez moduł?
NattyC
18

Framework może być wykonany z różnych bibliotek. Weźmy przykład.

Powiedzmy, że chcesz ugotować curry rybne. Następnie potrzebujesz składników, takich jak olej , przyprawy i inne narzędzia . Potrzebujesz również ryb, które są twoją bazą do przygotowania potrawy (są to dane twojej aplikacji). wszystkie składniki razem zwane ramą . Teraz użyjesz ich pojedynczo lub w połączeniu, aby ryba curry była twoim produktem końcowym . Porównaj to ze strukturą internetową wykonaną z underscore.js , bootstrap.css , bootstrap.js , fontawesome , AngularJS itp. Na przykład Twitter Bootstrap v.35.

Teraz, jeśli weźmiesz pod uwagę tylko jeden składnik, na przykład olej . Nie możesz użyć żadnego oleju, który chcesz, bo wtedy zrujnuje on twoje ryby (dane). Możesz używać tylko oliwy z oliwek . Porównaj to z underscore.js . Teraz to, jakiej marki oleju chcesz użyć, zależy od Ciebie. Niektóre dania zostały wykonane z amerykańskiej oliwy z oliwek (underscore.js) lub indyjskiej oliwy z oliwek (lodash.js). To zmieni tylko smak twojej aplikacji. Ponieważ służą one prawie do tego samego celu, ich użycie zależy od preferencji dewelopera i można je łatwo wymienić.

wprowadź opis zdjęcia tutaj


Framework : zbiór bibliotek, które zapewniają unikalne właściwości i zachowanie aplikacji. (Wszystkie składniki)

Biblioteka : dobrze zdefiniowany zestaw instrukcji zapewniających unikalne właściwości i zachowanie danych. (Olej na rybie)

Wtyczka : kompilacja narzędzia dla biblioteki (interfejs użytkownika -> AngularJS) lub wielu bibliotek w połączeniu (wybór daty -> bootstrap.css + jQuery), bez których wtyczka może teraz działać zgodnie z oczekiwaniami.


PS AngularJS to framework MVC, ale biblioteka JavaScript. Ponieważ uważam, że biblioteka rozszerza domyślne zachowanie natywnej technologii (w tym przypadku JavaScript).

Uday Hiwarale
źródło
Ładne wyjaśnienie :)
Mano
14

Tak o tym myślę (i widziałem racjonalizację przez innych):

Biblioteka jest zawarta w kodzie. A framework jest kontenerem dla twojej aplikacji.

Kon
źródło
10

tutaj jest połączony gorzki artykuł Joela Spolsky'ego , ale zawiera dobre rozróżnienie między zestawami narzędzi, bibliotekami, frameworkami i takimi

Lorenzo Boccaccia
źródło
8

Biblioteka implementuje funkcjonalność do wąsko zakrojonego celu, podczas gdy framework jest zwykle zbiorem bibliotek zapewniającym obsługę szerszego zakresu funkcji. Na przykład biblioteka System.Drawing.dll obsługuje funkcje rysowania, ale jest tylko jedną częścią ogólnej struktury .NET.

Jeff Yates
źródło
3
Dobrze, że framework może zawierać biblioteki . Może to być zarówno framework w pierwszej, jak i biblioteka w drugiej instancji. Tak jest w przypadku wielu frameworków internetowych, takich jak Apache Wicket , które definiują cykl przetwarzania, ale także zapewniają duży zestaw klas, które implementują konkretne komponenty interfejsu użytkownika.
OneWorld,
Uważam, że .NET to bardzo duża biblioteka. Biblioteka zbyt duża, aby można ją było nazwać biblioteką, ale wciąż jest biblioteką. Ramy wymuszają określony projekt, decydują o sterowaniu przepływem itp. Z niewielkim miejscem na majsterkowanie. .NET jako taki tego nie robi. Wierzę, że .NET to biblioteka, podczas gdy ASP.NET MVC to framework. Ale stwardnienie rozsiane potrzebuje dobrych słów na rynku.
nawfal
6

Biblioteka - dowolny zestaw klas lub komponentów, których można użyć, jeśli klient uzna za odpowiedni do wykonania określonego zadania.
Framework - nakłada określone wytyczne na „wtyczkę” w coś większego niż ty. Po prostu dostarczasz elementy specyficzne dla twojej aplikacji / wymagań w sposób opublikowany, aby „rama mogła ułatwić ci życie”

Gishu
źródło
6

Biblioteki są łatwe w użyciu i wydajne. Możesz na przykład powiedzieć, że biblioteka Zend pomaga nam realizować różne zadania dzięki dobrze zdefiniowanym klasom i funkcjom. Podczas gdy framework jest czymś, co zwykle wymusza określony sposób implementacji rozwiązania, takiego jak MVC (Model -view-controller) (odniesienie) . Jest to dobrze zdefiniowany system do dystrybucji zadań takich jak w MVC. Model zawiera stronę bazy danych, Widoki dotyczą interfejsu użytkownika, a kontrolery - logikę biznesową.

Ravi Shah
źródło
5

Twoja interpretacja brzmi dla mnie całkiem dobrze ... Biblioteka może być wszystkim, co jest skompilowane i zawiera się w sobie w celu ponownego użycia w innym kodzie, dosłownie nie ma ograniczeń co do jego zawartości.

Z drugiej strony oczekuje się, że framework będzie posiadał szereg udogodnień do wykorzystania na niektórych konkretnych obszarach rozwoju aplikacji, tak jak twój przykład, MVC.

Adam Bellaire
źródło
5

Myślę, że całkiem dobrze określiłeś różnicę: framework zapewnia ramę, w której wykonujemy naszą pracę ... W jakiś sposób jest bardziej „ograniczający” niż prosta biblioteka.
Szkielet ma również dodawać spójność do zestawu bibliotek.

PhiLho
źródło
5

Myślę, że biblioteka to zestaw narzędzi do osiągnięcia celu (na przykład gniazd, kryptografii itp.). Framework to biblioteka + RUNTIME EINVIRONNEMENT. Na przykład ASP.NET to framework: akceptuje żądania HTTP, tworzy obiekt strony, wywołuje zdarzenia lyfe cicle itp. Framework robi to wszystko, piszesz trochę kodu, który zostanie uruchomiony w określonym czasie cyklu życia aktualne zapytanie!

W każdym razie bardzo interesujące pytanie!

Stefan M
źródło
5

Nie pamiętam źródła tej odpowiedzi (chyba znalazłem ją w pliku .ppt w Internecie), ale odpowiedź jest dość prosta.

Biblioteka i Framework to zestaw klas, modułów i / lub kodu (w zależności od języka programowania), które mogą być używane w aplikacjach i pomagają rozwiązać szczególny „problem”.

Problemem może być rejestrowanie lub debugowanie informacji w aplikacji, rysowanie wykresów, tworzenie określonego formatu pliku (html, pdf, xls), łączenie się z bazą danych, tworzenie części aplikacji lub kompletnej aplikacji lub kodu zastosowanego do Wzorzec projektowy .

Możesz mieć Framework lub Bibliotekę, aby rozwiązać wszystkie te problemy i wiele więcej, normalnie frameworki pomagają rozwiązać bardziej złożone lub większe problemy, ale to konsekwencja ich głównej różnicy, a nie główna definicja obu.

Główną różnicą między biblioteką a frameworkiem jest zależność między ich własnym kodem. Innymi słowy, aby użyć frameworka, musisz użyć prawie wszystkich klas, modułów lub kodu w FW, ale aby użyć biblioteki, możesz użyć jednej lub kilka klas, modułów lub kodu w bibliotece we własnej aplikacji

Oznacza to, że jeśli Framework ma na przykład 50 klas, aby użyć frameworka w aplikacji, musisz użyć, powiedzmy, 10-15 lub więcej klas w kodzie, ponieważ w taki sposób zaprojektowano Framework, niektóre klasy (obiekty tych klas) są danymi wejściowymi / parametrami metod w innych klasach w ramach. Zobacz .NET Framework, Spring lub dowolny framework MVC.

Ale na przykład biblioteka dzienników, możesz po prostu użyć klasy Log w swoim kodzie i pomaga rozwiązać „problem z logowaniem”, co nie oznacza, że ​​biblioteka logów nie zawiera więcej klas w swoim kodzie, takich jak klasy do obsługi plików, obsługi danych wyjściowych ekranu, a nawet baz danych, ale nigdy nie dotykasz / nie używasz tych klas w kodzie, i dlatego jest to biblioteka, a nie framework.

Jest też więcej kategorii niż frameworki i biblioteki, ale to nie jest temat.

Junior Garza
źródło