Ortak bir kütüphane iyi bir fikir midir?


16

Her zaman bir "ortak kütüphane" nin iyi bir fikir olduğunu düşündüm. Bununla, genellikle birkaç farklı uygulamanın ihtiyaç duyduğu ortak işlevselliği içeren bir kütüphane demek istiyorum. Daha az kod çoğaltma / artıklık ile sonuçlanır.

Son zamanlarda bunun aslında kötü bir fikir olduğunu ve bir "anti-desen" olduğunu söyleyecek bir makale okudum (şimdi bulamıyorum)

Bu yaklaşımın ters yönleri olsa da. Değişikliklerin sürümlendirilmesi ve yönetilmesi, bu kitaplığı kullanan uygulamalar paketi için regresyon testi anlamına gelir.

Yeni (Golang) projem için bir sapta kaldım. Kod tekilleştirme yıllar içinde bana dövüldü ama bu sefer denemek gerekir gibi hissediyorum.

Bunu yazarken, bu "ortak lib" yaklaşımının mimariyi gözden kaçırmanın bir sonucu olduğunu düşünmeye başladım. Belki de tasarımımın daha fazla düşünmeye ihtiyacı var?

Düşüncelerinizi duymak ister.


2
2 sentim ... Sistemlerden biri kullanıyorsa, ortak API'de değişiklik yapmanız gerekiyorsa, bu API veya kütüphane hiç ortak bir kütüphane değildir
Raja Anbazhagan

1
Kod çoğaltma ve bağlantı arasında temel bir denge olduğunu görüyorum. Sorunuz bunun en iyi örneğidir. İkisi arasında çarptığınız denge muhtemelen kodunuzun sonuçta yürüteceği ortama bağlı olacaktır.
Joel Cornett

Bildiğim C geliştiricilerinin çoğunun "araç kutusu" olarak adlandırdıkları yardımcı programları koleksiyonu var. Yine de, genellikle tek bir dahil kitaplığa toplanmaz. Daha çok "seç ve seç".
Mark Benningfield

2
Birisi Apache'yi arar ve bu deliliği düzeltir. Apache commons
Laiv

Yanıtlar:


21

Kütüphaneler ve yeniden kullanım kesinlikle iyi bir şeydir. Dev bir dezavantajı var, yani dikkatli bir şekilde yönetilmezlerse, mutfağınızda başka hiçbir yere gitmeyen tüm oranları ve uçları tutan çekmeceye eşdeğer olurlar.

64 bitlik sistemlere tüm iş biriminin kod değerinin (çoğunlukla benim için yeni) ilk bağlantı noktalarından sorumlu olduğumda ve birçoğu yapılmakta olan yapımız ve paketimiz için tam bir revizyon yaparken bunu eylemde gördüm. elle ve bazen çok iyi değil. * Müşterinin “A, B, D ve F, artı M yapan bir sistem rica ediyorum” dediği bir uygulama yığınından gönderdiğimizi oluşturma eğilimindeydik ve N henüz yapmadığınız ve hepsini birleştiren biraz farklı tutkal. " Hepsinin ortak noktası, birkaç on yıl boyunca insanların yeniden kullanılabilir olması gerektiğini düşündüğü her şeyi biriktiren önemsiz bir çekmece kütüphanesiydi. Uzun bir hikaye kısaca anlatmak için kütüphanedeki kodun bir kısmı değildi '. Bu bağımlılıkları oluşturmak ve korumak için çok değerli bir zaman harcıyorduk.

Ahlaki, kütüphanelere sınıflar gibi davranılması ve çok fazla sorumluluk yüklenmemesi gerektiğidir. Yazdığınız her program her ikisini de kullanıyor olsa bile, JSON ayrıştırıcınızı doğrusal cebir işlevlerinizle aynı kitaplığa koymayın.

Onları ayrı tutmanın birçok faydası vardır, bunların en büyüğü, geliştiricilerinizi ve paketleyicilerinizi, önemsiz çekmece ve beraberindeki bagajı kullanmak yerine, kendi ürünlerinin gerçekte neye ihtiyaç duyduğunun ayrıntılı bir muhasebesini bulmaya zorlamasıdır. Yerleşik paketleri kullanarak bir sistem kurduğunuzda, ince taneli bağımlılıklar yalnızca gerekli parçaların kurulmasını sağlar. Deponuzu ihmal etseniz ve eski, kaba şeyleri derlemeye devam etseniz bile, artık kullanılmayan hiçbir şey geminize sızmaz.

Tabii ki, libcbunun gibi istisnalar vardır, bir çok işlevi tek bir kütüphaneye sıkıştırır. Bu, X'ten başka herhangi bir yolun her zaman kötü uygulama olduğu konusunda ısrar eden salondaki zealotu köreltmek yerine, bu şekilde yapmanın faydalarının gerekçelendirilebileceği durumlardan biridir .


* Bu süreçte, altı yıl içinde geçmiş ve sıfırdan derlenmemiş bir ikili ortaya çıkardım.

** Onlarca yıllık kodda yanlış bir şey yok. Onları sadece modernliğin çıkarına yeniden yazmak için aptallar olduğumuzu kanıtlamış bir dizi kritik algoritmaya sahibiz.


1
Temel kuralım, kitaplığınıza "ortak" gibi bir ad vermek istiyorsanız, sorun yaşamaya başlıyorsunuz.
Karl Bielefeldt

9

Utanç verici bir şekilde, birkaç yıl önce bir ekip ortamında böyle adlandırılmış bir "ortak" kütüphane tanıttım. Sadece birkaç ay içinde gevşek bir şekilde koordine edilen ekip ortamında neler olabileceğinin dinamiğini gerçekten anlamadım.

Onu tanıttığımda, bunu açıkça düşündüğümü ve ayrıca günlük olarak yararlı bulduğumuzu kabul ettiğimiz şeyler için minimalist bir kütüphane olması gerektiğini ve kütüphanenin başka hiçbir şeye bağlı olmaması gerektiğini belgelediğimi düşündüm. standart kütüphane, böylece yeni projelerde mümkün olduğunca kolay dağıtılabilir. O zamanki düşüncem, özel alanımızda günlük olarak yararlı bulduğumuz şeyler için standart kütüphaneye kendi küçük uzantımız olmasıydı.

Ve yeterince iyi başladı. Hepimiz common/math*günlük olarak kullandığımız rutin bir matematik kütüphanesi ( ) ile başladık , çünkü genellikle lineer cebir üzerinde ağır olan bilgisayar grafikleri üzerinde çalışıyorduk. Ve genellikle C kodu ile birlikte çalıştığımız için find_index, aksine,std::findC ++ 'da, C işlevlerimizin nasıl çalıştığını taklit eden bir yineleyici yerine bir dizide bulunan bir öğeye bir dizin döndürür - bu tür şeyler - biraz eklektik ama minimalist ve herkese tanıdık ve pratik kalacak kadar yaygın olarak kullanılır ve "yaygın" veya "standart" olan herhangi bir şey yapmaya çalışırken gördüğüm kadarıyla anlık aşinalık son derece önemli bir ölçüttür, çünkü gerçekten "ortak" ise, geniş bir sonucu olarak bu tanıdık niteliğe sahip olması gerekir. evlat edinme ve günlük kullanım.

Ancak zamanla, insanlar kişisel olarak kullandıkları şeyleri eklemeye başladığında kütüphanenin tasarım niyetleri, sadece başka birini kullanacağını düşündükleri şeyleri eklemeye başladı. Ve daha sonra birisi, yaygın GL ile ilgili rutinler için OpenGL'ye bağlı işlevler eklemeye başladı. Dahası Qt'yi kabul ettik ve insanlar Qt'ye bağlı kod eklemeye başladı, bu yüzden zaten ortak kütüphane iki harici kütüphaneye bağımlıydı. Bir noktada birisi, uygulamaya özgü gölgelendirici kitaplığımıza bağlı olan ortak gölgelendirici yordamları ekledi ve bu noktada Qt, OGL ve uygulamaya özgü gölgelendirici kitaplığımızı ve yazımızı getirmeden yeni bir projeye bile uygulayamadınız. projeniz için önemsiz olmayan bir komut dosyası. Böylece bu eklektik, birbirine bağımlı karmaşaya dönüştü.

Ama aynı zamanda, "ortak" olarak kabul edilen şeyin, "ortak" olanın çok sert bir çizgi kuralı belirlemezseniz, kolayca çok öznel bir fikre dönüşebileceğini bu kütüphaneye neyin girmesi ve neyin olmaması gerektiğini tartışarak buldum. Herkesin günlük olarak yararlı bulmaya eğilimi. Standartların herhangi bir şekilde gevşetilmesi ve herkesin günlük olarak yararlı bulduğu şeylerden, tek bir geliştiricinin başkalarına faydalı olma olasılığı olabilecek yararlı bir şeye çabucak ayrılır ve bu noktada kütüphane eklektik bir karmaşaya dönüşür .

