Kontrolün tersi nedir ve ne zaman kullanmalıyım?


Yanıtlar:


62

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, fişlevi her bir öğeye uygulayarak yinelenir . IteratorHer öğ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, Boobazı eylemleri gerçekleştirmek için tür argümanı gerektiren bir yapıcıya sahiptir .

Buna Foobenzer 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 .BooFoo

Özetle, IoC , programınızı ayrı bölümlere ayırmanıza izin verir. Bu iyi çünkü:

  • Bileşenler bağımsız olarak kolayca test edilebilir.
  • Programın karmaşıklığı azaltılabilir.
  • Bileşenleri başka bir uygulamaya geçirebilirsiniz.

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


1
Beş yıl sonra, ama yine de .... Bu mükemmel bir tanımdı. Teşekkürler.
Nick Hodges

4
IoC hakkında herhangi bir yerde çok fazla bahsedilmeyen, kodun okunmasının zorlaştığı gerçeğidir. Okunabilirlik harika bir yazılım yazmak istiyorsanız bir numaralı önceliktir. Deneme kabiliyetini bile atıyor. Kodu, kullanışlılığının çok ötesine ayırabilirsiniz.
Arne Evertsson

Öyleyse, tüm bağımlılıkları için Arayüz tabanlı çözümü kullanan bir kod da IoC tasarımına mı dayanıyor?
nikel

18

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.


4

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.


3

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.

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.