Kontrolün Tersine Çevirilmesi (IoC) modeli hakkında çok fazla kafa karışıklığı var gibi görünüyor. Bazı insanlar, Strateji Örüntüsü veya Bileşen Model ile eşitledi, ancak bu karşılaştırma IoC'nin ne olduğunu gerçekten anlamadı. IoC gerçekten bir bağımlılığın nasıl elde edildiği ile ilgilidir. Sana bir örnek vereyim:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
Yukarıda Sprite.Load
, a'ya bağımlı olduğu açıktır FileReader
. Yöntemi test etmek istediğinizde aşağıdakilere ihtiyacınız vardır:
- Yerinde bir dosya sistemi
- Dosya sisteminden yüklenecek bir test dosyası
- Genel dosya sistemi hatalarını tetikleyebilme
İlk ikisi açıktır, ancak hata işlemenin beklendiği gibi çalıştığından emin olmak istiyorsanız, gerçekten de 3 numaraya ihtiyacınız var. Her iki durumda da, şimdi diske gitmeleri gerektiği için testlerinizi oldukça yavaşlattınız ve muhtemelen test ortamınızı daha karmaşık hale getirdiniz.
IoC'nin amacı, davranış kullanımını yapısından ayırmaktır. Bunun Strateji modelinden ne kadar farklı olduğuna dikkat edin. Strateji kalıbı ile amaç, tekrar kullanılabilir bir davranış yığınını kapsama almaktır; böylece gelecekte kolayca genişletebilirsiniz; stratejilerin nasıl inşa edildiği hakkında söyleyecek hiçbir şeyi yok.
Sprite.Load
Yukarıdaki yöntemi tekrar yazacak olsaydık, sonuçta ortaya çıkar:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
Şimdi, okuyucunun yapısını kullanımından ayırdık. Bu nedenle, test sırasında bir test okuyucusunda değişim yapmak mümkündür. Bu, test ortamınızın artık bir dosya sistemine ihtiyaç duymayacağı, dosyaları test edemeyeceği ve hata olaylarını kolayca simüle edebileceği anlamına gelir.
Yeniden yazmamda iki şey yaptığımı unutmayın. IReader
Bazı davranışları içine alan bir arayüz yarattım - yani Strateji desenini uyguladı. Ayrıca, doğru okuyucuyu yaratma sorumluluğunu başka bir sınıfa taşıdım.
Belki yukarıdakileri tanımlamak için yeni bir kalıp ismine ihtiyacımız yoktur. Bana Strateji ve Fabrika modellerinin bir karışımı olarak saldırıyor (IoC konteynerleri için). Söyleniyor, gerçek bir problemi çözdüğü açıkça belli olduğundan, insanların bu kalıba neyin dayandığı konusunda emin değilim ve kesinlikle bunun Java ile ne yapması gerektiği açık değil.