Çerçeve ve kütüphane arasındaki fark nedir? [kapalı]


865

Bir çerçeve ile kütüphane arasındaki fark nedir ?

Ben her zaman bir kütüphane belirli bir sorunu veya uygulama geliştirme (yani veritabanı erişimi) belirli bir alanı çözmeye odaklanan nesneleri ve işlevleri bir dizi olarak düşündüm; diğer yandan, belirli bir metodoloji (yani MVC) merkezli ve tüm uygulama geliştirme alanlarını kapsayan bir kütüphane koleksiyonu olarak bir çerçeve.


18
@ vba4all: İlk istendiğinde bu nasıl tekrarlanabilir?
Noob Saibot

5
İlk olarak yaratıldığı için bir kopya olmadığı anlamına gelmez;) sadece yinelenen / oldukça benzer soruları tanımlamak ve kaynakların / cevapların paylaşılmasını sağlamak (ve en aktif / en iyi cevaplanan soru açık)
GrayedFox


3
@tuple_cat aslında bağlantınız kopya gibi görünüyor: bundan sonra istendi
chharvey

1
Bazı işlevlere ihtiyacımız var, Kütüphane diyoruz. Framework'ten yararlanacağımız bazı fonksiyonlara ihtiyacımız var ve Framework kodumuzu çağırıyor (örn. UIKit).
Kamleshwar

Yanıtlar:


350

Aslında bu terimler, kullanılan bağlama bağlı olarak birçok farklı anlama gelebilir.

Örneğin, Mac OS X'te çerçeveler sadece bir paket halinde paketlenmiş kütüphanelerdir. Paket içinde gerçek bir dinamik kitaplık bulacaksınız (libWhatever.dylib). Çıplak bir kütüphane ile Mac'teki çerçeve arasındaki fark, bir çerçevenin kütüphanenin birden çok farklı sürümünü içerebilmesidir. Ek kaynaklar (görüntüler, yerelleştirilmiş dizeler, XML veri dosyaları, UI nesneleri vb.) İçerebilir ve çerçeve herkese açık olarak yayınlanmadığı sürece, genellikle kütüphaneyi kullanmanız için gerekli olan .h dosyalarını içerir.