Dahası, bu noktaya geldiğinizde, bazı geliştiriciler programlama dilini sevmemeleri için bir şeyler eklemeye başlayabilirler. For döngüsünün veya bir işlev çağrısının sözdizimini beğenmeyebilirler, bu noktada kütüphane, dilin sadece temel sözdizimiyle savaşan, gerçekte olmayan birkaç basit kod satırının yerini alan şeylerle dolmaya başlar. herhangi bir mantığı, sadece böyle bir stenoyu tanıtan geliştiriciye aşina olan tek bir egzotik kod satırına kopyalamak. Daha sonra böyle bir geliştirici, bu tür kestirme yollar kullanılarak uygulanan ortak kütüphaneye daha fazla işlevsellik eklemeye başlayabilir, ortak kütüphanenin önemli bölümleri, onu tanıtan geliştirici için güzel ve sezgisel görünebilen, ancak çirkin ve yabancı ve herkes için anlaşılması zor bu egzotik stenografi ile iç içe geçiyor. Ve bu noktada, gerçekten "ortak" bir şey yapma umudunun kaybolduğunu biliyorum, çünkü "ortak" ve "tanıdık" kutupsal fikirler.

Yani, en azından gevşek bir şekilde koordine edilmiş ekip ortamında, "yaygın olarak kullanılan şeyler" kadar geniş ve genel tutkuları olan bir kütüphaneye sahip her türlü solucan tenekesi var. Ve altta yatan problem, her şeyden önce gevşek koordinasyon olsa da, matematik rutinleri sağlamayı amaçlayan bir kütüphane ve başka bir şey gibi en azından birden fazla kütüphane, tek bir amaca hizmet etmeyi amaçladı, muhtemelen "ortak" bir kütüphane olarak tasarım saflığı ve bağımlılıkları. Bu nedenle geçmişe bakıldığında, çok daha açık tasarım niyetleri olan kütüphanelerin yanına düşmenin çok daha iyi olacağını düşünüyorum. Yıllar içinde, amaca yönelik olarak ve uygulanabilirlikte daralmanın kökten farklı fikirler olduğunu da buldum.

Ayrıca kuşkusuz en azından biraz pratik değilim ve bakım belki de estetik konusunda biraz fazla, ama bir kütüphanenin kalitesi (ve belki de "güzellik") fikrimi algılama eğilimim, en güçlü, benzer bir şekilde, bana dünyanın en iştah açıcı yiyeceklerini sunduysanız, ancak aynı tabağa, gerçekten kötü kokan bir çürüyen bir şey koyarsanız, tüm tabağı reddetme eğilimindeyim. Ve bu konuda benden hoşlanıyorsanız ve her türlü eklemeyi "ortak" olarak adlandırılan bir şey olarak davet eden bir şey yaparsanız, kendinizi bu analog plakaya yanda çürüyen bir şeyle bakarken bulabilirsiniz. Aynı şekilde, bir kütüphanenin düzenlenmeyecek şekilde düzenlenmesi ve adlandırılması ve belgelenmesi iyi olur '' t Zaman içinde gittikçe daha fazla ekleme davet edin. Ve bu, kişisel yaratımlarınız için bile geçerli olabilir, çünkü burada ve orada kesinlikle çürümüş şeyler yarattım ve en büyük tabağa eklenmezse çok daha az "lekelenir". Her şeyi küçük, çok tekil kütüphanelere ayırmak, sadece her şeyi birleştirmeye başlamanın çok daha az uygun olması nedeniyle, kodu daha iyi bir şekilde ayırma eğilimindedir.

Kod tekilleştirme yıllar içinde bana dövüldü ama bu sefer denemek gerekir gibi hissediyorum.

Senin durumunda ne önerebilir kod tekilleştirme kolay almaya başlamaktır. Ben kötü test, hata eğilimli kod veya bu tür bir şey büyük snippet'leri kopyalamak ve yapıştırmak veya gelecekte değişiklikler gerektiren iyi bir olasılık olan önemsiz olmayan kod büyük miktarda çoğaltmak için söylemiyorum.

