Yeni bir sistem tasarlıyorum ve kontrolün ters çevrilmesinin (IOC) ne olduğunu ve daha önemlisi ne zaman kullanılacağını bilmek istiyorum.
Arayüzlerle mi uygulanmalı yoksa sınıflarla mı yapılabilir?
Yeni bir sistem tasarlıyorum ve kontrolün ters çevrilmesinin (IOC) ne olduğunu ve daha önemlisi ne zaman kullanılacağını bilmek istiyorum.
Arayüzlerle mi uygulanmalı yoksa sınıflarla mı yapılabilir?
Yanıtlar:
IoC (bkz . Wikipedia'daki Kontrolün Tersine Çevirilmesi ), bir bileşenin bir görevi tamamen yerine getiremediği durumlarda geçerlidir, çünkü gerekli bazı bilgi veya işlevlere sahip değildir.
Bir IoC deseninin en basit örneği, C'deki geri çağırma işlevleri olacaktır. Örneğin, işlevi bildirebilirsiniz:
void Iterator(void *list, Func* f)
Bu list
, f
işlevi her bir öğeye uygulayarak yinelenir . Iterator
Her öğenin nasıl işlendiğini bilmiyor fonksiyon, sadece bir argüman olarak bir işlev sağlamak ve bunları işler.
Önceki örnekte gösterildiği gibi, IoC , programınızı birbirinizi tanımayan ayrı bileşenlere ayırmanıza izin verir. IoC'nin en yaygın sürümlerinden biri Dependecy Injection'dır .
In Dependency Injection her bileşen kendi görev gerçekleştirmek için gerekli bağımlılıkları listesi bildirmelidir. Çalışma zamanında IoC Container adlı özel bir bileşen (genellikle) bu bileşenler arasında bağlanma gerçekleştirir. Yayınlanan bileşen bağımlılıkları için değerler sağlamaya çalışır.
İşte sözde kodda bir örnek:
class Foo
{
<Require Boo>Constructor(Boo boo){ boo.DoSomething }
}
Bu örnekte sınıf Foo
, Boo
bazı eylemleri gerçekleştirmek için tür argümanı gerektiren bir yapıcıya sahiptir .
Buna Foo
benzer bir kod kullanarak bir sınıf örneği oluşturabilirsiniz :
MyContainer.Create(typeof Foo)
MyContainer
- bir örneğini almak ve kurucuya iletmekle ilgilenen bir IoC Konteyneridir .Boo
Foo
Özetle, IoC , programınızı ayrı bölümlere ayırmanıza izin verir. Bu iyi çünkü:
Ancak bazı durumlarda, IoC kodun anlaşılmasını zorlaştırabilir.
IoC'nin gerçek dünya kullanımına iyi bir örnek görmek istiyorsanız , Mircosoft Composite UI Uygulama Bloğu ve CompositeWPF’e bakın.
Umarım açıklamam sana yardımcı olur.
Saygılar,
aku
Bu konuyu son zamanlarda kendime kattığım ve tüm yer imlerini sakladığımdan beri, IOC / DI hakkında bilgi edinmek için paha biçilmez buldum.
Martin Fowlers IOC / DI Üzerine Orijinal Makale
Önce Bilmeniz Gereken Bazı Kavramlar
Mükemmel bir IOC / DI Öğreticileri koleksiyonu
Manning Press'ten IOC / DI Kitabı
Kaynak ve Kendi IOC'inizi nasıl oluşturacağınıza dair açıklama - Neden kaynak kodunu okumak bir kavramı anlamak için her zaman en iyi yoldur.
JMS, temel olarak IoC / DI, bir kez kullanacağınız uygulamayı tanımlamanıza ve referans vermek istediğiniz her seferinde başvurmak için kabınızın statik kopyasını saklamanıza olanak tanır.
Vikipedi muhtemelen size yardımcı olacaktır, ancak ikinci bölümünüze referans vermek istedim - evet, sınıflar için bağımlılık enjeksiyonu yapılabilir (yani, bu sınıf türünün bir yönteme geçirilmesi gerektiğinde, bu sınıfı kullanın), ancak arayüzleri kullanın, bu şekilde hangi sağlayıcı, depo, vb. sürümlerini yalnızca kurulumunuzda yeniden referans alarak kullanacağınızı değiştirebilirsiniz.
IE, bir akışı okumak için bir arayüze sahip olduğunuzu ve bir XMLStreamReader ve bir SQLStreamReader uygulamanız olduğunu söyleyin. Daha sonra referansı arabirime metodlarınıza iletebilir ve daha sonra IoC kabınızda hangisinin kullanacağını söyleyebilirsiniz.
Böylece, herkese açık Read Read People (IStreamReader okuyucu) listesi ve IoC kabı için kurulumunuzda bir IStreamReader'ın SQLStreamReader kullanmasını beklediğinizde bunu söyleyebiliyor olabilirsiniz.
O zaman fikrinizi daha sonra değiştirirseniz, sadece tek bir yerde değiştirmeniz gerekir (kabınızın kurulumu) ve bir IStreamReader için kaç tane yöntem istediği önemli değildir, kabınıza söylediğiniz varsayılanı her zaman alır. sunmak.
Bir işletmenin sisteminizde geçerli olup olmadığını kontrol etmek için bir onaylayıcınız olduğunu varsayalım. "BusinessValidator" cihazınız, işletmenin adres bölümünü doğrulayan bir AddressValidator türünde bir alana sahip olabilir. BusinessValidator'ı dış kod çalıştırmadan (yani addressValidator kodu) çalıştırmadan test etmek istiyorsanız, o zaman çerçevenizde bir tür IoC / DI kullandıysanız, yerine sahte bir adresValidator'ı kolayca "enjekte edebilirsiniz" ve test konusunda endişelenmenize gerek yoktur Test edilen sınıfın kapsamı dışında kalan kod.