Böylece, uygulamanızda kütüphaneyi kullanmanız gereken tek bir pakette her şeye sahip olursunuz (bir kütüphane dokümanına göre kendiniz yazmazsanız, .h dosyaları olmayan bir C / C ++ / Objective-C kütüphanesi oldukça işe yaramaz). hareket etmek için bir sürü dosya (Mac paketi Unix düzeyindeki bir dizindir, ancak kullanıcı arayüzü, tıpkı Java'da JAR dosyalarınız olduğu gibi tek bir dosya gibi davranır ve tıkladığınızda genellikle görmezsiniz. içeriği göstermeyi açıkça seçmediğiniz sürece içeride ne olduğunu).

Wikipedia, çerçeveye "anahtar kelime" adını verir. Bir yazılım çerçevesini şu şekilde tanımlar:

Yazılım çerçevesi, bir yazılım sistemi (veya alt sistemi) için yeniden kullanılabilir bir tasarımdır. Bir yazılım çerçevesi, bir yazılım projesinin farklı bileşenlerini geliştirmeye ve yapıştırmaya yardımcı olan destek programları, kod kitaplıkları, bir komut dosyası dili veya başka bir yazılım içerebilir. Çerçevenin çeşitli bölümleri bir API aracılığıyla açığa çıkabilir.

Bir kütüphane sadece "kütüphane" dir. Nesnelerin / işlevlerin / yöntemlerin (dilinize bağlı olarak) bir koleksiyonudur ve uygulamanız buna karşı "bağlantılar" oluşturur ve böylece nesneleri / işlevleri / yöntemleri kullanabilir. Temel olarak, birden fazla uygulama arasında paylaşılabilen yeniden kullanılabilir kod içeren bir dosyadır (aynı kodu tekrar tekrar yazmak zorunda değilsiniz).

Bir çerçeve, uygulama geliştirmede kullandığınız her şey olabilir. Bir kütüphane, çok sayıda kütüphane koleksiyonu, bir komut dosyası koleksiyonu veya uygulamanızı oluşturmak için ihtiyacınız olan herhangi bir yazılım olabilir. Çerçeve çok belirsiz bir terimdir.

" Kütüphane vs. Çerçeve " konulu bir adam hakkında bir makale . Bence bu yazı oldukça tartışmalı. Orada söylediği yanlış değil, ancak çerçevenin çoklu tanımlarından birini seçiyor ve bunu klasik kütüphane tanımıyla karşılaştırıyor. Örneğin, alt sınıflandırma için bir çerçeveye ihtiyacınız olduğunu söylüyor. Gerçekten mi? Bir kitaplıkta tanımlanmış bir nesneye sahip olabilirim, ona karşı bağlantı kurabilirim ve kodumda alt sınıf oluşturabilirim. Bunun için nasıl bir "çerçeveye" ihtiyacım olduğunu anlamıyorum. Bir şekilde çerçeve kavramının günümüzde nasıl kullanıldığını açıklamaktadır. Daha önce söylediğim gibi, sadece sinirli bir kelime. Bazı şirketler sadece normal bir kütüphane (herhangi bir anlamda klasik bir kütüphane) yayınlarlar ve buna daha süslü geldiği için buna "çerçeve" derler.


2
İlginçtir, 2008'de Wikipedia'nın makalesinde "çerçeve" bir "terim" olarak tanımlanmıştır.
Zebrafish

2
IMO, bir çerçeve "boş" proje ortamıdır.
Kulvar

514

Bir kütüphane belirli, iyi tanımlanmış işlemler gerçekleştirir.

Bir çerçeve bir uygulama iskeleti doldurarak operasyon "et" tanımlayan bir iskelet. İskeletin parçaları bağlamak için hala kodu vardır, ancak en önemli çalışma uygulama tarafından yapılır.

Kütüphane örnekleri: Ağ protokolleri, sıkıştırma, görüntü işleme, dize yardımcı programları, düzenli ifade değerlendirme, matematik. Operasyonlar bağımsızdır.

Çerçeve örnekleri: Web uygulama sistemi, Eklenti yöneticisi, GUI sistemi. Çerçeve kavramı tanımlar, ancak uygulama son kullanıcıların önem verdiği temel işlevleri tanımlar.


10
Gerçek örnekler için +1. Btw, bir "web uygulama sistemi" ile ne demek istediğinizi açıklığa kavuşturmak ister misiniz?
Pacerier

3
@Pacerier muhtemelen Ruby için Rails veya Node.js için tam bir web uygulaması oluşturmanıza izin veren bir şeydir.
gustavohenke

Güzel cevap. İOS çerçeveleri ve kütüphaneleri ile ilgili daha fazla örnek verebilir misiniz?
NSPratik

veya son teslim tarihlerine sahip mükemmeliyetçiler için web çerçevesi olan Django.
hava saldırısı

2
İskeleti 'et' yerine 'kaslar' ile doldurmayı düşünürdüm. Bence bu daha doğru bir benzetme çünkü 'kaslar' iskeleti harekete geçiriyor.
altgov3en

290

Bence asıl fark, çerçevelerin " Hollywood prensibini " takip etmesi , yani "bizi arama, seni arayacağız."

Martin Fowler'e göre :

Bir kütüphane aslında arayabileceğiniz bir dizi işlevdir, bu günlerde genellikle sınıflar halinde düzenlenmiştir. Her çağrı bir iş yapar ve kontrolü istemciye döndürür.

Bir çerçeve , içinde daha fazla davranış olan bazı soyut tasarımları içerir. Bunu kullanmak için, davranışınızı alt sınıflandırma veya kendi sınıflarınızı takarak çerçevedeki çeşitli yerlere eklemeniz gerekir. Daha sonra çerçevenin kodu bu noktalarda kodunuzu çağırır.


2
@Panos Açıklama için teşekkürler, ancak ayrıntılandırabilir misin? Örneğin, FacebookSDK çerçevesini kullanıyorum ve bu çerçeveden sınıf yöntemleri arıyorum. FacebookSDK çerçevesi kodumda hiçbir şey çağırmıyor, bu da tanımınızın tam tersi yani "bizi arama, seni arayacağız".
Charles Robertson

4
@CharlesRobertson AFAIK FacebookSDK bir istemci kütüphanesidir. Bir çerçeve olarak sınıflandırılamaz ve nedeni açıktır (daha önce fark ettiğiniz gibi): FacebookSDK, istemci kodunda hiçbir şey çağırmıyor. Ayrıca Facebook , SDK'yı şu şekilde tanımlar : "Sosyal Eklentiler, Facebook Giriş ve Grafik API çağrıları eklemek için zengin bir istemci tarafı işlevselliği kümesi." Çerçeve için gösterge yok ...
Panos

1
@Panos Teşekkürler. Sanırım FacebookSDK'yı temsil eden bavul simgesi o zaman biraz yanıltıcı. Ve adı 'FacebookSDK.framework'. Facebook 'FacebookSDK.dylib' gibi bir adla yeniden adlandırmalı mı? Ama bunu açıkladığınız için teşekkürler. Doğru tanımın ne olduğunu bilmek güzel ...
Charles Robertson

Bu ilginç bir tanım. Son zamanlarda d3.js kullanmaya başladım ve genellikle bir çerçeve olarak kabul edildiğini gözlemledim. Ama ne d3 kodu yazdım her zamanki bir javascript kodu içinde, bu yüzden bu tanımı d3 genişletmek mümkün değil.
Dileep Kumar Patchigolla

1
@Dileep d3.js ana sayfasında ilk cümlede belirtilmiştir: "D3.js, verilere dayalı belgeleri işlemek için bir JavaScript kitaplığıdır". Bir çerçeve olarak görülmenin yanlış olduğunu düşünüyorum.
Panos

243

Library'yi çağırıyorsunuz.

Framework sizi arar.


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


12
Bunu bir haiku olarak yeniden düzenleyebilir misin?
Derek Tomes

18
@DerekTomes BTW: Haiku formu ekledim .
Ian Boyd

56
Cevabınız META'da tartışılıyor . Haiku'yu çevirmek ister misin? Bence çok azımız gerçekten bunun kütüphaneye yardım edip etmediğini merak ediyor , iskele acıyor, Google çevirmeninin çok sevdiği gibi birçok gözyaşı :)
Bugs

