Sınıf düzeyinde kolaydır.
'Bağımlılık Enjeksiyonu' basitçe "işbirlikçilerimi nasıl bulacağım" sorusunu "sana ittirdikleri - gidip onları kendin almak zorunda değilsin" ile cevaplıyor. ("İşlemlerin girişimi üzerinde nasıl sipariş vereceğim?" Sorusunun benzer bir cevabı olduğu "Kontrolün Tersine Çevirilmesi" ile aynı değildir - aynı değildir).
Sadece sahip ortak çalışanlarınız size aktardığı fayda olduğunu sen keyfi yapmadıysanız özel karar vererek grafiğin şeklini ve değişebilirlik önceden belirlenmiş ... bugünkü gerek uygun bir nesne grafiği oluşturmak için sınıf kullanmak için istemci kodu sağlar İş arkadaşlarınızın somut türleri ve yaşam döngüsü.
(Test edilebilirlik, gevşek bağlanma, vb. Gibi diğer tüm faydalar, DI'nin doğal olarak arayüzlerin kullanımını teşvik etmesine rağmen, büyük ölçüde arayüzlerin kullanımından kaynaklanmaktadır.
Bu nedenle , kendi ortak çalışanlarınızı somutlaştırmaktan kaçınırsanız, sınıfınızın ortak çalışanlarını bir kurucudan, bir mülkten veya bir yöntem argümanından alması gerektiğini belirtmek gerekir (bu ikinci seçenek çoğu zaman göz ardı edilir ... bir sınıfın “ortak çalışanlarının“ devletinin bir parçası olması ”için her zaman mantıklı değil).
Ve bu iyi bir şey.
Uygulama düzeyinde ...
Her şeyi sınıf başına görmek için çok fazla. Diyelim ki "kendi işbirlikçilerinizi somutlaştırmayın" kuralını izleyen ve onlardan bir uygulama yapmak isteyen bir grup dersiniz var. Yapılması gereken en basit şey, istediğiniz nesne grafiğini oluşturmak için eski kodları (yapıcıları, özellikleri ve yöntemleri çağırmak için gerçekten kullanışlı bir araç!) Kullanmak ve ona girdi yazmaktır. (Evet, grafiğinizdeki bu nesnelerin bazıları, grafikteki diğer uzun ömürlü nesnelere ortak çalışanlar olarak görev yapan, servis için hazır olan nesneler-fabrikalar olacaklar ... her nesneyi önceden oluşturamazsınız! ).
... uygulamanızın nesne grafiğini 'esnek bir şekilde' yapılandırmanız gerek ...
Diğer (kodla ilgili olmayan) hedeflerinize bağlı olarak, son kullanıcıya konuşlandırılan nesne grafiği üzerinde bir kontrol hakkı vermek isteyebilirsiniz. Bu, bazı tasarım / isim çiftleri, bir XML dosyası, özel bir DSL, bildirimsel bir grafik-açıklama dili gibi kendi tasarımınızın bir metin dosyası olup olmadığına bakılmaksızın, bir sıralama düzeni veya başka bir yapılandırma şeması yönünde yönlendirir. YAML, JavaScript gibi zorunlu bir betik dili veya eldeki göreve uygun başka bir şey. Kullanıcılarınızın ihtiyaçlarını karşılayacak şekilde geçerli bir nesne grafiği oluşturmak için ne gerekiyorsa.
... önemli bir tasarım gücü olabilir.
Gelen en uç bu tür durum, bir çok genel bir yaklaşım ve son kullanıcılara vermek tercih olabilir genel bir nesne grafiği 'kablolama' için mekanizmayı kendi seçtiği ve hatta izin bunları hiç arayüzleri somut gerçekleşmelerine sağlamak Çalışma süresi! (Belgeleriniz ışıltılı bir mücevherdir, kullanıcılarınız çok zekidir, en azından uygulamanızın nesne grafiğinin kaba taslaklarına aşinadır, ancak bir derleyicinin kullanışlı olması gerekmez). Bu senaryo teorik olarak bazı 'kurumsal' durumlarda ortaya çıkabilir.
Bu durumda, muhtemelen, kullanıcılarınızın herhangi bir türü, bu türden bir nesne grafiğinin kompozisyonunu ve efsanevi son kullanıcının karıştırabileceği ve eşleştirebileceği bir arayüzler paletini ifade etmelerini sağlayan bir bildirim dili vardır. Kullanıcılarınızdaki bilişsel yükü azaltmak için, “konvansiyonel konfigürasyona göre” yaklaşımını tercih edersiniz, böylece ilgilenilen nesne-grafik-fragman parçasına atlamak ve her şeyle uğraşmak yerine sadece üstesinden gelmek zorunda kalırlar.
Seni zavallı sod!
Bunları kendiniz yazmaktan hoşlanmadığınız için (ama cidden, diliniz için bir YAML bağlamasına göz atın), bir tür DI çerçevesi kullanıyorsunuz.
Bu çerçevenin vadesine bağlı olarak, anlamlı olsa bile (ortak çalışanlar bir nesnenin ömrü boyunca değişmez) yapıcı enjeksiyon seçeneğini kullanma şansına sahip olamazsınız; ortak çalışanlar bir nesnenin ömrü boyunca değişmezler ve hatta bir arayüzün tüm somut uygulamalarının belirli bir türden ortak çalışanlara sahip olması gerektiğinin mantıklı bir nedeni olmasa bile ). Öyleyse, kod-temeliniz boyunca korku içinde 'arayüzleri kullanmaya' rağmen, şu anda güçlü bir cehennemdesiniz.
Umarım, size yapıcı enjeksiyon seçeneği sunan bir DI çerçevesi kullandınız ve kullanıcılarınız yapılandırmak için gereken belirli şeyleri düşünmek ve göreve daha uygun bir kullanıcı arayüzü vermek için daha fazla zaman harcamadıkları için size biraz huysuz davranıyorlar . elde. (Adil olmakla birlikte, muhtemelen bir yol düşünmeye çalıştınız, ancak JavaEE sizi hayal kırıklığına uğrattı ve bu korkunç kesmeye başvurmak zorunda kaldı).
Bootnote
Hiçbir zaman Google Guice kullanmıyorsunuz, bu kodlayıcıya kod yazarak kodla bir nesne grafiği oluşturma görevinden vazgeçmenin bir yolunu veriyor. Ahh!