Inversion of Control (IoC) nedir ?
Inversion of Control (IoC) nedir ?
KAYNAK: https://kodcu.com/2011/04/inversion-of-control-ioc-nedir/
KAYNAK: https://kodcu.com/2011/04/inversion-of-control-ioc-nedir/
KAYNAK: https://kodcu.com/2011/04/inversion-of-control-ioc-nedir/
KAYNAK: https://kodcu.com/2011/04/inversion-of-control-ioc-nedir/
Uygulama içerisindeki nesne yaratma sürecinin sizden alınması (-ki bu iyi bir şey detayları aşağıda) ve bunun bir çatıya (framework) devredilmesine Inversion of Control denir. Inversion of Controlifadesini direk Türkçe’ye çevirmek istemiyorum.
Bu kavramın dil bağımlılığı yoktur yani Java‘ya özgü bir değildir ya da .NET‘e. Peki bu kavram ne işe yarar ? Hangi sorunları çözer ? Yazılan tüm uygulamalarımız için Inversion of Control kavramını kullanabilir miyiz ? Bunu bir örnek ile açıklamaya çalışırsam
public class Voltran {
private GucKaynagi kaynak;
public Voltran() {
kaynak= new GucKaynagi();
}
}
Yukarıdaki ufak kod örneğinde Voltran içerisinde kullanığı GucKaynagini nesnesini kendi oluşturuyor (new() GucKaynagi ). Bu şu anlama geliyor Voltran sınıfı direk ve göbekten GucKaynagi sınıfına bağlıdır. Bunun neresi kötü ki ? Kötü tarafı şudur; yarın öbür gün GucKaynagi sınıfı değişirse, bu değişiklikten bir haber olan Voltran sınıfını da etkilenecektir. Bu örnek çerçevesinde ne var ki Voltran sınıfını da hemen değiştiririm diyebilirsiniz ama 100 veya 200 adet sınıf bulunan bir projede bunu yapmanız o kadar da kolay değildir.
Ioc aslında; kol kırılır yen içinde kalır atasözünün teknolojiye uyarlanmış halidir. GucKaynagi sinifi istediği kadar değişsin ama Voltran sınıfının bundan haberi olmasın. Haberi olmasın ki bende bir de Voltran sınıfı ile uğraşmak zorunda kalmayayım.
Peki nasıl olsun ? İşte aşağıdaki örnek bunu açıklıyor.
public class Voltran {
private IGucKaynagi kaynak;
public setGucKaynagi(IGucKaynagi kaynak) {
this.kaynak = kaynak
}
public Voltran() {
voltran.kullan(kaynak); // bu kismi salladim..
}
}
İşte Ioc kullanan yeni Voltran sınıfımız.
- Burada GucKaynagi sınıfı neden IGucKaynagi oldu ? Cevap : Başında I eklemek demek Interface demektir (yani isimlendirme genelde böyle olur). Artık IGucKaynagi sınıfının şartlarını sağlayan herhangi bir sınıf Voltran sınıfına GucKaynagi olabilir. Ya da olaya Voltran sınıfı açısından bakalım, artık Voltran kendisine gelen güçün nereden geldiğini umursamıyor. Üzümü yiyor bağını sormuyor, Voltran sınıfı ile ona güç sağlayan sınıf arasındaki bağı kestik, işte decoupling denen olayda budur.
- Peki IGucKaynagi nesnesini kim setGucKaynagi yordamına atıyor ? Cevap : Eşiniz. IoC kavramını evlilik kavramına benzetirsek, bu kavramın bir tarafını siz, diğer tarafını ise IoC ürünü oluşturur. Bu ürünlerden en meşhuru Spring‘dir, gerek .NET gerekse Java tarafı için Ioc çözümleri mevcuttur (ücretsiz). Ayrıca .NET için Castle Windsor ürünü de iyidir.
Olayları şekiller üzerinden göstermeye gayret edersek :
Yukarıdaki şekilde IoC kavramı yok. A sınıfı B ve C sınıflarına göbekten bağlı. new ile direk bağlaşım kurulmuş.
İşte bu yukarıdaki şekilde ise IoC ürünü (örneğin Spring). A nesnesinin ihtiyaç duyduğu diğer B ve C nesnelerini zerk ediyor
Gelelim IoC ‘nin faydalarına ve zararlarına.
Faydaları
- Kodunuz özgür olur. Sınıflar arasındaki bağlaşım kesilir. Sınıflar artık üzümü yiyen ve bağını sormayan bir moda bürünürler -ki bu enfes bir durumdur.
- Artık kodunuz da Arayüz (Interface) kavramlarını kullanmaya başlarınız.
- Birim test (Unit test) yazmak inanılmaz kolay bir hale gelir.
Zararları
Bir öğrenme cabası gerektirir ama bunu zarar olarak sayamayız.- Kodunuzu artık eskisi gibi açıp okumak zorlaşır. Direk kodun içerisinde tıklayıp oradan oraya sınıfların içerisinde gezme şansınız kısmen yok olur çünkü artık kodlar arasındaki bağlaşım kopmuştur. Bu ilişkiler ya XML dosyasında ya da bilgi notlarında(annotation) saklıdır. Şahsen ben XML dosyası yerine bilgi notu halinde ilişkileri belirtmeyi tercih ederim. Neyse bu ayrı bir konu.
- Diyelim ki bir xml içerisinde veya bilgi notu verirken (annotation) bir hata yaptınız ve işte bu hatayı bulup düzeltmek biraz daha acı vericidir.
Son söz olarak IoC kavramı bir tasarım kalıbıdır (design pattern) ve çoğu uygulama için uygun ve hayat kurtarıcıdır. Elbette uygun olmadığı projelerde olabilir. Keyfini çıkarın…


Yorumlar
Yorum Gönder