27
Bir modun ilk iki yorumu sildiğini görmek güzel. Şimdi Japonca metnin neden eklendiğini (şaka olarak talep edildi) ve bunun gerçek bir popüler Japon şiiri değil, sadece tercüme etme girişimiydi.
Zanon

9
Sovyet Rusya'da çerçeve sizi çağırıyor.
Robert Moore

242

Kütüphane:

Bu sadece bir olan koleksiyon ait rutinleri (fonksiyonel programlama) ya da sınıf tanımlarını (nesne yönelimli programlama). Bunun nedeni sadece kodun yeniden kullanılmasıdır , yani diğer geliştiriciler tarafından yazılmış olan kodu alın. Sınıflar veya rutinler normalde alana özgü bir alanda belirli işlemleri tanımlar . Örneğin, geliştiricinin bir algoritmanın nasıl çalıştığını yeniden uygulamadan işlevi çağırmasını sağlayan bazı matematik kütüphaneleri vardır.

Çerçeve:

Çerçevede, tüm kontrol akışı zaten orada ve kodumuzla doldurmamız gereken bir dizi önceden tanımlanmış beyaz nokta var . Bir çerçeve normalde daha karmaşıktır. Bu bir iskelet tanımlayan uygulama iskeleti doldurmak için kendi özelliklerini tanımlar. Bu şekilde, uygun olduğunda kodunuz çerçeve tarafından çağrılır. Bunun yararı, geliştiricilerin bir tasarımın iyi olup olmadığı konusunda endişelenmeleri gerekmemesinin yanı sıra yalnızca alana özgü işlevlerin uygulanması konusunda endişelenmeleri gerekmesidir.

Kütüphane, Çerçeve ve Kod görüntüsü gösterimi:

Kütüphane, Çerçeve ve Kod imaj ilişkiniz

KeyDifference:

Bir kütüphane ve bir çerçeve arasındaki temel fark “Kontrolün Tersine Çevirilmesi” dir . Kitaplıktan bir yöntem çağırdığınızda, denetim sizdedir. Ancak bir çerçeve ile denetim tersine çevrilir: çerçeve sizi çağırır . Kaynak.

