Arkadaşlar Merhaba,
Bugün solid prensiplerinin en son harfi olan Dependency Inversion prensibini anlatmaya çalışacağım. Her zaman cümlelerimin sonunda dediğim koda bağımlı kalmayın olayına gelmiş bulunmaktayız. Genellikle insanlar Dependency Inversion prensibini High Level Class Low Level Class lara bağımlı olmamalıdır şeklinde açıklıyorlar. Bana bu cümle açıkcası oldukça karmaşık geliyor. Daha basitleştirilebilir miydi diye düşünmüyor değilim. İşte Bende bunları düşünürken kendimce Dependency Inversion Prensibini anlatayım dedim. Hadi gelen daha detaylı incelemeye başlayalım.
Nedir bu bağımlılık olayı ? Yazılım projelerinde daima class lar ile çalışırız. Nesnelerimizi class lar içerisinde tanımlarız ve bunları bazı yerlerde Newleyerek kullanırız. İşte temel olay burada. Eğer bir class ınızı bir yerde New leyerek kullanıyorsanız bilin ki Siz o classınıza bağımlısınız. Projede bir değişklik yapmak istediniz ve o New leyerek kullandığınız classınız vardı ya onu değilde yerine daha iyi yazdığınız bir classı kullanmak istediniz bilin ki yandınız arkadaşlar. Komple projedeki kod yapınızı değiştirmeniz gerekecek ki buda solid prensiplerine aykırıdır. Solid in bir prensibi derki eğer projeye yeni bir şey ekleyecekseniz ekleyeceğiniz bu şey diğer kodlarınızı etkilememelidir. Peki nasıl çözeceğiz bu durumu ? Bağımlılığı ortadan nasıl kaldıracağız ? İşte bağımlılıkları biz soyut nesneler kullanarak ortadan kaldırıyoruz. Yani arkadaşlar burada İnterface leri kullanıyoruz. Bağımlılıkları ortadan kaldırmayı Dependency Injection denilen teknik ile gerçekleştiriyoruz.
Arkadaşlar şunu kesinlikle unutmayın eğer bir class’ı çıplak görüyorsanız bundan korkun. Bu classlarınızı ilk yazdığınız zaman başınıza dert açmaya bilir ama projeye yeni eklentiler ekleyeceğiniz zaman emin olun ki size sorun çıkartacaklardır. Çıplaklıktan kastım bir abstract nesne den türetilmemeleridir. Projelerinizde class larınızı New lemeden interface leri kullanarak bu classlarınız arasında geçiş yapabilirsiniz. Böylece sürdürülebilir bir yazılım projesi geliştirmiş olursunuz. Hadi gelin basit bir örnekle bu anlattıklarımı daha anlaşılabilir kılalım.
Senaryomuz şu : Patron geldi ve dedi ki Text Dosyasına loglama işlemi yapacağız. Sizde yazılımcı olarak düşündünüz ki Patron hoş diyorda ya proje büyürse ve Text dosyasına değilde Database’e de loglama yapmamızı isterse o zaman ne yapacağız dediniz. İşte böyle bir durumda projenin sürdürülebilir olması için İnterface leri kullanarak bizim ilk başta oluşacak olan Text Dosyasına bağımlılığımızı daha oluşmadan ortadan kaldıracağız. Hadi kodlamaya geçelim bunu.
Ben burada Consol uygulaması açtım ki anlaşılırlığı daha fazla olsun. Görüldüğü üzere biz burada TextLogger classımıza bağımlı durumdayız. Patron’un Bizden artık Database’e loglama yapmak istediğini düşünürsek gidip TextLogger’ı DatabaseLogger olarak değiştirmemiz gerekecekti. Tabi burada örnek olsun diye gösterdim sadece bir yeri değiştireceğiz ama gerçek bir projede bu TextLogger her yerde kullanılmış olabilirdi bunu da değiştirmek çok masraflı olacaktı. İşte şimdi bir İnterface tanımlayarak asıl olayımızı gerçekleştirelim ve bağımlılıktan kurtulalım.
Burada ILogger adinda bir Interface oluşturuyorum ve hem TextLogger hem de DatabaseLogger bu interface ten impelemte ediliyor. Main de ILogger türünde değişken oluşturuyorum ve bunu new lediğim zaman görüyorsunuz TextLogger da olabilir DatabaseLogger da. Burada Interface’i New lemiyoruz ondan implemente edilmiş olan classlarımızı new lemiş oluyoruz. ILogger interface ini kullanarak biz bu iki classımız arasında istediğimiz gibi geçiş yapabiliriz. Normalde eee hani New lersek bağımlı oluyorduk diyebilirsiniz. Arkadaşlar burası son nokta burada hangi tür ile çalışacağımızı söylemek zorundayız. Ancak biz bunu burada böyle New leyerek değilde IoC Containerları kullanarak bu atama işlemini gerçekleştiriyoruz.
Bu yazımında sonuna gelmiş bulunmaktayız. Umarım sizlere faydalı olabilmişimdir. Kendinize iyi bakın Koda Bağımlı Kalmayın 😉 diyorum Arkadaşlar.