send

info@yesilbilisim.net

logo

Dependency Injection (DI) Ve Dependency Inversion Principle (DIP) Nedir?

schedule

2022-10-07

Bu makalemde Dependency Injection ve Dependency Inversion Principle konularından bahsettim, keyifli okumalar…

Dependency

Dependency Nedir?

Farz edelim ki A adında bir sınıfımız var. Ve bu A sınıfı, B sınıfındaki metotları kullanıyor. Yani A sınıfı, B sınıfına dayanır. İşte bu duruma dependency (bağımlılık) denir. A sınıfındaki bir işlemin olması için B sınıfından bir örnek veya kopya barındırması gerekir.

Injection

Dependency Injection Nedir ?

Dependency Injection genel anlamda metotla bağımlılığın objesini oluşturmak yerine bu bağımlılığın objesini metoda parametre olarak eklemek anlamına gelir.

Obje

Dependency Inversion Principle Nedir?

Dependency Inversion Principle, somut bir sınıfı yerine soyut bir sınıfı tercih eder. Böylece alt sınıftaki değişiklik üst sınıfı bozmaz çünkü arada bir soyut sınıf vardır. Ayrıca Dependency Inversion Principle, SOLID prensiplerinden biridir.

Bu konuyu daha anlaşılabilir olması için bir örnek yapalım.

Örnek Kod 1

Oluşturduğumuz bu kodun 2 kötü yanı var. Birincisi User sınıfımıza unit test yazmamız nerdeyse imkansız çünkü MySqlDatabase instance'ına bağımlıyız. Ve bu instance test yazarken taklit edilemiyor. İkincisi ise MySqlDatabase'i sabit kodladığımız için başka bir database kullanmak istersek bunu yapamayız.

İlk sorunumuzu çözmek için Dependency Injection kullanacağız.

Örnek Kod 2

User sınıfımızın yapıcı metoduna MySqlDatabase parametresi ekleyerek sınıfımızı bu bağımlılıktan kurtarmış olmakla beraber artık User sınıfımıza unit test yazılabilir hale getirdik. Sonuç olarak User sınıfımızı oluşturduğumuzda bir MySqlDatabase instance'ı pass etmemiz gerekiyor.

İlk sorunumuzu çözdük. Şimdi sıra geldi ikinci sorunumuza. Burada devreye Dependency Inversion Principle giriyor.

Örnek Kod 3

Bir Database soyut sınıfı oluşturduk ve bu sınıfı iki database sınıfımıza da implemente ettik. Böylece database sınıflarıyla User sınıfımız arasında bir soyut sınıf oluşturmuş olduk. User sınıfımız artık somut bir sınıf yerine soyut bir sınıfa bağımlı oldu. Artık User sınıfımıza rahatlıkla MySqlDatabase ve OracleDatabase sınıfımızın instance'ını pass edebiliriz.

Dependency Injection Avantajları Nelerdir?

Kodumuzun bağımlılığını azaltır. Okunurluluğu arttırır. Test edilebilir hale getirir.

Dependency Injection Uygulamanın Diğer Bir Yolu Nedir?

Dependency Injection, yapıcı metodun yanı sıra setter metot ile de yapılabilir.

Örnek Kod 4

Kodumuza bir setter metot yazarak ve bunu dışarıya açarak database'imizi inject edebiliriz.

Kaynakça:

© 2021 Yeşil Bilişim