İlişkisi:

Her ikisi de programcıların kullanması için kullanılan API'yi tanımladı. Bunları bir araya getirmek için, bir kütüphaneyi uygulamanın belirli bir işlevi, uygulamanın iskeleti olarak bir çerçeve olarak düşünebiliriz ve bir API bunları bir araya getirmek için bağlayıcıdır. Tipik bir geliştirme süreci normal olarak bir çerçeve ile başlar ve API aracılığıyla kütüphanelerde tanımlanan işlevleri doldurur.


14
Kontrolün Ters Çevirilmesi Büyük derinlemesine açıklama!
Patricia

3
Resim gibi, güzelce özetliyor ve bazen neden insanların kafasının karıştığını gösteriyor, çünkü çerçeveler genellikle kütüphaneleri de paketliyor.
Didier

1
@didibus Cevabın iyi bir açıklama yaptığını düşünüyorsanız, gönderi görüntüleyenlerin verimli cevabı kolayca bulabilmeleri için cevabı yükseltebilirsiniz.
Durai Amuthan.H

Yani FFmpeg (program değil, esas olarak projeden LibAVUtil) bir çerçeve ve libavcodec, vb kütüphaneler?
MarcusJ

1
@MarcusJ - Hem LibAVUtil hem de libavcodec kütüphanelerdir
Durai Amuthan.H

110

Her zaman tarif ettiğim gibi:

Kütüphane bir araçtır.

Bir Çerçeve bir yaşam biçimidir.

Size yardımcı olan küçük bir parça kullanabileceğiniz bir kütüphane. Tüm projenizi taahhüt etmeniz gereken bir Çerçeve.


9
Bu cevap her iki terimi de anladıktan sonra çok daha mantıklıdır.
başka bir

45

Web geliştiricisi açısından:

  1. Kütüphane, başka bir kütüphane tarafından kolayca değiştirilebilir. Ancak çerçeve olamaz.

    Jquery tarih seçici kütüphanesini sevmiyorsanız, bootstrap tarih seçici veya pickadate gibi diğer tarih seçici ile değiştirebilirsiniz.

    Ürününüzü oluşturduğunuz AngularJS'den hoşlanmıyorsanız, sadece başka çerçevelerle değiştiremezsiniz. Tüm kod tabanınızı yeniden yazmanız gerekir.

  2. Çoğunlukla kütüphane, Frameworks ile karşılaştırıldığında çok daha az öğrenme eğrisi alır. Örneğin: underscore.js bir kütüphane, Ember.js bir çerçevedir.


En iyi cevap. Basit, doğrudan ve net.
Felipe Santiago

41

Cohens'in cevabını seviyorum, ancak daha teknik bir tanım: Kodunuz bir kütüphane çağırıyor. Bir çerçeve kodunuzu çağırır . Örneğin bir GUI çerçevesi, kodunuzu olay işleyicileri aracılığıyla çağırır. Web çerçevesi, kodunuzu bazı istek yanıtlama modeli aracılığıyla çağırır.

Buna kontrolün ters çevrilmesi de denir - aniden çerçeve, kütüphanelerde olduğu gibi, kodun ne zaman ve nasıl yürütüleceğine karar verir. Bu, bir çerçevenin kodunuzu nasıl yapılandırmanız gerektiği üzerinde çok daha büyük bir etkiye sahip olduğu anlamına gelir.


30

Bu tanımı nerede gördüğümü unuttum, ama bence çok hoş.

Kütüphane, kodunuzdan çağırdığınız bir modüldür ve bir çerçeve, kodunuzu çağıran bir modüldür.


6
Ancak libc, kodunuzu çağıran qsort () öğesini içerir. Bunun libc'yi bir çerçeve yaptığını sanmıyorum.
Mark Baker

Modül ile kastedilen nedir?
NattyC

18

Farklı kütüphanelerden bir çerçeve oluşturulabilir. Bir örnek verelim.

