Bağımlılık enjeksiyonunu açıklamanın iyi bir yolu nedir ?
Google'da birkaç öğretici buldum, ancak okuyucunun sadece bir Java başlangıç seviyesi olduğunu varsaymayacakları. Bunu bir acemiye nasıl açıklarsınız?
Bağımlılık enjeksiyonunu açıklamanın iyi bir yolu nedir ?
Google'da birkaç öğretici buldum, ancak okuyucunun sadece bir Java başlangıç seviyesi olduğunu varsaymayacakları. Bunu bir acemiye nasıl açıklarsınız?
Yanıtlar:
Beş yaşındakiler için bağımlılık enjeksiyonu yapıyorum.
Gidip kendiniz buzdolabından bir şeyler çıkardığınızda sorunlara neden olabilirsiniz. Kapıyı açık bırakabilirsin, anne ya da baba senin istemediğin bir şey alabilirsin. Hatta sahip olmadığımız veya süresi dolmuş bir şeyi bile arıyor olabilirsiniz.
Yapmanız gereken şey, "öğle yemeği ile bir şeyler içmeye ihtiyacım var" diye bir ihtiyaç olduğunu belirtmek ve sonra yemek için oturduğunuzda bir şeyler olduğundan emin olacağız.
Peki buna ne dersin?
Bir sınıfınız varsa Employee
ve bu çalışanın bir sınıfı Address
varsa, Employee
sınıfın aşağıdaki gibi tanımlanmasını sağlayabilirsiniz :
class Employee {
private Address address;
// constructor
public Employee( Address newAddress ) {
this.address = newAddress;
}
public Address getAddress() {
return this.address;
}
public void setAddress( Address newAddress ) {
this.address = newAddress;
}
}
Şimdiye kadar her şey iyi görünüyor.
Bu kod, çalışan ve adresi arasında bir HAS-A ilişkisi olduğunu gösteriyor.
Şimdi bu HAS-A ilişkisi aralarında bir bağımlılık yarattı. Sorun yapıcı içinde gelir.
Her Employee
örnek oluşturmak istediğinizde bir örneğe ihtiyacınız vardır Address
:
Address someAddress = ....
Employee oscar = new Employee( someAddress );
Bu şekilde çalışmak, özellikle birim testi yapmak istediğinizde sorunlu hale gelir .
Ana sorun, belirli bir nesneyi test etmeniz gerektiğinde, başka bir nesnenin bir örneğini oluşturmanız ve büyük olasılıkla bunu yapmak için başka bir nesnenin bir örneğini oluşturmanız gerektiğinde ortaya çıkar. Zincir yönetilemez hale gelebilir.
Bundan kaçınmak için yapıcıyı şu şekilde değiştirebilirsiniz:
public Employee(){
}
Bir argüman yapıcı kullanma.
Ardından adresi istediğiniz zaman ayarlayabilirsiniz:
Address someAddress = ....
Employee oscar = new Employee();
oscar.setAddress( someAddress );
Şimdi, birkaç özniteliğiniz varsa veya nesnelerin oluşturulması zorsa, bu bir sürükleme olabilir.
Yine de, bunu düşünün, diyelim ki, Department
özelliği ekleyin :
class Employee {
private Address address;
private Department department;
....
300 çalışanı var ve hepsi olması gerekiyorsa aynı departmanı ve artı aynı departman bazı diğer nesneler arasında paylaşılmasına sahiptir (bölümlerin şirket listesi gibi ya roller her bölüm vb var) o zaman olacak Department
nesnenin görünürlüğü ile zor zaman geçirin ve tüm nesne ağı üzerinden paylaşın.
Ne Bağımlılık Enjeksiyon tüm hakkında o kadar, iyi, yardımcı olmaktır "enjekte" kodunuzda bu bağımlılıkları. Çerçevelerin çoğu, harici bir dosyada hangi nesnenin enjekte edileceğini belirterek bunu yapmanıza izin verir.
Hayali bir bağımlılık enjektörü için bir özellikler dosyası olduğunu varsayın:
#mock employee
employee.address = MockAddress.class
employee.department = MockDepartment.class
#production setup
employee.address = RealAddress.class
employee.department = RealDepartment.class
Belirli bir senaryo için ne enjekte edeceğinizi tanımlayacaksınız.
Bağımlılık Enjektörü çerçevesinin yapacağı şey, sizin için doğru nesneleri ayarlamaktır, bu nedenle setAddress
veya kodlamak zorunda kalmazsınız setDepartment
. Bu, yansıtma veya kod oluşturma veya diğer tekniklerle yapılabilir.
Bu yüzden, bir dahaki sefere Employee
sınıfı test etmeniz gerektiğinde, tüm testiniz için tüm seti kodlamak / almak zorunda kalmadan sahte Address
ve Departments
nesneleri enjekte edebilirsiniz . Daha da iyisi, üretim koduna gerçek Address
ve Department
nesneleri enjekte edebilir ve yine de kodunuzun test edildiği gibi çalıştığına güvenebilirsiniz.
Bu hemen hemen bununla ilgili.
Yine de bu açıklamanın 5 yıl önce istediğiniz gibi uygun olduğunu düşünmüyorum.
Umarım hala faydalı bulursun.
Bir sınıf yazarken, diğer nesneleri kullanması doğaldır. Örneğin, bir veritabanı bağlantınız veya kullandığınız başka bir hizmetiniz olabilir. Bu diğer nesneler (veya hizmetler) bağımlılıklardır. Kodu yazmanın en basit yolu, bu diğer nesneleri oluşturmak ve kullanmaktır. Ancak bu, nesnenizin bu bağımlılıklarla esnek olmayan bir ilişkisi olduğu anlamına gelir: nesnenizi neden çağırıyor olursanız olun, aynı bağımlılıkları kullanır.
Daha güçlü bir teknik, nesnenizi oluşturabilmeniz ve ona bağımlılıklar sağlayabilmesidir. Bu nedenle, kullanmak için bir veritabanı bağlantısı oluşturabilir ve ardından bunu nesnenize verebilirsiniz. Bu şekilde, nesnenizi farklı zamanlarda farklı bağımlılıklarla oluşturarak nesnenizi daha esnek hale getirebilirsiniz. Bu, bağımlılığı nesneye "enjekte ettiğiniz" bağımlılık enjeksiyonudur.
BTW: Kavramları göstermek için flickr fotoğraflarını kullanan modern sunum tarzında, bu durum kendilerini uyuşturucu ile ateş eden bir bağımlı ile gösterilebilir. Oh, bekle, bu enjeksiyon bağımlılığı ... Tamam, üzgünüm, kötü şaka.
Herhangi bir basitleştirilmiş öğretici bilmiyorum, ama size neredeyse 25 250 kelimelik veya daha az sürüm verebilirim :
Bağımlılık enjeksiyonu ile, bir nesne kendi bileşenlerini zaten bildiği şeylere göre yapılandırmaz, bunun yerine nesne daha yüksek seviyeli mantık tarafından yapılandırılır ve daha sonra yerleşik ön bilgisi olmayan bileşenleri çağırır. Fikir, konfigürasyon görevlerini daha yüksek bir seviyeye yerleştirerek nesneyi daha fazla bileşen ve daha az uygulama yapmaktır. Bu, nesnenin gelecekte veya farklı bir yapılandırmayla yararlı olma olasılığını artırır.
Test için daha iyidir, uygulamayı revize etme zamanı geldiğinde daha iyidir. Tipik bir uygulama, yapılandırmayı XML'e yerleştirir ve sınıfları dinamik olarak yüklemek için bir çerçeve kullanır.
Yeni bir Nintendo verildiğinde, oyun oynamak için düğmeleri ve dokunmatik ekranı kullanabilirsiniz.
Ancak Nintendo fabrikasında, bir araya nasıl getireceklerini bilmeleri gerekiyor.
Fabrikadaki akıllı insanlar bir Nintendo DS getirdiğinde, içeride farklı olacak, ancak yine de nasıl kullanılacağını bileceksiniz.