DI / IoC konteynerini mevcut bir uygulamaya entegre etme konusunda öneriler


10

Şimdi kontrolün (IoC) bir konteynırını mevcut bir uygulamaya entegre etmekle karşı karşıyayım ve bunun, kuplajı azaltma ve böylece test edilebilirliği arttırma nihai hedefiyle en kolay şekilde nasıl gerçekleştirilebileceğine dair bazı öneriler arıyorum. Genellikle sınıfların çoğunu tanrı nesnesi olarak sınıflandırmasam da , her birinin statik, singleton ve arayüz eksikliği yoluyla çok fazla sorumluluğu ve gizli bağımlılığı vardır.

Karşılaşılması gereken bazı zorluklardan bazıları:

  • Bağımlılık enjeksiyonu nadiren kullanılır
  • Statik yöntemler bol - hem fabrika hem de yardımcı yöntemler olarak
  • Singletonlar oldukça yaygın
  • Arabirimler kullanıldıklarında çok parçalı değildir
  • Nesneler genellikle temel sınıflar aracılığıyla gereksiz bağımlılıkları çeker

Amacımız, bir dahaki sefere belirli bir alanda değişiklik yapmamız gerektiğinde, gerçekte var olan ancak singletonlar ve statik gibi küresellerin arkasında gizlenen bağımlılıkları ortaya çıkarmaya çalışmamızdır.

Sanırım IoC konteynerini bağımlılık enjeksiyonunun uygulanmasına ikincil hale getiriyor, ancak bu bağımlılıkları ortadan kaldırmamıza yardımcı olacak izlenebilecek veya dikkate alınabilecek bir dizi uygulama ve öneri olmasını bekliyorum.


3
Bunu şimdi yapmanın nedenini sormalıyım ... Bu değişime neden olan nedir? İdame? Ölçeklenebilirlik katlanarak büyüyeceği için mi? Geliştiriciler sıkılıyor mu?
Aaron McIver

1
Kısa süre önce şirkete katıldım ve bazı "en iyi uygulamaları" tanıtmaya çalışıyorum. Ana hedefim test edilebilirliği artırmak ve kuplajı azaltmaktır. DI / IoC'yi yeni kod için kolayca kullanabiliriz ve mevcut kodun tümünü bir kerede değiştirmeyi düşünmüyoruz, ancak bir dahaki sefere yaptığımız zaman mevcut kodu daha iyi nasıl değiştirebileceğimize dair öneriler istiyorum. o alanda değişiklikler. Şimdiye kadar çevrimiçi bulduğum tek şey şudur: code.google.com/p/autofac/wiki/ExistingApplications
Kaleb Pederson

3
Çok sayıda otomatik birim / entegrasyon testi yapılmadığı sürece; en iyi uygulamalar uğruna bir sorun olmadığı sürece mevcut altyapının değiştirilmesi sorun istemektedir. Birim / entegrasyon test paketiniz sağlam olsa bile hala tereddütüm vardı.
Aaron McIver

1
@Aaron Umarım en iyi uygulamalar uğruna yapıyormuşuz gibi gelmez. Değişiklikler yapıyoruz çünkü mevcut kodla çalışmak zor ve yavaş ve o alanda çalışırken parça parça yapıyoruz. Memnuniyetle, değişiklik yapmayı destekleyen bir dizi makul entegrasyon testi ve birkaç birim testimiz var.
Kaleb Pederson

Yanıtlar:


8

Böyle bir şeyi çıkarmak için adım adım çalışmanız gerekecek, bunların her biri önemsiz değil, ancak başarılabilir. Başlamadan önce, bu süreci acele edemeyeceğinizi anlamalısınız.

  1. Uygulamanın ana alt sistemlerini tanımlayın ve interfaceher biri için bir. Bu arayüz yalnızca sistemin diğer bölümlerinin onunla konuşmak için kullanacağı yöntemleri tanımlamalıdır. NOT: Bu işlem için birden fazla geçiş yapmanız gerekebilir.
  2. Varolan koda yetki veren arabirimin bir sarmalayıcı uygulamasını sağlayın. Bu alıştırmanın amacı, toplu olarak yeniden yazmayı önlemek , ancak yeni arayüzleri kullanmak için kodu yeniden düzenlemek - yani sisteminizdeki kuplajı azaltmaktır.
  3. Oluşturduğunuz arabirimleri ve uygulamaları kullanarak sistemi oluşturmak için IoC kapsayıcısını ayarlayın. Bu aşamada uygulamayı açabilmesi için IoC kapsayıcısını başlatmaya özen göstermek istiyorsunuz. Bir sunucu uygulaması ortamındaysanız, kabı sunucu uygulaması init()yönteminde alabildiğinizden / oluşturabildiğinizden emin olun .
  4. Her alt sistemde aynı şeyi tekrar yapın, bu sefer refactor yaptığınızda, saplama uygulamanızı gerçek bileşenlere dönüştürüyorsunuz ve bu da bileşenleriyle konuşmak için arayüzleri kullanıyor.
  5. Bileşen boyutu ile işlevsellik arasında iyi bir denge buluncaya kadar gerektiği kadar tekrarlayın.

İşiniz bittiğinde, sisteminizde olması gereken tek statik yöntem gerçek işlevlerdir - örneğin, Collectionssınıfa veya Mathsınıfa bakın. Hiçbir statik yöntem diğer bileşenlere doğrudan erişmeye çalışmamalıdır.

Bu çok zaman alacak bir şey, buna göre plan yapın. Yeniden düzenleme işleminizi yaparken tasarım yaklaşımınızda daha katı hale geldiğinizden emin olun. Başlangıçta acı verici olacak. Uygulamanızın tasarımını tekrar tekrar büyük ölçüde değiştiriyorsunuz.


İyi öneriler. Bu tür değişiklikleri yaparken başkalarını da buradaki önerilere yönlendiriyorum: code.google.com/p/autofac/wiki/ExistingApplications
Kaleb Pederson

7

Al Legacy Kanunu ile Etkin Çalışma ve onun tavsiyesini izleyin. Kapsamlı kod adaları inşa ederek başlayın ve yavaş yavaş daha iyi yapılandırılmış bir uygulamaya doğru ilerleyin. Değişikliği toplu olarak yapmaya çalışmak felaket için bir reçetedir.


Bu kitabı seviyorum !!
Martijn Verburg

İyi öneri. Yılların yarısını okuduğum halde, şimdi durumun derinliklerinde olduğumdan çok daha fazlasını alacağımı hayal ediyorum.
Kaleb Pederson

Komik, seçilen cevap temelde kitabı özetler;) Tabii ki Tüyler çok daha ayrıntılı olarak ele alınmaktadır.
Michael Brown

5

IoC'yi tanıtmanın başlıca nedeni modüllerin ayrıştırılmasıdır . Özellikle Java ile ilgili sorun, newoperatörün verdiği olağanüstü güçlü bağlanmadır , bununla birlikte, arama kodunun tam olarak hangi modülü kullanacağını bildiği anlamına gelir.

Bu bilgiyi merkezi bir yere taşımak için fabrikalar tanıtıldı, ancak sonunda ya newsabit bağlamayı koruyan / singleton kullanarak modülleri birbirine bağladınız ya da bir yapılandırma dosyasında okudunuz ve refactoring sırasında kırılgan olan yansıma / Class.forName'i kullandınız. .

Hedefi modüler hale getirmediyseniz, IoC size hiçbir şey vermeyecektir.

Ünite testlerine giriş, büyük olasılıkla bunu değiştirecektir, çünkü test edilmeyen modülleri taklit etmeniz gerekecektir ve bunu işlemenin en kolay yolu ve aynı kodla gerçek üretim modülleri, uygun enjeksiyonu yapmak için bir IoC çerçevesi kullanmaktır. modüller.

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.