Diyelim ki bir balık köri pişirmek istiyorsunuz. O zaman yağ , baharat ve diğer yardımcı programlara ihtiyacınız var . Ayrıca yemeğinizi hazırlamak için temel olan balığa ihtiyacınız vardır (Bu, uygulamanızın verileridir). tüm malzemelerin birlikte bir çerçeve denir . Şimdi son ürününüz olan balık köri yapmak için bunları tek tek veya birlikte kullanacaksınız . Bunu , underscore.js , bootstrap.css , bootstrap.js , fontawesome , AngularJS vb. İçeriklerden oluşan bir web çerçevesiyle karşılaştırın . Heyecan Önyükleme V.35

Şimdi, sadece bir bileşeni düşünürseniz, örneğin yağ gibi . İstediğiniz yağı kullanamazsınız, çünkü o zaman balıklarınızı mahveder (veriler). Sadece Zeytinyağı kullanabilirsiniz . Bunu underscore.js ile karşılaştırın . Şimdi kullanmak istediğiniz yağ markası size kalmış. Bazı yemek Amerikan Zeytinyağı (underscore.js) veya Hint Zeytinyağı (lodash.js) ile yapılmıştır. Bu sadece uygulamanızın tadını değiştirir. Neredeyse aynı amaca hizmet ettiklerinden, kullanımları geliştiricinin tercihine bağlıdır ve kolayca değiştirilebilir.

resim açıklamasını buraya girin


Çerçeve : Uygulamanıza benzersiz özellikler ve davranışlar sağlayan bir kitaplık koleksiyonu. (Tüm malzemeler)

Kütüphane : Verilerinize benzersiz özellikler ve davranışlar sağlayan iyi tanımlanmış bir talimatlar dizisi. (Balık Yağı)

Eklenti : Eklentinizin beklendiği gibi çalışabileceği bir kitaplık (ui-yönlendirici -> AngularJS) veya birçok kitaplık (tarih seçici -> bootstrap.css + jQuery) için bir yardımcı program derlemesi.


PS AngularJS bir MVC çerçevesi ancak bir JavaScript kütüphanesidir. Çünkü Kütüphane yerel teknolojinin varsayılan davranışını (bu durumda JavaScript) genişlettiğine inanıyorum.


Güzel açıklama :)
Mano

14

Ben böyle düşünüyorum (ve başkaları tarafından rasyonelleştirilmiş gördük):

Kütüphane, kodunuzda bulunan bir şeydir. Ve bir çerçeve uygulamanız için bir kaptır.



8

Bir kütüphane işlevselliği dar kapsamlı bir amaç için uygularken, bir çerçeve daha geniş bir yelpazeye destek sağlayan bir kütüphane koleksiyonu olma eğilimindedir. Örneğin, System.Drawing.dll kütüphanesi çizim işlevselliğini işler, ancak genel .NET çerçevesinin yalnızca bir parçasıdır.


3
İyi ki, bir çerçeve kütüphaneler içerebilir . Yani, hem ilk, hem de ikinci durumda bir kütüphane olabilir. Bu, işlem döngüsünü tanımlayan ancak aynı zamanda somut kullanıcı arabirimi bileşenleri uygulayan büyük bir sınıf kümesi sağlayan Apache Wicket gibi birçok web çerçevesi için de geçerlidir .
OneWorld

Bence .NET çok büyük bir kütüphane. Kütüphane olarak adlandırılamayacak kadar büyük ama yine de bir kütüphane. Çerçeveler belirli bir tasarımı uygular, kontrol akışını vb. .NET böyle yapmaz. ASP.NET MVC bir çerçeve iken .NET bir kütüphane olduğuna inanıyorum. Ancak MS'nin pazarlamak için iyi sözlere ihtiyacı var.
nawfal

6

Kütüphane - İstemci belirli bir görevi yerine getirmek için uygun gördüğü sınıflar veya bileşenler kümesi.
Çerçeve - sizden daha büyük bir şeye "eklenti" vermeniz için belirli yönergeleri zorunlu kılar. Yalnızca uygulamanıza / gereksinimlerinize özgü parçaları yayınlanması gereken bir şekilde sağlarsınız, böylece 'çerçeveleme hayatınızı kolaylaştırabilir'


6

