Nesne yönelimli programlama, stil kuralları ve hemen hemen her şeyle ilgili sık karşılaştığınız temel sorun. Çok yaygın soyutlama yapmak ve çok fazla dolaylılık eklemek ve genellikle iyi teknikleri aşırı ve yanlış yerlerde uygulamak mümkündür.
Uyguladığınız her desen veya diğer yapı karmaşıklık getirir. Soyutlama ve dolaylı bilgi etrafa saçılır, bazen alakasız ayrıntıları yoldan çıkarır, ancak eşit olarak bazen neler olduğunu tam olarak anlamayı zorlaştırır. Uyguladığınız her kural, en iyi yaklaşım olabilecek seçenekleri göz ardı ederek esneklik getirir.
Mesele, işi yapan, sağlam, okunabilir ve bakımı kolay kod yazmaktır. Siz bir yazılım geliştiricisiniz - fildişi kule üreticisi değil.
İlgili Bağlantılar
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
Muhtemelen en basit bağımlılık enjeksiyon şekli (gülmeyin) bir parametredir. Bağımlı kod verilere bağlıdır ve bu veri parametrenin geçirilmesi yoluyla enjekte edilir.
Evet, aptalca ve nesneye yönelik bağımlılık enjeksiyonuna değinmiyor, ancak işlevsel bir programcı size (birinci sınıf işlevleriniz varsa) ihtiyacınız olan tek tür bağımlılık enjeksiyonu olduğunu söyleyecektir. Buradaki nokta önemsiz bir örnek almak ve olası sorunları göstermek.
Bu basit geleneksel işlevi ele alalım - C ++ sözdizimi burada önemli değil, ama bir şekilde hecelemek zorundayım ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
Ben "Merhaba Dünya" metni ayıklamak ve enjekte etmek istiyorum bir bağımlılık var. Yeterince kolay...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
Bu orijinalden daha esnek değil mi? Peki ya çıktının unicode olması gerektiğine karar verirsem. Muhtemelen std :: cout'tan std :: wcout'a geçmek istiyorum. Ama bu benim dizeleri char değil, wchar_t olması gerektiği anlamına gelir. Ya her çağıranın değiştirilmesi gerekir, ya da (daha makul olarak) eski uygulama, dizeyi çeviren bir adaptör ile değiştirilir ve yeni uygulamayı çağırır.
Bu, orijinali tutsaydık, gerekli olmayacak bakım işi.
Ve önemsiz görünüyorsa, Win32 API'den bu gerçek dünya işlevine bir göz atın ...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
Bu 12 "bağımlılık" ile başa çıkmak. Örneğin, ekran çözünürlükleri gerçekten çok büyük olursa, 64 bit koordinat değerlerine ve CreateWindowEx'in başka bir sürümüne ihtiyacımız olabilir. Ve evet, hala asılı olan eski bir sürüm var, muhtemelen sahnelerin arkasındaki yeni sürüme eşleştiriliyor ...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
Bu "bağımlılıklar" sadece orijinal geliştirici için bir sorun değildir - bu arayüzü kullanan herkes bağımlılıkların ne olduğunu, nasıl belirtildiklerini ve ne anlama geldiklerini araştırmalı ve uygulamaları için ne yapmaları gerektiğini incelemelidir. Burası "mantıklı temerrüt" kelimelerinin hayatı çok daha kolaylaştıracağı yerdir.
Nesneye yönelik bağımlılık enjeksiyonu prensipte farklı değildir. Bir sınıf yazmak, hem kaynak kodu metninde hem de geliştirici zamanında bir ek yüktür ve bu sınıf bazı bağımlı nesne özelliklerine göre bağımlılıklar sağlamak için yazılırsa, bağımlı nesne, bir gereksinim olsa bile bu arabirimi desteklemeye kilitlenir o nesnenin uygulanmasını değiştirmek.
Bunların hiçbiri bağımlılık enjeksiyonunun kötü olduğunu iddia etmek olarak okunmamalıdır. Ancak herhangi bir iyi teknik aşırı ve yanlış yerde uygulanabilir. Her dizenin çıkarılması ve bir parametreye dönüştürülmesi gerekmediği gibi, her düşük seviyeli davranışın da üst düzey nesnelerden çıkarılması ve enjekte edilebilir bir bağımlılığa dönüştürülmesi gerekmez.