Aelf Teknik Konuşmalar: Bağımlılık Enjeksiyonu Bölüm 1
Yiqi Zhao tarafından yazılmıştır
Bağımlılık enjeksiyonu (dependency injection) nedir?
Geliştirici topluluğu içerisinde, “bağımlılık” olarak adlandırılan bir konsepte sahibiz. Bir programın bir üçüncü parti kütüphanesini kullanması gerektiğinde, bu kütüphaneyi bağımlılık olarak adlandırılabilir. Fakat “enjeksiyon” nereden geliyor?
Bir insana değer bulmak için karşıtına bakmanız gerektiği söylenir. Bağımlılık enjeksiyonunun karşıtı bağımlılık aramasıdır (dependency lookup). Bağımlılık enjeksiyonu ve bağımlılık araması, Kontrolün İnversiyonu (Inversion of Control - IoC) uygulamasının iki yoludur.
IoC ve Bağımlılık Enjeksiyonunun temel amacı bir uygulamanın bağımlılıklarını ortadan kaldırmaktır. Bu, sistemi daha ayrışmış ve bakımlanabilir kılar.
IoC
İlk önce IoC'yi anlamaya çalışalım. Eski bilgisayar programlama günlerine geri dönerseniz program akışı, kendi kontrolünde çalıştırırdı. Örneğin, aşağıdaki akış şemasında gösterildiği gibi basit bir sohbet uygulaması akışını düşünelim.
1- Kullanıcı sohbet mesajı gönderir.
2- Uygulama, diğer taraftan gelen mesajı bekler.
3- Hiçbir mesaj bulunamazsa, 2. adıma gider ya da 4. adıma geçer.
4- Mesajı görüntüler.
5- Kullanıcı çalışmalarına devam eder.
Şimdi program akışını yakından analiz ederseniz, bu sıralıdır. Program kendi kendini kontrol ediyor. IoC, programın kontrol akışını yönetecek başka birine devrettiği anlamına gelir. Örneğin, sohbet uygulaması olayını temel alarak yaparsak programın akışı aşağıdaki gibi olacaktır:
1- Kullanıcı sohbet mesajı gönderir.
2- Kullanıcı çalışmalarına devam ediyor.
3- Uygulama olayları dinler. Bir mesaj gelirse, olay etkinleşir ve mesaj alınır ve görüntülenir.
Programın akışını görürseniz, sıralı değildir, olayı temel alır. Yani şimdi kontrol tersine çevrildi. Akışı kontrol eden dahili program yerine, olaylar program akışını yönlendirir. Olay akışı yaklaşımı, daha fazla esnekliğe yol açan dolaysız bir başvuru olmadığından daha esnektir.
IOC'nin sadece olaylar tarafından uygulandığı sonucuna varmayın. Kontrol akışını geri arama delegeleri, gözlemci modeli, olaylar, DI (Bağımlılık enjeksiyonu) ve başka birçok yolla delege edebilirsiniz.
DI (Bağımlılık enjeksiyonu) IOC'nin bir alt kümesi iken IOC genel bir ana terimdir. IOC, uygulama akışının ters çevrildiği bir konseptir.
Daha önce bahsedilen iki yöntem, bağımlılık enjeksiyonu ve bağımlılık araması, her yerde kullanabileceğiniz yöntemlerdir.
Servis konumlandırıcısını (service locator) Spring Framework’de duymuş olabilirsiniz. Şimdi Servis konumlandırıcısının bir model karşıtı olduğunu düşünen birçok öncüller vardır. Aslında Servis konumlandırıcısı, bağımlılık aramanın somut bir uygulamasıdır. Servis konumlandırıcısı ve bağımlılık enjeksiyonu fikri esasen zıt olmasına rağmen, MS.DI bağımlılık enjeksiyon yapısını uygularken Servis konumlandırıcısını kullanır.
Eğer Spring’i kullanmadıysanız, sorun değildir.
İkisi arasındaki ilişkiyi açıklamaya çalışalım. Açıkçası, Bağımlılık Enjeksiyonu temel olarak enjekte etme ile ilgilidir. Yığın Taşması (stack overflow) üzerine Bağımlılık Enjeksiyonu konusunda çok ilginç bir cevap vardır. Soru, beş yaşındaki bir çocuğa bağımlılık enjeksiyonunun nasıl açıklanacağıdır:
Bir çocuk kendi başına buzdolabından bir şeyler çıkardığında, sorun çıkartabilir. Kapıyı açık bırakabilirler veya anne ya da babanın sahip olmasını istemediği bir şey alabilirler. Hatta sahip olmadıkları veya süresi dolmuş bir şeyi bile arıyor olabilirler.
Yapmaları gereken şey “öğle yemeği ile içmek için bir şeye ihtiyacım var” gibi ihtiyacı belirtmek ve sonra ebeveyn, yemek için otururken bir şeylerinin olduğundan emin olacaktır.
Bu yüzden doğru yaklaşım, çocuklara neye ihtiyaçları olduğunu sormaktır; o zaman buzdolabından bir şey bulur ve onlara veririz.
Bir benzetme yapacak olursak buzdolabından bir şeyler alan çocuklar bağımlılık aramaya benzer; çocuklara yetişkinler olarak bir şeyler sunduğumuzda, bu bağımlılık enjeksiyonudur.
Bağımlılık enjeksiyonunu ayrıntılı olarak tartışmadan önce, tasarım modellerinin beş prensibini gözden geçirmemiz gerekir (bazı yerler altı hatta yediden bahseder, ancak bunlar temel olarak beştir). Bu serideki bölümde bu ilkelerin ilk çifti incelenecektir.
KAYNAK: https://medium.com/aelfblockchain/aelf-tech-talks-dependency-injection-part-1-a95714f41042
Yiqi Zhao tarafından yazılmıştır
Bağımlılık enjeksiyonu (dependency injection) nedir?
Geliştirici topluluğu içerisinde, “bağımlılık” olarak adlandırılan bir konsepte sahibiz. Bir programın bir üçüncü parti kütüphanesini kullanması gerektiğinde, bu kütüphaneyi bağımlılık olarak adlandırılabilir. Fakat “enjeksiyon” nereden geliyor?
Bir insana değer bulmak için karşıtına bakmanız gerektiği söylenir. Bağımlılık enjeksiyonunun karşıtı bağımlılık aramasıdır (dependency lookup). Bağımlılık enjeksiyonu ve bağımlılık araması, Kontrolün İnversiyonu (Inversion of Control - IoC) uygulamasının iki yoludur.
IoC ve Bağımlılık Enjeksiyonunun temel amacı bir uygulamanın bağımlılıklarını ortadan kaldırmaktır. Bu, sistemi daha ayrışmış ve bakımlanabilir kılar.
IoC
İlk önce IoC'yi anlamaya çalışalım. Eski bilgisayar programlama günlerine geri dönerseniz program akışı, kendi kontrolünde çalıştırırdı. Örneğin, aşağıdaki akış şemasında gösterildiği gibi basit bir sohbet uygulaması akışını düşünelim.
1- Kullanıcı sohbet mesajı gönderir.
2- Uygulama, diğer taraftan gelen mesajı bekler.
3- Hiçbir mesaj bulunamazsa, 2. adıma gider ya da 4. adıma geçer.
4- Mesajı görüntüler.
5- Kullanıcı çalışmalarına devam eder.
Şimdi program akışını yakından analiz ederseniz, bu sıralıdır. Program kendi kendini kontrol ediyor. IoC, programın kontrol akışını yönetecek başka birine devrettiği anlamına gelir. Örneğin, sohbet uygulaması olayını temel alarak yaparsak programın akışı aşağıdaki gibi olacaktır:
1- Kullanıcı sohbet mesajı gönderir.
2- Kullanıcı çalışmalarına devam ediyor.
3- Uygulama olayları dinler. Bir mesaj gelirse, olay etkinleşir ve mesaj alınır ve görüntülenir.
Programın akışını görürseniz, sıralı değildir, olayı temel alır. Yani şimdi kontrol tersine çevrildi. Akışı kontrol eden dahili program yerine, olaylar program akışını yönlendirir. Olay akışı yaklaşımı, daha fazla esnekliğe yol açan dolaysız bir başvuru olmadığından daha esnektir.
IOC'nin sadece olaylar tarafından uygulandığı sonucuna varmayın. Kontrol akışını geri arama delegeleri, gözlemci modeli, olaylar, DI (Bağımlılık enjeksiyonu) ve başka birçok yolla delege edebilirsiniz.
DI (Bağımlılık enjeksiyonu) IOC'nin bir alt kümesi iken IOC genel bir ana terimdir. IOC, uygulama akışının ters çevrildiği bir konseptir.
Daha önce bahsedilen iki yöntem, bağımlılık enjeksiyonu ve bağımlılık araması, her yerde kullanabileceğiniz yöntemlerdir.
Servis konumlandırıcısını (service locator) Spring Framework’de duymuş olabilirsiniz. Şimdi Servis konumlandırıcısının bir model karşıtı olduğunu düşünen birçok öncüller vardır. Aslında Servis konumlandırıcısı, bağımlılık aramanın somut bir uygulamasıdır. Servis konumlandırıcısı ve bağımlılık enjeksiyonu fikri esasen zıt olmasına rağmen, MS.DI bağımlılık enjeksiyon yapısını uygularken Servis konumlandırıcısını kullanır.
Eğer Spring’i kullanmadıysanız, sorun değildir.
İkisi arasındaki ilişkiyi açıklamaya çalışalım. Açıkçası, Bağımlılık Enjeksiyonu temel olarak enjekte etme ile ilgilidir. Yığın Taşması (stack overflow) üzerine Bağımlılık Enjeksiyonu konusunda çok ilginç bir cevap vardır. Soru, beş yaşındaki bir çocuğa bağımlılık enjeksiyonunun nasıl açıklanacağıdır:
Bir çocuk kendi başına buzdolabından bir şeyler çıkardığında, sorun çıkartabilir. Kapıyı açık bırakabilirler veya anne ya da babanın sahip olmasını istemediği bir şey alabilirler. Hatta sahip olmadıkları veya süresi dolmuş bir şeyi bile arıyor olabilirler.
Yapmaları gereken şey “öğle yemeği ile içmek için bir şeye ihtiyacım var” gibi ihtiyacı belirtmek ve sonra ebeveyn, yemek için otururken bir şeylerinin olduğundan emin olacaktır.
Bu yüzden doğru yaklaşım, çocuklara neye ihtiyaçları olduğunu sormaktır; o zaman buzdolabından bir şey bulur ve onlara veririz.
Bir benzetme yapacak olursak buzdolabından bir şeyler alan çocuklar bağımlılık aramaya benzer; çocuklara yetişkinler olarak bir şeyler sunduğumuzda, bu bağımlılık enjeksiyonudur.
Bağımlılık enjeksiyonunu ayrıntılı olarak tartışmadan önce, tasarım modellerinin beş prensibini gözden geçirmemiz gerekir (bazı yerler altı hatta yediden bahseder, ancak bunlar temel olarak beştir). Bu serideki bölümde bu ilkelerin ilk çifti incelenecektir.
KAYNAK: https://medium.com/aelfblockchain/aelf-tech-talks-dependency-injection-part-1-a95714f41042
Son düzenleme: