Dependency Inversion Principle



Dependency Inversion Principle

Solid prensiblerinin sonuncusu olan DIP de amaçlanan kural üst ve alt sınıfların bağlılığını tersine çevirmektir. Aşağıdaki iki madde ile DIP kuralını tanımlayabiliriz.
  • Üst sınıflar alt seviye sınıflara bağlı olmamalı abstraction veya interface aracılığı ile ilişkileri sağlanmalıdır.
  • Detaylar abstraction'a bağlı olmalı, abstractionlar detaylara bağlı olmamalıdır.
Çoğu projede üst sınıflar alt sınıflara bağlı şekilde çalışmaktadır. Alt sınıflarda bir değişiklik yaptığımız zaman bağımlılık dolayısı ile bu değişiklik üst sınıfı da etkilemektedir. Daha ileri düşünürsek bu üst sınıf bağlı olduğu diğer üst sınıfı da etkileyebilir ve projemizin bütün yapısını bozabilir. Ayrıca bu durum reusability içinde bir engel oluşturmaktadır.

Bu karmaşıklığı engellemek için DIP'yi projelerimize uygulamamız gerekir. Basit bir örnek vermek gerekirse saatinizin pili bitti ve bir saatçiye gittiniz. Saatçi pil saate bağlı olduğu için komple saati değiştirmemiz gerektiğini söyledi. Çok saçma bir durum. Bu yüzden DIP bunun için çıkmıştır yani alt modül üst modüle bağlı olsun ama bu bağımlılık üst modülü etkilemesin.

Detaylı bir şekilde aşağıdaki örneği inceleyebiliriz.





Şimdi bir mail gönderimi ile ilgili bir sınıfımız var ve bu sınıf mailleri Gmail sunucularını kullanarak gönderiyor. İlk bakışta yazdığımız kod herhangi bir sıkıntı oluşturmuyor. Belli bir süre sonra yeni bir istek geliyor ve Exchange hesapları ile mail yollanması isteniyor. Bu sefer tüm mail altyapısını değiştirmek gerekir ve bu oldukça zor olacaktır.

Bu mimaride ana modül olan MailOperations sınıfı yardımcı sınıf olan GmailService'e bağımlı bir haldedir. Biz Exchange hesapları ile mail yollamak istediğimizde değiştireceğimiz sınıf ana sınıfımız olacaktır. Yani bir nevi patlayan bir ampülü değiştirmek için bütün elektrik tesisatını değiştirmek zorunda kalacağız. Bunun için mimariyi yeniden düzenlersek aşağıdaki gibi bir yapı kurabiliriz.



Artık ana sınıfımız yardımcı sınıflara değil interface'e bağlı hale gelmiş oldu. Yardımcı sınıflara olan bağımlılığını bitirmiş olduk. Artık hangi mail sunucusunu kullanmak istersek ana sınıfımıza bunu söylememiz yeterli olacaktır. Yani ampul patladığında yeni bir ampül alıp yerine takmak yeterli olacaktır.

Bu mimaride istediğimiz zaman istediğimiz sınıfla çalışma konusuna gelirsek burada bilmemiz gereken  Dependency Injection ve  IoC konularıdır ve bunları uygulamaktır.


Yorumlar