5 yaşında bir çocuğa bağımlılık enjeksiyonu nasıl açıklanır? [kapalı]


208

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?


72
Kulağa zor geliyor gibi geliyor ...
ire_and_curses

24
"Bir zamanlar ....." ile başlayın
Martin

1
Bir Java yeni başlayanından mı yoksa beş yaşında bir okurdan mı bahsediyoruz?
Drew

2
# Bağımlılık enjeksiyonu # öğrencinin yaşına bağlı değil, herkes için aynı
Rakesh Juyal

2
Rakesh: JavaOne 2009 tanıtım videosu, 13 yılın bile Java geliştiricisi olabileceği düşüncesiyle oluşturulmuştur, çünkü Java "her yerde" ve "kolay" dır.
Esko

Yanıtlar:


789

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.


93

Peki buna ne dersin?

Bir sınıfınız varsa Employeeve bu çalışanın bir sınıfı Address varsa, Employeesı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 Departmentnesnenin 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 setAddressveya 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 Employeesınıfı test etmeniz gerektiğinde, tüm testiniz için tüm seti kodlamak / almak zorunda kalmadan sahte Addressve Departmentsnesneleri enjekte edebilirsiniz . Daha da iyisi, üretim koduna gerçek Address ve Departmentnesneleri 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.


3
Veya: Bağımlılık enjeksiyonları, sizin için bağımlılıkları ayarlayan bir şey olduğunda . Bu bir şey genellikle bir çerçevedir. :)
OscarRyz

2
gerçekten çok akıllı.
OscarRyz

24

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.


10

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.


7

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.


5
Bu, daha fazla arayüzler veya polimorfizm bir açıklama gibi sesler ama için size kredi vermek aslında 5 yıllık yaşlı için anlaşılır olma.
Natix
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.