Javascript'te Bağımlılık Enjeksiyonu vs Gerektiren Modül


24

Bugünlerde aklımda bir soru ortaya çıktı:

Javascript, geleneksel Yazılım Geliştirme'de iyi bir uygulama olarak kabul edilen hemen hemen her şeye karşı çıkıyor mu?

Bu ifadeyle ilgili bir dizi sorum / gözlemim var, ancak StackExchange'in formatına saygı göstermek için, bunları farklı sorulara bölmem daha iyi olacaktır.

Gerektiren modül

Günümüzde standart Javascript kodu şöyle görünür:

const someModule = require('./someModule')

module.exports = function doSomethingWithRequest() {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

Avantajları

  • Kapsülleme: modül bağımsız çalışır ve işlevlerini yerine getirmek için gereken her şeyi bilir.
  • Bir colorary olarak, modülü kullanmak istemciler için daha kolaydır.

Dezavantajları

  • Zayıf test edilebilirlik: Bu DI kullanılmadığında standarttır, ancak Javscript gibi dinamik dillerde * mockeryveya gibi modüllerle çevrelenebilir rewire.
  • Kesinlikle ihlal DIP değil Dependency Injection ile karıştırılmamalıdır -. - çünkü sadece beton modülleri ithal edebiliyorum.
  • Muhtemelen ihlal OCP'yi - örneğin, o dosya sistemine yazma (aracılığıyla bir günlük modülü olduğunu düşünün fsmodülü). Bu günlük modülünü ağa göndermek üzere genişletmek istersem çok zor olurdu.

* Bu, çoğunlukla kullanıcı ülkesinde uygulandığı için CommonJS veya AMD modülleriyle birlikte çalışabilir. Ancak, bunun ES6 importsözdizimi ile nasıl mümkün olabileceğinden emin değilim .

Bağımlılık Enjeksiyonu

Bağımlılık enjeksiyonunu kullanarak, daha fazla olurdu:

module.exports = function doSomethingWithRequest(someModule) {
  // do stuff
  someModule.someFunc()
  // do other stuff
}

Avantajları

  • Arttırılmış test edilebilirlik: someModuleES6 sözdizimini kullanıyor olsanız bile, şimdi saplama / alay etmek kolaydır .
  • O var mümkün zorunlu olmamakla birlikte, istemci modülü hala uygulanması ve bir arabirimi değil programlanabilir gibidir: DIP onurlandırmak için.

Dezavantajları

  • Kırık kapsülleme: kalan asıl soru:

    Tamam, o zaman bağımlılıkları kim yaratacak / gerektirecek?

  • Bunu yaparken modülün her müşterisinde WET görünüyor .
  • Bu muhtemelen gerçek bir projede uygulanabilir olması için bir DI Konteyner kullanmamı gerektiriyor.

Yani, buradaki asıl soru şudur:

Javascript geliştiricileri neden ilk yaklaşıma eğilimli?

Bu sadece "Javascript yolu" mu?

Ben çoğu zaman böyle kod yazarım. Alaycı kütüphaneleri kullanarak test kurulum payımı aldım, ancak bunu yapmak her zaman yanlış hissettirdi.

Bir şey mi eksik?


Son zamanlarda NodeJ'lerle ilgilenen bir Net kullanıcısı olarak ben de bununla mücadele ediyorum. Ben olmak (çok ReWire gibi) Proxyquire ile bağımlılıkları yama maymunu bulduk tamam test amaçlı, ama bir bağımlılık bazen meşru ihtiyaç çoklu uygulamaları ...
Rubberduck

Yanıtlar:


6

Ben çoğunlukla bir PHP programcısıyım ama son bir yıldır 4 JavaScript ekibi ile iletişim kurdum.

Nesne yönelimli bir programcı olarak bağımlılık enjeksiyon ilkesi en iyi yol gibi gözükse de, birkaç JS geliştiricisi tarafından aksi söylendi. JS tamamen farklı bir dünya.

JavaScript, çok basit teknikleri kullanarak her şeyi ve her şeyi eşleştirmenize izin verdiği için, JavaScript geliştiricileri, daha büyük ölçekli JavaScript uygulamalarının nasıl oluşturulacağı konusunda farklı bir teknolojiyi uyarlamayı öğrendi. Bunların çoğu, halka açık ihracat yoluyla işlevselliği ortaya çıkaran, modülün içindekileri başkalarının güvendiğiniz işlevleri yeniden yazmalarına izin vermeyecek şekilde gizleyen, kendi kendine yeten modüller kümesi olarak inşa edilmiştir.

Her zamanki yaklaşım, genellikle bir kurucuya maruz bırakmayacak kadar ileri gitmek yerine, bir fabrika sargısı kullanarak bir nesnenin yapısını ortaya çıkarmaya bile devam eder - aynı sebeple: bir nesneye doğrudan erişim sağlayabilirlerse, doğrudan başlatabilirler. bir şeyleri değiştirmek için izin verilir.

Modüler tasarımın avantajlarından yararlanarak, başkalarının çalışmasını beklediğiniz işlevlerinize uymalarını reddedersiniz, ancak yine de modüllerinizi test etme yeteneğine sahip olursunuz - istenen dosyanın genel API'si, oluşturduğunuz API.

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.