Kütüphaneler, kullanım kolaylığı ve verimlilik içindir. Örneğin Zend kütüphanesinin, iyi tanımlanmış sınıfları ve işlevleri ile farklı görevleri yerine getirmemize yardımcı olduğunu söyleyebilirsiniz. -view-controller) (başvuru) . MVC gibi görevlerin dağıtımı için iyi tanımlanmış bir sistemdir.Model veritabanı tarafı içerir, Görünümler UI Arayüzü içindir ve kontrolörler İş mantığı içindir.


5

Yorumunuz bana çok iyi geliyor ... Bir kütüphane , başka bir kodda yeniden kullanım için derlenmiş ve kendi kendine yeten herhangi bir şey olabilir, içeriği üzerinde herhangi bir kısıtlama yoktur.

Öte yandan, bir çerçevenin , örneğin MVC gibi, belirli bir uygulama geliştirme arenasında kullanım için çeşitli olanaklara sahip olması beklenmektedir.


5

Sanırım farkı çok iyi tespit ettiniz: çerçeve, işimizi yaptığımız bir çerçeve sunuyor ... Her nasılsa, basit bir kütüphaneden daha "kısıtlayıcı".
Çerçevenin ayrıca bir dizi kütüphaneye tutarlılık katması bekleniyor.


5

Kütüphanenin bir amaca ulaşmak için bir dizi yardımcı program olduğunu düşünüyorum (örneğin, soketler, kriptografi, vb.). Çerçeve kütüphane + RUNTIME EINVIRONNEMENT. Örneğin, ASP.NET bir çerçevedir: HTTP isteklerini kabul eder, sayfa nesnesi oluşturur, lyfe cicle olaylarını çağırır vb. Framework tüm bunları yapar, yaşam döngüsünün belirli bir zamanında çalıştırılacak biraz kod yazarsınız. mevcut istek!

Her neyse, çok ilginç bir soru!


5

Bu cevabın kaynağını hatırlamıyorum (sanırım internette bir .ppt içinde buldum), ancak cevap oldukça basit.

Kütüphane ve Çerçeve, uygulamalarınızda kullanılabilen ve belirli bir "sorunu" çözmenize yardımcı olan bir dizi sınıf, modül ve / veya koddur (programlama diline bağlı olarak).

Bu sorun, bir uygulamadaki günlük veya hata ayıklama bilgileri, grafikler çizme, belirli bir dosya biçimi (html, pdf, xls) oluşturma, bir veri tabanına bağlanma, bir uygulamanın parçası veya tam bir uygulama veya bir uygulamaya uygulanan bir kod olabilir. Tasarım deseni .

Tüm bu sorunları çözmek için bir Çerçeveye veya Kütüphane'ye sahip olabilirsiniz ve daha fazlası, normalde çerçeveler daha karmaşık veya daha büyük problemleri çözmenize yardımcı olur, ancak her ikisinin de ana tanımı değil, ana farklarının bir sonucu.

Bir Kütüphane ve bir Çerçeve arasındaki temel fark, kendi kodları arasındaki bağımlılıktır, bir Çerçeve kullanmak için, FW'deki hemen hemen tüm sınıfları, modülleri veya kodu kullanmanız gerekir, ancak bir Kütüphane kullanmak için kendi uygulamanızda lib'de birkaç sınıf, modül veya kod

Bu, bir Çerçevede, çerçeveyi bir uygulamada kullanmak için örneğin 50 sınıf varsa, kodunuzda 10-15 veya daha fazla sınıf kullanmanız gerektiği anlamına gelir, çünkü bir Çerçeve bu şekilde tasarlanır, sınıflar (bu sınıfların nesneleri), çerçevedeki diğer sınıflardaki yöntemler için girişler / parametrelerdir. .NET çerçevesine, Bahar'a veya herhangi bir MVC çerçevesine bakın.

Ancak, örneğin bir günlük kitaplığı, kodunuzda yalnızca bir Günlük sınıfı kullanabilirsiniz ve "günlük kaydı sorununu" çözmenize yardımcı olur; bu, günlük kitaplığının kodlarında sınıflar gibi daha fazla sınıf olmadığı anlamına gelmez dosyaları, ekran çıktılarını ve hatta veri tabanlarını işlemek için kullanılır, ancak kodunuzdaki bu sınıflara asla dokunmaz / kullanmazsınız.

Ayrıca, Çerçeveler ve Kütüphanelerden daha fazla kategori var, ama bu konu dışı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.