Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Dependency Injection



  May 21, 2019    Labels:,,,,,,,, 

Nesneye dayalı programlamada gerçek dünya nesnelerinin yazılıma taşınması amaçlanır. Gerçek nesneler birbirini kullanan, birbirine bağımlı olan varlıklardır. Gerçek hayattan kumanda ve televizyon gibi bir örnek verilebilir. Gerçek dünya nesnelerini yazılıma taşıdığımızda da nesnelerimizin arasında bir bağ yani bağımlılık olduğunu görebiliriz. Bu durum yazılım sistemimizde istemediğimiz bir durumdur çünkü mesela televizyonda yaptığımız bir değişiklik kumandayı da etkileyeceğinden fazladan kod düzenlemesi ve test ihtiyacı doğurur. Bu yüzden solid prensiplerinden biri olan açıklık kapalılık prensibi kodun değişime kapalı ama genişletmeye açık olduğunu söyler. Sistemimizde bir değişiklik yapma ihtiyacı duyduğumuzda kodumuzu değiştirmemeli, yeni kodlar eklemeliyiz. Bu şekilde birbirine bağımlı olan parçaları daha az etkiler, problemleri en aza indiririz. Bunu yapmak için nesneye yönelimli programlamanın temellerinden olan polimorfizm'i kullanarak soyut bir şekilde kod yazmalıyız. Bunu yaptığımızda tek başına problemimizi çözmez. Gerekli unsurlardan biri de Dependency Injection'dur. Bu yöntem ile bağımlılıklarımızı dışarıdan enjekte edebiliriz ve bağımlılıklar konusunda esneklik kazanabiliriz. 
Örneğin bir yazdır sınıfımızın olduğunu düşünelim. Yazdırma işlemi bir yazıcıya da olabilir bir excel'e de olabilir bir pdf'e de olabilir. Kullanıcının ilk etapta bir excel dosyasına çıktı almak istediğini düşünelim. Belli bir süre sonra değişen ihtiyaçlar doğrultusunda kullanıcı bir de pdf dosyasına çıktı almak isteyebilir. Bu durumda bizim kodda herhangi bir değişiklik yapmadan sadece pdf çıktısı almak için gerekli kodları ekleyerek güncellememizi yapmamız gerekir. Burada işlemin pdf ile mi yoksa excel ile mi gerçekleşeceğini de kodda belirlemek ve somut bir bağımlılık yaratmak yerine dışarıdan enjekte ederek soyut bir şekilde belirlemeliyiz.

Dependency Injection'un Temel Amaçları
  • Bağımlılıkların somut bir şekilde belirlenmesi yerine dışarıdan soyut bir şekilde belirlenmesi
  • Kaynak kodda değişikliğe ve yeniden derlemeye ihtiyaç duyulmaması
  • Bakımın ve güncellemelerin daha kolay yapılabilmesi
  • Bağımlılıkların tek bir noktada tasarlanması ve yönetilmesi
  • Bağımlılıklardan dolayı oluşan hataların en aza indirilmesi



interface IYazdir {
    
    public void yazdir();
}

class Excel implements IYazdir {
    
    public void yazdir() {
        System.out.println("Excel ile yazdırıldı!");
    }
}

class PDF implements IYazdir {
    
    public void yazdir() {
        System.out.println("PDF ile yazdırıldı!");
    }
}

class AySonuRaporu{
    
    IYazdir yazdirma;
    
    public AySonuRaporu(IYazdir yazdirma) {
        this.yazdirma = yazdirma;
    }
    
    public void aySonuRaporuCiktiAl() {
        yazdirma.yazdir();
    }
}

public class Test{

     public static void main(String []args) throws Exception{
         
        //Configurasyon dosyasından belirlediğimiz tür dışarıdan alınır
        //Alınan tür nesneye enjekte edilir
        //Burada configurasyon dosyasından okuma işlemleri yapılabilir
        //Ancak bu işin kalıplaşmış frameworkleri vardır. Örn spring
        //Spring burada bizim için configurasyonda belirttiğimiz türü enjekte eder
        //Konfigurasyon dosyasında türü pdf veya excel olarak değiştirerek kodda herhangi bir değişiklik yapmadan güncelleme yapabiliriz.
        //Örneğin bir word tipi eklendiğinde Word sınıfı yazılır ve konfigurasyon dosyasında tip word seçilir
        //Hiç bir kod değişikliği yapılmadığı için çok az test ihtiyacı doğar
        AySonuRaporu aySonuRaporu = new AySonuRaporu(new PDF());
        aySonuRaporu.aySonuRaporuCiktiAl();
     }
}

PDF ile yazdırıldı!

No comments:

Post a Comment