Ama özellikle arzunuzun yaygın olarak uygulanabilir, son derece tekrar kullanılabilir ve belki de ideal olarak bugün on yıl kadar yararlı bulduğunuz bir şey yaratmak olduğunu düşündüğüm bir "ortak" kütüphane oluşturma zihniyetindeyseniz , bazen bu zor kaliteyi elde etmek için bazı çoğaltmalara ihtiyaç duyabilir veya isteyebilirsiniz. Çünkü çoğaltma aslında bir ayırma mekanizması işlevi görebilir. Bir video oynatıcıyı MP3 çalardan ayırmak istiyorsanız, en azından piller ve sabit sürücüler gibi bazı şeyleri çoğaltmanız gerekir. Bu şeyleri paylaşamazlar ya da bölünmez bir şekilde eşleştirilirler ve birbirlerinden bağımsız olarak kullanılamazlar ve istedikleri tek şey MP3 çalmaksa, insanlar artık cihazla ilgilenmeyebilir. Ancak bu iki cihazı birbirinden ayırdıktan bir süre sonra, MP3 çaların video oynatıcıdan farklı bir pil tasarımından veya daha küçük bir sabit diskten faydalanabileceğini görebilirsiniz; bu noktada artık hiçbir şey çoğaltmıyorsunuz; başlangıçta bu bağımsız cihazın iki ayrı, bağımsız cihaza bölünmesine izin vermek için çoğaltma olarak başlayan şey, daha sonra artık gereksiz olmayan tasarımlar ve uygulamalar ortaya çıkarabilir.

Bir kütüphane kullananların bakış açısından bir şeyleri düşünmeye değer. Gerçekten kullanmak ister misinkod çoğaltmasını en aza indiren bir kütüphane? Muhtemelen yapmayacaksınız çünkü bunu yapan biri doğal olarak diğer kütüphanelere bağlı olacaktır. Ve bu diğer kütüphaneler, kodlarını çoğaltmaktan kaçınmak için diğer kütüphanelere bağlı olabilir ve böylece, bir ses dosyasını yüklemek ve oynatmak gibi bazı temel işlevleri almak için 50 farklı kütüphaneyi içe aktarmanız / bağlamanız gerekebilir ve bu çok hantal hale gelir. . Bu arada böyle bir ses kütüphanesi, bağımsızlığını elde etmek için burada ve orada bazı şeyleri kasıtlı olarak çoğaltmayı seçerse, yeni projelerde kullanımı çok daha kolay hale gelir ve şansı, kazandığından neredeyse güncellenmesi gerekmemesidir. o bağımlı kütüphane dış ses kütüphanelerinin değişmesi sonucunda değişmelidir.

Bu nedenle, bir kütüphaneyi ayırmak ve bağımsız hale getirmek için kasıtlı olarak biraz (bilinçli olarak, asla tembellikten - aslında gayretten uzak) çoğaltmayı seçmeye değer çünkü bu bağımsızlık sayesinde daha geniş bir pratik uygulanabilirlik ve eşit kararlılık (daha afferent kaplinler yok). Sizi bir projeden diğerine ve yıllara kadar sürdürebilecek en yeniden kullanılabilir kütüphaneleri tasarlamak istiyorsanız, o zaman kapsamını en aza indirgemek üzerine, aslında burada biraz kopyalamayı düşünmenizi öneririm. Ve doğal olarak birim testleri yazın ve ne yaptığının gerçekten test edildiğinden ve güvenilir olduğundan emin olun. Bu sadece zaman ayırmak için gerçekten tek bir projenin ötesine geçen bir noktaya genellemek istediğiniz kütüphaneler içindir.


3

Kütüphanelere koymayı düşünebileceğiniz üç farklı işlev kategorisi vardır:

  1. Herkes için yeniden kullanmaya değer şeyler.
  2. Yalnızca kuruluşunuz için yeniden kullanılmaya değer şeyler.
  3. Tekrar kullanılmaya değer şeyler.

Birinci kategori, standart bir kitaplığın olması gereken bir şeydir , ancak bir nedenden dolayı kimse bir tane yapmak için etrafta dolaşmadı (veya birini mi aradınız? Tamamen aradınız mı?). Bu durumda kütüphanenizi açık kaynak yapmayı düşünün. Çalışmanızı paylaşmak sadece başkalarına yardımcı olmakla kalmaz, aynı zamanda size yardımcı olur, çünkü diğer kullanıcılardan hata raporları ve yamalar alırsınız. Herhangi birinin kütüphanenize katkıda bulunacağından şüphelendiğinizde, aslında kategori 2 veya 3 olan işlevsellik ile ilgileniyor olabilirsiniz.

