Dagger 2 ve Android Dependency Injection — 1


Dagger, Square şirketi tarafından geliştirilen Dependency Injection kütüphanesidir. Daha sonra Google tarafından bu proje forklanarak Dagger 2.0 versiyonu geliştirilmiştir. Bu yazı dizisinde Dagger 2 ve Android uygulamalarımızda kullanım örneğini göreceğiz. Dagger 2'den bahsetmeden önce Dependency Injection’dan bahsetmemizde fayda var.

Dependency injection’ın temelinde yatan mantık, sınıfların birbirine olan bağlılığını azaltmaktır. Bir sınıfın oluşturulma sorumluluğu başka bir sınıf tarafından üstlenilmişse bu bizim için bir sorun haline gelmeye başlayabilir. Fazla da uzatmadan birkaç örnekle Dependency Injection’dan bahsedip Dagger 2'nin implementasyonuna geçmek istiyorum. Çünkü Dependency Injection ile alakalı Türkçe ve İngilizce bir çok blog, tutorial vs. mevcut.

Dependency Injection

Dependency Injection’u motor ve araba örneği ile anlatabiliriz. Günlük hayatımızda arabanın çalışması için motora ihtiyacı vardır. Programlamada da Araba nesnesini kullanarak arabayı çalıştırmak için motor nesnesine ihtiyacımız vardır.

Motor sınıfı

Araba sınıfı

Main sınıf

Kod yapısına baktığımızda Car ve Engine sınıfları arasında direkt bağımlılık var. Car sınıfı Engine sınıfının oluşturulmasından sorumludur. O yüzden bu kötü bir kod yapısı. Bunu düzeltelim o halde. Araba sınıfından motor nesnesini yaratma sorumluluğunu kaldırarak başlayalım.

Motor nesnesini araba sınıfına parametre olarak vererek, araba sınıfının üzerindeki motor nesnesi oluşturma sorumluluğunu kaldırmış olduk. Böylece iki sınıf arasındaki bağımlılığı çözmüş olduk.

Bağımlılığı kaldırmış olsak da tam olarak yapıyı düzelttik diyemeyiz. Hala bir yanlışlık var. Benzinli, dizel veya LPG gibi hangi çeşit motor kullanacağız? LPG motor kullanıyorsak parametre olarak LPGEngine mi vereceğiz? Peki LPGEngine sınıfı oluşturduğumuzu ve kullandığımızı varsayalım.

Eğer benzinli motor kullanacaksak tekrar bu sınıfa gidip motor tipini değiştirmemiz gerekiyor. Bu şekilde her seferinde motoru kullandığımız tüm sınıfları açıp tek tek hepsini değiştirmemiz gerekiyor. Bu da doğru bir kod yapısı değil. Bunu çözmek için de arayüzleri oluşturuyoruz.

Motor sınıfının yapması gereken 2 işlem var. turnOn() ve turnOff(). Motor tipi ne olursa olsun bu iki işlemi uygulamak zorunda. Sadece bu işlemleri uygulayış şekilleri birbirinden farklıdır.

Kazançlarımıza bakalım. Artık Araba sınıfının bir nesne oluşturulma sorumluluğu yok, bunu parametre olarak dışarıdan alıyor. Yani Dependecy ortadan kalktı. Ve aynı zamanda tek bir tip motoru parametre olarak almıyor. Onun yerine parametre olarak bir Engine interface’i alıyor. Kullanımı da şu şekilde;

Daha önce yaşadığımız sorun neydi ? Eğer farklı bir motor kullanılmak isterse Araba sınıfına gidip parametresini değiştirmek zorunda kalıyorduk. Yukarıdaki kod parçasında benzinli motor kullandık. Eğer LPG motor kullanmak istesek sadece main sınıfta LPG motor oluşturup araba sınıfına parametre olarak veriyoruz.

Çünkü tüm motorlar Engine arayüzüne sahip. Ve araba sınıfı parametre olarak da bu arayüzü alıyor. Eğer yeni teknoloji bir motor çıkarsa ve projemizde o motoru kullanmak istersek sadece yapmamız gereken Engine arayüzünü implement etmek ve bu motoru kullanmak.

Dependency Injection’ı toparlayalım. Birbirine bağımlı sınıflar oluşturmaktan kaçınmamız gerekiyor. Çünkü büyük projelerde 2 değil 50 sınıf oluşunca ve birbirine bağımlılıklarını sıkı tutarlarsa, bir sınıfı değiştirdiğinizde, gidip tüm kullanılan yerleri değiştirmeniz gerekiyor. Böylece projeyi yapıp bitirdikten sonra dönüp projede birşeyi değiştirmek eziyet haline geliyor. 2. ve bana göre en önemli yapılardan biri de sınıf yerine arayüz programlayın. Yapınızı arayüzler üzerine kurun. Böylece projenize yeni bir özellik eklemek isterseniz varolan arayüzleri kullanarak tüm yapıyı değiştirmeniz gerekmez.

Dagger 2 kütüphanesini kullanmaya başlamadan önce Dependency Injection’u iyice anlamamız gerekiyor. Çünkü kütüphanenin kullanım amacı bağımlılıkları azaltarak kod kalitesini arttırmak.

Sıradaki yazımda Android uygulamalarımızda Dagger 2 kullanımından bahsedeceğim. Dagger 2 kullanımına geçmeden Dependency Injection’ı iyi bir şekilde oturtmuş olmamız gerektiğini tekrar hatırlatmakta fayda var.