İkinci kategori, tekrar tekrar ihtiyaç duyduğunuz şeylerdir, ancak dünyada başka hiç kimsenin buna ihtiyacı yoktur. Örneğin, şirket içi geliştirilmiş arka uç sisteminizle iletişim kurmak için belirsiz ağ protokolünün uygulanması. Bu durumda, yeni uygulamaların geliştirme hızını artırmak için bunları bir kurum kütüphanesine koymak mantıklı olabilir. Özellik sürünmesinden çok fazla etkilenmediğinden ve aslında 1 veya 3 kategorilerine uyan şeyler içermeye başladığından emin olun.Ayrıca, Blrfl'in modülerleştirme hakkındaki tavsiyesi çok iyi: Tek bir yekpare Conor Corp. Kütüphanesi oluşturmayın. Ayrı işlevler için birden fazla ayrı kitaplık oluşturun.

Üçüncü kategori, bir kütüphaneye taşınmanın buna değmeyeceğini veya başka bir uygulamada tam olarak bu biçimde tekrar ihtiyacınız olacağından emin olmadığınız uygulamaları uygulamak için o kadar önemsiz bir işlevselliktir. Bu işlevsellik, geliştirdiği uygulamanın bir parçası olarak kalmalıdır. Şüphe duyduğunuzda, muhtemelen bu kategoriye aittir.


1

Hemen hemen tüm dillerin ortak / standart bir kütüphanesi vardır, bu yüzden bu iyi bir fikir olarak kabul edilir. Her durumda maliyet / fayda ve kütüphanenin kalitesi açıkça değerlendirilmekle birlikte, tekerleği yeniden icat etmek yerine üçüncü taraf kütüphanelerin çeşitli görevler için kullanılması genellikle iyi bir fikir olarak kabul edilir.

Bir başka geliştirici veya kurum tarafından başka türlü ilgisiz projelerde kullanılan "ortak yardımcı programlar" kütüphaneleri vardır. Bu kütüphanenin tür olabilir bir anti-desen düşünülebilir. Gördüğüm durumda, bu kütüphaneler sadece standart kütüphanelerden veya daha iyi bilinen üçüncü taraf kütüphanelerden gelen işlevselliği standart olmayan ve kötü belgelenmiş bir şekilde kopyalar.


these libraries just replicate functionality from standard librariesBu tamamen kötü bir şey değil, javascript zaten eski js motorlarda destek eklemek için mevcut şeyler uygulayan kütüphaneler eklediniz, ayrıca eski SDK vb için android destek kütüphaneleri var ..
svarog

@svarog: Doğal olarak desteklemeyen eski motorlar için yeni standartlarda işlevselliği taklit eden "çoklu dolgular" mı düşünüyorsunuz? Bunları kendiniz yazmak için herhangi bir neden görmüyorum, çünkü bu amaçlar için iyi bilinen açık kaynaklı kütüphaneler var.
JacquesB

0

Ekipler arasında paylaşılan kütüphanelerin çoğu çözdüklerinden daha fazla soruna neden olur. "Cehenneme giden yol iyi niyetlerle döşenmiştir."

İstisnalar , aşağıdakilerin çoğunu karşılayan kütüphanelerdir :

  • Güvenli uzun vadeli bakım fonlarına sahip olun
  • Özel bir destek ekibine / topluluğuna sahip olun
  • Böcek Avcısı Ol
  • Kapsamlı test kapsamına sahip olun
  • Tek, iyi tanımlanmış bir amacınız olsun
  • Standart veya yarı standart kitaplıklar dışında hiçbir bağımlılığın (hem derleme hem de çalışma zamanında) olmaması
  • Kamusal API'ler ve dahili araçlar arasında net bir ayrım yapın
  • Tüm / birçok kullanıcının yeni özellikler ve sürümler üzerinde anlaşması için bir iletişim kanalına ve sürecine sahip olun

Tipik (başlangıç ​​dışı) şirketlerde, ekipler arasında paylaşılan kütüphaneler için yukarıdaki koşulların neredeyse hiçbiri mevcut değildir. Çünkü çoğu şirket ekibine kütüphaneleri değil ürünleri teslim etmek için para ödeniyor. Bazı şirketlerin Google'ın monoreposu gibi başarılı paylaşım stratejileri vardır, ancak bu, yapı ve test altyapısına çok yüksek yatırım ile birlikte gelir.

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.